一台服务器多实例mysql做主从复制

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介:

在一台服务器上开两个端口的mysql(3306、3307),做成主从复制环境

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
1)安装mysql(安装过程这里就不做过多介绍)
参考:http: //www .cnblogs.com /kevingrace/p/6109679 .html
  
本文在一台服务器上做主从实验
主库:172.29.16.24:3306
从库:172.29.16.24:3307
  
主从库的安装目录分别为 /usr/local/mysql3306 /usr/local/mysql3307
主从库的数据目录分别为 /data/mysql3306 /data/mysql3307
主从库的登录密码都为123456
  
两个实例的my.cnf里不一样的配置部分
端口不一样!另外:server- id 一定不能一样,最好用端口号来标明server- id ,一个是3306,一个是3307
其他内容配置一样,主库一定要开启binlog日志功能,从库可以开启,也可以不开启)
[root@radius01 ~] # cat /usr/local/mysql3306/my.cnf |grep mysql3306
socket =  /usr/local/mysql3306/var/mysql .sock
socket =  /usr/local/mysql3306/var/mysql .sock
basedir =  /usr/local/mysql3306/
datadir =  /data/mysql3306/data
pid- file  /data/mysql3306/data/mysql .pid
log_error =  /data/mysql3306/data/mysql-error .log
slow_query_log_file =  /data/mysql3306/data/mysql-slow .log
  
[root@radius01 ~] # cat /usr/local/mysql3307/my.cnf |grep mysql3307
socket =  /usr/local/mysql3307/var/mysql .sock
socket =  /usr/local/mysql3307/var/mysql .sock
basedir =  /usr/local/mysql3307/
datadir =  /data/mysql3307/data
pid- file  /data/mysql3307/data/mysql .pid
log_error =  /data/mysql3307/data/mysql-error .log
slow_query_log_file =  /data/mysql3307/data/mysql-slow .log
  
注意分别授权
[root@radius01 ~] # chown -R mysql.mysql /usr/local/mysql3306
[root@radius01 ~] # chown -R mysql.mysql /usr/local/mysql3307
[root@radius01 ~] # chown -R mysql.mysql /data/mysql3306/
[root@radius01 ~] # chown -R mysql.mysql /data/mysql3307
  
启动主从库
[root@radius01 ~] # nohup /usr/local/mysql3306/bin/mysqld_safe --datadir=/data/mysql3306/data --pid-file=/data/mysql3306/data/mysql.pid &
[root@radius01 ~] # nohup /usr/local/mysql3307/bin/mysqld_safe --datadir=/data/mysql3307/data --pid-file=/data/mysql3307/data/mysql.pid &
[root@radius01 ~] # lsof -i:3306
COMMAND   PID  USER   FD   TYPE DEVICE SIZE /OFF  NODE NAME
mysqld  28617 mysql   19u  IPv4 838860      0t0  TCP *:mysql (LISTEN)
[root@radius01 ~] # lsof -i:3307
COMMAND   PID  USER   FD   TYPE DEVICE SIZE /OFF  NODE NAME
mysqld  29538 mysql   19u  IPv4 839401      0t0  TCP *:opsession-prxy (LISTEN)
  
注意,当一台服务器上安装了多个实例的mysql的时候,直接登录mysql的时候,记住要在登录命令中跟上对应的sock路径,如下:
[root@radius01 ~] # /usr/local/mysql3306/bin/mysql -p123456 -S /usr/local/mysql3306/var/mysql.sock
......
mysql>  select  @@port;
+--------+
| @@port |
+--------+
|   3306 |
+--------+
1 row  in  set  (0.00 sec)
  
