mysql主从复制,半同步复制(Semisynchronous Replication)

时间:2022-09-14 14:03:49
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
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
1.搭建一个master对应1个slave (只复制某个数据库)
#######################################
//环境规划
mysql版本:mysql5.5.30
master:10.10.54.154
slave: 10.10.54.155
master上数据库
mysql> show databases;
+ --------------------+
Database            |
+ --------------------+
| information_schema |
| d1                 |
| mysql              |
| performance_schema |
| test               |
+ --------------------+
slave上数据库
mysql> show databases;
+ --------------------+
Database            |
+ --------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+ --------------------+
 
 
//master上修改配置文件,创建用户
1.修改配置文件
shell> vim /etc/my.cnf
[mysqld]
default -storage-engine=myisam
server_id=1 #master上的server_id一定要比slave上的小
log_bin=master_bin
shell> /et/init.d/mysqld restart #重启mysqld
 
2.创建用户,授予复制权限
mysql>  grant  replication slave  on  *.*  to  'repl' @ '10.10.54.%'  identified  by  'slave' ;
mysql> flush  privileges ; #刷新权限
 
 
//slave上修改配置文件
shell> vim /etc/my.vnf
server_id=8
log_bin=slave-bin
replicate_do_db=d1 #只复制与d1数据库相关的操作
 
 
//数据导入
1.master操作
mysql> flush tables  with  read  lock;  #暂时锁住数据库,保证数据的完整性
mysql> mysqldump -uroot -p  --all-databases --flush-logs --master-data=2 > alldatabases.sql
mysql> show master status;
+ -------------------+----------+--------------+------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+ -------------------+----------+--------------+------------------+
| master-bin.000017 |      107 |              |                  |
+ -------------------+----------+--------------+------------------+
mysql> unlock tables;
 
2.slave导入数据
shell> mysql -uroot -pmysql < alldatabases.sql
 
 
//slave上change master操作,查看主从架构
mysql> change master  to  master_host= '10.10.54.154' ,master_user= 'repl' ,master_password= 'slave' ,master_log_file= 'master-bin.000017' ,master_log_pos=107;
mysql> start slave;
mysql> show slave status\G;
*************************** 1. row ***************************
                Slave_IO_State: Waiting  for  master  to  send event
                   Master_Host: 10.10.54.154
                   Master_User: repl
                   Master_Port: 3306
                 Connect_Retry: 60
               Master_Log_File: master-bin.000017
           Read_Master_Log_Pos: 107
                Relay_Log_File: mycentos5-relay-bin.000002
                 Relay_Log_Pos: 254
         Relay_Master_Log_File: master-bin.000017
              Slave_IO_Running: Yes
             Slave_SQL_Running: Yes
 
             
//测试是否只复制d1数据库
A.
测试master上创建新数据库d2
mysql>  create  database  d2;
mysql> show databases;
+ --------------------+
Database            |
+ --------------------+
| information_schema |
| d1                 |
| d2                 |
| mysql              |
| performance_schema |
| test               |
| test1              |
+ --------------------+
查看slave数据库信息
mysql> show databases;
+ --------------------+
Database            |
+ --------------------+
| information_schema |
| d1                 |
| mysql              |
| performance_schema |
| test               |
+ --------------------+
 
B.
在master的d1数据库中新建表
1.
mysql> use d1;
mysql>  create  table  t1(id  int  NOT  NULL , name  varchar (20)  NOT  NULL );
mysql>  insert  into  t1  values (1, 'hello' );
 
2.查看slave的d1数据库内到表
mysql> use d1;
mysql> show tables;
+ --------------+
| Tables_in_d1 |
+ --------------+
| departments  |
| dept_emp     |
| dept_manager |
| employees    |
| salaries     |
| t1           |
| t1_e         |
| titles       |
+ --------------+
测试成功
 
 
 
 
 
2.搭建一个master对应2个slave
##########################################
//环境规划
linux版本:ceontos6.4 mysql5.5.30
master:10.10.54.154
slave: 10.10.54.155 10.10.54.156
#master服务器不是新搭建的,所以需要把master数据库中数据备份到从服务器
 
 
//master修改配置文件,创建用户
1.修改配置文件
shell> vim /etc/my.cnf
[mysqld]
default -storage-engine=myisam
server_id=1
log_bin=master_bin
shell> /et/init.d/mysqld restart
 
2.创建用户,授予复制权限
mysql>  grant  replication slave  on  *.*  to  'repl' @ '10.10.54.%'  identified  by  'slave' ;
mysql> flush  privileges ;
 
 
//slave修改配置文件
两个从服务器上操作一样
shell> vim /etc/my.vnf
server_id=8
log_bin=slave-bin
 
 
//mysqldump导入数据到从服务器
1.master操作
mysql> flush tables  with  read  lock;
mysql> mysqldump -uroot -p  --all-databases --flush-logs --master-data=2 > alldatabases.sql
mysql> show master status;
+ -------------------+----------+--------------+------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+ -------------------+----------+--------------+------------------+
| master-bin.000017 |      107 |              |                  |
+ -------------------+----------+--------------+------------------+
mysql> unlock tables;
 
