MySQL半同步配置过程
1、定义
是介于异步复制和全同步复制之间的一种复制方式,主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接收到并写到relay log中才返回给客户端。
2、优缺点
(1)优点:有效的提高了数据的安全性,需要等到数据写到从库之后才返回给客户端;
(2)缺点:因为需要等待至少一个从库接收到并写入relaylog中,索引会造成一定的网络延迟,需要在网络延迟较低的环境中使用
3、搭建过程
(1)前提条件:
a、MySQL数据库版本为5.5及以上
b、属性变量have_dynamic_loading的值为YES
c、异步复制已经搭建完成
(2)查看主库和从库上的have_dynamic_loading变量
[root@WB-BLOG mysql_data]# ./mysql_login.sh
mysql-server-3306> SHOW VARIABLES LIKE 'have_dynamic_loading';
+----------------------+-------+
| Variable_name | Value |
+----------------------+-------+
| have_dynamic_loading | YES |
+----------------------+-------+
1 row in set (0.00 sec)
(3)登陆主库,在主库上安装半同步插件
mysql-server-3306> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
Query OK, 0 rows affected (0.01 sec)
mysql-server-3306> SHOW PLUGINS \G
*************************** 43. row ***************************
Name: rpl_semi_sync_master
Status: ACTIVE
Type: REPLICATION
Library: semisync_master.so
License: GPL
43 rows in set (0.00 sec)
#查看输出结果中包括上面的一行,表示半同步插件安装成功
注:如果想卸载半同步插件,可以使用如下命令:
mysql-server-3306> UNINSTALL PLUGIN rpl_semi_sync_master;
(4)登陆从库,安装从库上的半同步插件
mysql-server-3307> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
Query OK, 0 rows affected (0.01 sec)
mysql-server-3307> SHOW PLUGINS;
*************************** 43. row ***************************
Name: rpl_semi_sync_slave
Status: ACTIVE
Type: REPLICATION
Library: semisync_slave.so
License: GPL
43 rows in set (0.01 sec)
注:从库上的半同步插件,也可以使用如下命令完成卸载:
mysql-server-3307> UNINSTALL PLUGIN rpl_semi_sync_slave;
(5)查看插件是否加载成功
主库:
mysql-server-3306> SELECT plugin_name,plugin_status FROM information_schema.plugins WHERE plugin_name LIKE '%semi%';
+----------------------+---------------+
| plugin_name | plugin_status |
+----------------------+---------------+
| rpl_semi_sync_master | ACTIVE |
+----------------------+---------------+
1 row in set (0.00 sec)
从库:
mysql-server-3307> SELECT plugin_name,plugin_status FROM information_schema.plugins WHERE plugin_name LIKE '%semi%';
+---------------------+---------------+
| plugin_name | plugin_status |
+---------------------+---------------+
| rpl_semi_sync_slave | ACTIVE |
+---------------------+---------------+
1 row in set (0.00 sec)
(6)配置并开启主库的半同步复制,然后重启主库
[root@WB-BLOG 3306]# vim my.cnf
#在mysqld段下面添加如下内容:
[mysqld]
plugin-load = rpl_semi_sync_master=semisync_master.so
rpl_semi_sync_master_enabled=1
[root@WB-BLOG 3306]# ./mysqld restart
(7)配置并开启从库的半同步复制,然后重启从库
[root@WB-BLOG 3307]# vim my.cnf
#添加如下内容:
[mysqld]
plugin-load = rpl_semi_sync_slave=semisync_slave.so
rpl_semi_sync_slave_enabled=1
[root@WB-BLOG 3307]# ./mysqld restart
(8)重启从库上的IO线程
mysql-server-3307> STOP SLAVE IO_THREAD;
Query OK, 0 rows affected (0.00 sec)
ysql-server-3307> START SLAVE IO_THREAD;
Query OK, 0 rows affected (0.00 sec)
(9)查看主库和从库上的半同步复制是否在运行
登录主库查看:
mysql-server-3306> SHOW STATUS LIKE 'rpl_semi_sync_master_status';
+-----------------------------+-------+
| Variable_name | Value |
+-----------------------------+-------+
| Rpl_semi_sync_master_status | ON |
+-----------------------------+-------+
登录从库查看:
mysql-server-3307> SHOW STATUS LIKE 'rpl_semi_sync_slave_status';
+----------------------------+-------+
| Variable_name | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | ON |
+----------------------------+-------+
1 row in set (0.00 sec)
上述结果表示主库和从库上的半同步复制运行正常。
(10)验证半同步复制是否正常
验证方法:正常在主库上创建一张表,会立刻返回,耗时0.1s。关闭从库的io线程,然后在主库上执行建表操作,会发现,主库上回阻塞10秒之后才会返回,而这个时间正好和主库上的rpl_semi_sync_master_timeout相同,表示半同步起作用了,主库的DDL操作需要等到从库应用完relaylog之后才返回;
#主库执行:
mysql-server-3307> STOP SLAVE IO_THREAD;
#从库执行:
mysql-server-3306> CREATE TABLE test(id int);
Query OK, 0 rows affected (10.03 sec)
#查看主库上的rpl_semi_sync_maser_timeout
mysql-server-3306> SHOW VARIABLES LIKE 'rpl_semi_sync_master_timeout';
+------------------------------+-------+
| Variable_name | Value |
+------------------------------+-------+
| rpl_semi_sync_master_timeout | 10000 |
+------------------------------+-------+
至此,MySQL的半同步复制搭建完成。
4、半同步搭建中常见问题
(1)主从不能正常同步:和主从同步无法正常复制的排查方法相同
(2)不能正常安装半同步插件
原因1:可能是版本问题
解决办法1:查看MySQL实例的版本,如果版本问题,更换新版本重新安装即可
mysql> SELECT version();
原因2:MySQL的安装目录中未包含用于半同步复制的共享库
解决办法2:找到该版本对应的半同步共享库,然后重新安装