[root@radius01 ~] # /usr/local/mysql3307/bin/mysql -p123456 -S /usr/local/mysql3307/var/mysql.sock
......
mysql>  select  @@port;
+--------+
| @@port |
+--------+
|   3307 |
+--------+
1 row  in  set  (0.00 sec)
------------------------------------------------------------------------------------------------------------------------
如果不跟上对应的sock路径,直接登录的话会报错:
[root@radius01 ~] # /usr/local/mysql3306/bin/mysql -p123456
ERROR 2002 (HY000): Can 't connect to local MySQL server through socket ' /var/lib/mysql/mysql .sock'
这样,如果你如下做软链接:
[root@radius01 ~] # ln -s /usr/local/mysql3306/var/mysql.sock /var/lib/mysql/mysql.sock
或者
[root@radius01 ~] # ln -s /usr/local/mysql3307/var/mysql.sock /var/lib/mysql/mysql.sock
  
那么这样操作之后,无论是登录3306端口的mysql,还是登录3307端口的mysql,里面的操作都是一样的,即这样就分不清两个端口的mysql实例了!
所以还是在登录各个端口的mysql实例时要跟上对应的sock路径!
 
2)部署主从复制环境
先在主库上操作:
[root@radius01 ~] # /usr/local/mysql3306/bin/mysql -p123456 -S /usr/local/mysql3306/var/mysql.sock
......
mysql> GRANT REPLICATION SLAVE ON *.* TO  'repl' @ '172.29.16.%'  IDENTIFIED BY  'mycatms' ;
mysql> flush privileges;
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000015 |      199 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row  in  set  (0.00 sec)
  
  
接着在从库(即33077端口)上设置主从复制
先在从库上验证下是否能使用授予的权限连接主库
[root@radius01 ~] # /usr/local/mysql3307/bin/mysql -u repl -h 172.29.16.24 -pmycatms -S /usr/local/mysql3306/var/mysql.sock
.....
mysql>  select  @@port;
+--------+
| @@port |
+--------+
|   3306 |
+--------+
1 row  in  set  (0.00 sec)
  
然后进行主从复制设置
[root@radius01 ~] # /usr/local/mysql3307/bin/mysql -p123456 -S /usr/local/mysql3307/var/mysql.sock 
.......
mysql>  select  @@port;
+--------+
| @@port |
+--------+
|   3307 |
+--------+
1 row  in  set  (0.00 sec)
mysql> stop slave;
mysql> reset slave;
mysql> change master to master_user= 'repl' , master_password= 'mycatms' , master_host= '172.29.16.24' ,master_port=3306, master_log_file= 'mysql-bin.000015' ,master_log_pos=199;
mysql> start slave;
mysql> show slave status \G;
*************************** 1. row ***************************
                Slave_IO_State: Waiting  for  master to send event
                   Master_Host: 172.29.16.24
                   Master_User: repl
                   Master_Port: 3306
                 Connect_Retry: 60
               Master_Log_File: mysql-bin.000015
           Read_Master_Log_Pos: 199
                Relay_Log_File: mysql-relay-bin.000002
                 Relay_Log_Pos: 283
         Relay_Master_Log_File: mysql-bin.000015
              Slave_IO_Running: Yes
             Slave_SQL_Running: Yes
.......
.......
-------------------------------------------------------------------------------------------------------------------------------------
如果出现下面报错:
Fatal error: The slave I /O  thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different  for  replication to work.
  
原因分析:
mysql 5.6的复制引入了uuid的概念,各个复制结构中的server_uuid得保证不一样,但是查看到直接copy  data文件夹后server_uuid是相同的,show variables like  '%server_uuid%' ;     
也就是说:
我的实验环境中的3306端口的mysql实例和3307端口的mysql实例的uuid是一样的导致的,因为我是直接复制的data数据目录。如下查看:
[root@radius01 ~] # /usr/local/mysql3306/bin/mysql -p123456 -S /usr/local/mysql3306/var/mysql.sock
.........
mysql> show variables like  '%server_uuid%' ;
+---------------+--------------------------------------+
| Variable_name | Value                                |
+---------------+--------------------------------------+
| server_uuid   | 5509fe69-96b6-11e7-aef5-aaafa07a2e23 |
+---------------+--------------------------------------+
1 row  in  set  (0.00 sec)
  