2.slave操作
两台从服务器上操作一样
shell> mysql -uroot -pmysql < alldatabases.sql
 
 
//slave上执行change master操作,查看主从架构
mysql> change master  to  master_host= '10.10.54.154' ,master_user= 'repl' ,master_password= 'slave' ,master_log_file= 'master-bin.000017' ,master_log_pos=107;
mysql> start slave;
mysql> show slave status\G;
*************************** 1. row ***************************
                Slave_IO_State: Waiting  for  master  to  send event
                   Master_Host: 10.10.54.154
                   Master_User: repl
                   Master_Port: 3306
                 Connect_Retry: 60
               Master_Log_File: master-bin.000017
           Read_Master_Log_Pos: 107
                Relay_Log_File: mycentos5-relay-bin.000002
                 Relay_Log_Pos: 254
         Relay_Master_Log_File: master-bin.000017
              Slave_IO_Running: Yes
             Slave_SQL_Running: Yes
     
 
//测试主从架构是否正常运行
1.master 上创建表
mysql> show databases;
+ --------------------+
Database            |
+ --------------------+
| information_schema |
| d1                 |
| mysql              |
| performance_schema |
| test               |
+ --------------------+
mysql> use d1;
mysql>  create  table  t1(id  int  NOT  NULL , name  varchar (20)  NOT  NULL );
mysql>  insert  into  t1  values (1, 'hello' );
 
2.从服务器上查看表是否同步
mysql> use d1;
msyql>  select  from  t1;
+ ----+-------+
| id |  name   |
+ ----+-------+
|  1 | hello |
+ ----+-------+
 
 
 
3.搭建mysql半复制(Semisynchronous Replication)
//环境规划
mysql版本:5.5.30
master:10.10.54.154
slave:10.10.54.155
#主从环境已经搭建好
 
 
//master上安装半同步复制插件
mysql> install plugin rpl_semi_sync_master soname  'semisync_master.so' ;
Query OK, 0  rows  affected (0.02 sec)
mysql>  set  global  rpl_semi_sync_master_enabled=1;
Query OK, 0  rows  affected (0.00 sec)
mysql>  set  global  rpl_semi_sync_master_timeout=1000;
Query OK, 0  rows  affected (0.00 sec)
mysql> show variables  like  '%semi%' ;
+ ------------------------------------+-------+
| Variable_name                      | Value |
+ ------------------------------------+-------+
| rpl_semi_sync_master_enabled       |  ON     |
| rpl_semi_sync_master_timeout       | 1000  |
| rpl_semi_sync_master_trace_level   | 32    |
| rpl_semi_sync_master_wait_no_slave |  ON     |
+ ------------------------------------+-------+
 
 
//slave上安装插件
mysql> install plugin rpl_semi_sync_slave soname  'semisync_slave.so' ;
mysql>  set  global  rpl_semi_sync_slave_enabled = 1;
mysql> stop slave;
mysql> start slave;
mysql> show variables  like  '%semi%' ;
+ ---------------------------------+-------+
| Variable_name                   | Value |
+ ---------------------------------+-------+
| rpl_semi_sync_slave_enabled     |  ON     |
| rpl_semi_sync_slave_trace_level | 32    |
+ ---------------------------------+-------+
 
 
//测试半同步是否生效
mysql> show  global  status  like  'rpl_semi%' ;
+ --------------------------------------------+-------+
| Variable_name                              | Value |
+ --------------------------------------------+-------+
| Rpl_semi_sync_master_clients               | 1     |
| Rpl_semi_sync_master_net_avg_wait_time     | 0     |
| Rpl_semi_sync_master_net_wait_time         | 0     |
| Rpl_semi_sync_master_net_waits             | 0     |
| Rpl_semi_sync_master_no_times              | 0     |
| Rpl_semi_sync_master_no_tx                 | 0     |
| Rpl_semi_sync_master_status                |  ON     |
| Rpl_semi_sync_master_timefunc_failures     | 0     |
| Rpl_semi_sync_master_tx_avg_wait_time      | 0     |
| Rpl_semi_sync_master_tx_wait_time          | 0     |
| Rpl_semi_sync_master_tx_waits              | 0     |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0     |
| Rpl_semi_sync_master_wait_sessions         | 0     |
| Rpl_semi_sync_master_yes_tx                | 0     |
+ --------------------------------------------+-------+
#测试成功