MySQL半同步复制
除了支持内置的异步复制机制外,MySQL 5.5还为接口提供了一种机制来支持半同步复制。
异步复制的缺点:
默认情况下,MySQL复制是异步复制。主机将事件写入二进制日志,但不知道是否或何时接收并处理了从机。在异步复制机制的情况下,如果主服务器出现故障,则事务已在主服务器上提交,但是很可能这些事务尚未传输到任何从属服务器。假设有一个Master-> Salve故障转移机制,则Slave此时也可能丢失事务。
半同步复制的概念:
i。
当从属主机连接到主服务器时,它可以检查它是否处于半同步复制机制中。
ii。
当在主服务器上启用半同步复制功能时,至少一个从属服务器应启用其功能。这时,将阻止在主服务器上提交事务的线程,直到得知已打开半同步复制的从服务器已接收到该事务的所有事件或等待超时为止。
iii。
当事务的事件已写入其中继日志并已刷新到磁盘时,从设备将通知已接收到它。
iv。
如果等待超时,即未通知主服务器已收到该信息,则主服务器将自动切换到异步复制机制。当至少一个半同步从属服务器出现故障时,主服务器及其从属服务器会自动切换到半同步复制机制。
v。
必须在主服务器和从服务器中都启用半同步复制功能,并且半同步复制将起作用;否则,只有一侧打开,并且仍然是异步复制。
同步,异步和半同步复制的比较:
同步复制:主服务器提交事务,并且直到在所有从属服务器中都提交了事务后,事务才会返回给客户端。缺点:完成交易可能会有很大的延迟。
异步复制:从服务器准备就绪后,它将向主服务器请求二进制日志。缺点:无法保证所有从站都可以接收某些事件。
半同步复制:半同步复制工作的机制介于同步和异步之间。只要从属服务器已接收到该事务的事件并将其记录下来,主服务器的事务提交就被阻止。它不会等待所有从属服务器通知已接收到该事务,而只是接收它,而没有等待它完全执行并提交。
用于半同步复制的控制变量和状态监视变量:
控制变量
变量名
可变范围
动态变量
类型
默认
效果主机
rpl_semi_sync_master_enabled
全局
是
布尔
关闭
主
rpl_semi_sync_slave_enabled
全局
是
布尔
关闭
从属
rpl_semi_sync_master_timeout
全局
是
数字
10000
母版
说明:
rpl_semi_sync_master_enabled用于控制主机是否打开半同步,打开或不打开,将其设置为ON或OFF(1or0)。
rpl_semi_sync_master_timeout用于控制主设备等待通知接收到从设备的时间,即所谓的超时时间。
rpl_semi_sync_slave_enabled用于控制从设备是打开还是关闭半同步,将其设置为ON或OFF(1or0)。
监视半同步复制的状态变量(一些常用)
Rpl_semi_sync_master_clients:查看有多少个启用半同步复制插件的从服务器
Rpl_semi_sync_master_status:检查主服务器上是否正在运行半同步复制。当该值为ON时,表明主机已启用半同步并已通知从机已接收到它。值为OFF时,表示由于超时和其他原因,主服务器尚未启用半同步或未通知。
Rpl_semi_sync_master_no_tx:查看使用半同步复制机制未复制多少个事务。
Rpl_semi_sync_master_yes_tx:查看通过半同步复制机制成功复制了多少个事务。
Rpl_semi_sync_slave_status:检查从属上半同步复制是否正常运行。当该值为ON时,表示从站正在通过半同步复制并且从站I/O正在运行。当它为OFF时,反之亦然。
有关其他信息,请参考:http://dev.mysql.com/doc/refman/5.5/en/index.html
安装半同步复制,配置http://www.linuxidc.com
环境要求:
i。
MySQL5.5或更高版本
ii。
在MySQL上安装插件需要数据库支持动态加载。要检查它是否受支持,请使用以下测试:
mysql \>显示全局变量,例如” have_dynamic_loading”;
+———————-+——-+
| Variable_name \ |价值|
+———————-+——-+
| have_dynamic_loading |是\ |
+———————-+——-+
设置1行(0.00秒)
iii。半同步复制基于复制环境。也就是说,在配置半同步复制之前,已经存在复制环境。
安装:
在母版上执行:
mysql \>安装插件rpl_semi_sync_master SONAME” semisync_master.so”;
在每个从站上执行:
mysql \>安装插件rpl_semi_sync_slave SONAME” semisync_slave.so”;
如果您不知道Plugin目录,请使用以下搜索:
mysql \>显示全局变量,例如” plugin_dir”;
+—————+———————————-+
|变量名|值\ |
+—————+———————————-+
| plugin_dir \\ ub26; |/opt/usr/local/mysql/lib/plugin/|
+—————+———————————-+
检查插件是否正确安装:
mysql \>显示插件;
或
mysql \>从information_schema.plugins中选择*;
配置:
在母版上执行:
mysql \>设置全局rpl_semi_sync_master_enabled = 1;
mysql \> SET GLOBAL rpl_semi_sync_master_timeout = N;
从站执行:
mysql \>设置全局rpl_semi_sync_slave_enabled = 1;
说明:http://www.linuxidc.com
如果在正在运行的Slave上启用半同步复制,则必须先停止Slave I/O并启用半同步,然后再打开Slave I/O。
mysql \>停止从IO_THREAD;开始从IO_THREAD;
如果您不这样做,则从服务器仍将异步复制。
如您所知,如果不将变量设置写入配置文件,则下次重新启动数据库时,它将无效。编写配置文件:
在母版上:
[mysqld]
rpl_semi_sync_master_enabled = 1
rpl_semi_sync_master_timeout = 1000#1秒
从站:
[mysqld]
rpl_semi_sync_slave_enabled = 1
总结:半同步复制的个人感觉是一种维护数据完整性和安全性的策略,尽管它会失去一些性能,但仍然值得。配置非常简单,关键是要了解其工作机制。