[root@radius01 ~] # /usr/local/mysql3307/bin/mysql -p123456 -S /usr/local/mysql3307/var/mysql.sock
......
mysql> show variables like  '%server_uuid%' ;
+---------------+--------------------------------------+
| Variable_name | Value                                |
+---------------+--------------------------------------+
| server_uuid   | 5509fe69-96b6-11e7-aef5-aaafa07a2e23 |
+---------------+--------------------------------------+
1 row  in  set  (0.00 sec)
  
解决办法:
找到3306端口和3307端口的data文件夹下的auto.cnf文件,直接删除掉,然后重启各自的mysql即可!重启后,可以再次生成auto.conf文件(重新生成后的uuid就不一样了)
[root@radius01 ~] # rm -rf /data/mysql3306/data/auto.cnf
[root@radius01 ~] # rm -rf /data/mysql3307/data/auto.cnf
[root@radius01 ~] # nohup /usr/local/mysql3306/bin/mysqld_safe --datadir=/data/mysql3306/data --pid-file=/data/mysql3306/data/mysql.pid &
[root@radius01 ~] # nohup /usr/local/mysql3307/bin/mysqld_safe --datadir=/data/mysql3307/data --pid-file=/data/mysql3307/data/mysql.pid & 
[root@radius01 ~] # cat /data/mysql3306/data/auto.cnf
[auto]
server-uuid=f6a726d2-96fd-11e7-b0c8-aaafa07a2e23
[root@radius01 ~] # cat /data/mysql3307/data/auto.cnf
[auto]
server-uuid=fc6ee68c-96fd-11e7-b0c8-aaafa07a2e23
-------------------------------------------------------------------------------------------------------------------------------------
  
数据同步测试:
在主库里写入新数据
[root@radius01 ~] # /usr/local/mysql3306/bin/mysql -p123456 -S /usr/local/mysql3306/var/mysql.sock
mysql> create database wangshibo;
mysql> use wangshibo;
mysql> create table tehui(
     ->  id  int not null primary key,
     -> name varchar(10));
mysql> insert into tehui values(1, "huanhuan" );
mysql> insert into tehui values(11, "meimei" );
mysql>  select  * from tehui;
+----+----------+
id  | name     |
+----+----------+
|  1 | huanhuan |
| 11 | meimei   |
+----+----------+
2 rows  in  set  (0.00 sec)
  
在从库查看是否已同步
[root@radius01 ~] # /usr/local/mysql3307/bin/mysql -p123456 -S /usr/local/mysql3307/var/mysql.sock
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
test                |
| wangshibo          |
+--------------------+
5 rows  in  set  (0.00 sec)
  
mysql> use wangshibo;
mysql> show tables;
+---------------------+
| Tables_in_wangshibo |
+---------------------+
| tehui               |
+---------------------+
1 row  in  set  (0.00 sec)
  
mysql>  select  * from tehui;
+----+----------+
id  | name     |
+----+----------+
|  1 | huanhuan |
| 11 | meimei   |
+----+----------+
2 rows  in  set  (0.00 sec)
***************当你发现自己的才华撑不起野心时,就请安静下来学习吧***************
本文转自散尽浮华博客园博客,原文链接:http://www.cnblogs.com/kevingrace/p/6129089.html ,如需转载请自行联系原作者
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
15天前
|
弹性计算 大数据 数据处理
阿里云服务器实例哪些属于入门级,哪些是企业级?有何区别?
阿里云服务器的实例规格从级别上来说分为入门级和企业级,从实例规格种类上来说,又分为突发性能型、共享型、计算型、通用型、内存型、大数据型等,2024年截止目前在阿里云的活动中,可选的云服务器实例规格有轻量应用服务器、经济型e、通用算力型u1、计算型c7、计算型c7a、计算型c8a、计算型c8y、通用型g7、通用型g7a、通用型g8a、通用型g8i、通用型g8y、内存型r7、内存型r8y等,有的新手用户不是很清楚2024年阿里云活动中的云服务器实例哪些属于入门级,哪些是企业级?有何区别?下面根据官方的各种资料介绍为大家解答下这些疑问,帮助您能更清楚地了解阿里云服务器,快速找到自己对云服务器产品的需
阿里云服务器实例哪些属于入门级,哪些是企业级?有何区别?
|
2天前
|
SQL canal 运维
MySQL高可用架构探秘:主从复制剖析、切换策略、延迟优化与架构选型
MySQL高可用架构探秘:主从复制剖析、切换策略、延迟优化与架构选型
|
2天前
|
存储 缓存 安全
阿里云服务器实例规格选型参考,根据上云场景选择适合自己的实例规格
对于很多新手用户来说,在初次选择阿里云服务器实例规格的时候,面对众多实例规格往往不知道如何选择,因为云服务器实例规格不同,价格也不一样,本文通过一些常见的选型场景推荐,便于大家在选择云服务器实例规格时做个参考。
阿里云服务器实例规格选型参考,根据上云场景选择适合自己的实例规格
|
3天前
|
运维 负载均衡 关系型数据库
MySQL高可用解决方案演进:从主从复制到InnoDB Cluster架构
MySQL高可用解决方案演进:从主从复制到InnoDB Cluster架构
|
3天前
|
编解码 缓存 安全
阿里云目前活动内各云服务器实例规格适用场景与价格参考
目前阿里云的活动中,云服务器有多种不同实例规格可选,实例规格定义了实例的基本属性:CPU和内存(包括CPU型号、主频等),但是不同实例规格所适用的场景是不一样的,价格也有很大差别,有的用户初次选购阿里云服务器可能并不知道这些实例规格的具体适用场景,下面是小编整理汇总的2024年截止目前阿里云的活动中云服务器实例规格适用场景与活动价格,以供参考。
阿里云目前活动内各云服务器实例规格适用场景与价格参考
|
11天前
|
弹性计算 供应链
阿里云服务器付费模式包年包月、按量付费、抢占式实例选择说明
阿里云ECS提供包年包月、按量付费和抢占式实例三种计费方式。选择建议:稳定需求选包年包月,动态需求选按量付费,无状态应用选抢占式实例以降低成本。可结合使用按量付费、预留实例券和节省计划以平衡灵活性和成本。需要资源保障则组合按量付费和资源保障。具体详情和规定可参考阿里云ECS官方文档
40 7
|
11天前
|
设计模式 容灾 关系型数据库
MySQL 主从复制架构
MySQL 主从复制架构
|
11天前
|
弹性计算 关系型数据库 MySQL
|
11天前
|
存储 弹性计算 运维
深度解读:阿里云服务器ECS经济型e实例配置整理和性能参数表
阿里云推出经济型ECS e系列服务器,适用于个人开发者、学生和小微企业。该系列采用Intel Xeon Platinum处理器,支持多种CPU内存配比,性价比高,2核2G3M配置只需99元/年,新老用户不限量购买且续费不涨价。提供相同可用性SLA和安全标准,具备ESSD Entry云盘等企业级特性。适合中小型网站、开发测试和轻量级应用
|
12天前
|
存储 弹性计算 运维
阿里云服务器ECS经济型e实例特点、适用场景和使用常见问题解答
阿里云新推经济型e系列服务器,适用于个人开发者、学生和小微企业。该系列基于Intel Xeon Platinum处理器,提供1:1、1:2、1:4内存比选项,性价比高,不限购,续费不涨价。2核2G3M配置只需99元/年,企业用户2核4G5M服务器199元/年。具备价格优惠、品质保障、充足供应和多样化配置等特点。支持IPv4/IPv6,仅限专有网络VPC。实例规格和性能指标详表见原文,适合中小型网站、开发测试和轻量级应用。更多信息访问阿里云ECS页面。

推荐镜像

更多