MariaDB 半同步复制
1.安装MYSQL两台服务器
Master:192.168.37.10
Slave:192.168.37.20
2. 半同步插件介绍
半同步复制是使用插件实现的,因此必须将插件安装到服务器中才能使它们可用。安装插件后,您可以通过与之关联的系统变量来控制它。在安装关联的插件之前,这些系统变量不可用。
MySQL的半同步是通过加载google为MySQL提供的半同步插件 semisync_master.so 和 semisync_slave.so 来实现的。其中前者是master上需要安装的插件,后者是slave上需要安装的插件
MySQL的插件位置默认存放在$basedir/lib/plugin目录下。例如,yum安装的mysql-server,插件目录为/usr/lib64/mysql/plugin。
因为要加载插件,所以应该保证需要加载插件的MySQL的全局变量 have_dynamic_loading 已经设置为YES(默认值就是YES),否则无法动态加载插件。
# 查看have_dynamic_loading
mysql> select @@global.have_dynamic_loading;
+-------------------------------+
| @@global.have_dynamic_loading |
+-------------------------------+
| YES |
+-------------------------------+
# master安装semisync_master.so
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
# slave安装semisync_slave.so
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
# 如果尝试安装插件导致Linux上出现类似于此处所示的错误,则必须安装 libimf:
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
ERROR 1126 (HY000): Can\'t open shared library '/usr/local/mysql/lib/plugin/semisync_master.so'
(errno: 22 libimf.so: cannot open shared object file:No such file or directory)'
# 要验证插件安装,请检查 INFORMATION_SCHEMA.PLUGINS表或使用该SHOW PLUGINS语句.例如:
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
FROM INFORMATION_SCHEMA.PLUGINS
WHERE PLUGIN_NAME LIKE '%semi%';
+----------------------+---------------+
| PLUGIN_NAME | PLUGIN_STATUS |
+----------------------+---------------+
| rpl_semi_sync_master | ACTIVE |
+----------------------+---------------+
3.半同步插件相关的变量
可以通过show global status like '%semi%';
查看相关变量的大概意思.
3.1 master相关的变量:
①.Rpl_semi_sync_master_clients:(状态变量)master所拥有的半同步复制slave的主机数量。
②.Rpl_semi_sync_master_status :(状态变量)master当前是否以半同步复制状态工作(ON),OFF表示降级为了异步复制。
③.rpl_semi_sync_master_enabled:master上是否启用了半同步复制。
④.rpl_semi_sync_master_timeout:等待slave的ack回复的超时时间,默认为10秒。
⑤.rpl_semi_sync_master_trace_level:半同步复制时master的调试级别。
⑥.rpl_semi_sync_master_wait_for_slave_count:master在超时时间内需要收到多少个ack回复才认为此次DML成功,否则就降级为异步复制。该变量在MySQL5.7.3才提供,在此之前的版本都默认为收到1个ack则确认成功,且不可更改。MySQL 5.7.3之后该变量的默认值也是1。
⑦.rpl_semi_sync_master_wait_no_slave:值为ON(默认)或者OFF。ON表示master在超时时间内如果未收到指定数量的ack消息,则会一直等待下去直到收满ack,即一直采用半同步复制方式,不会降级;OFF表示如果在超时时间内未收到指定数量的ack,则超时时间一过立即降级为异步复制。
更官方的解释是:当设置为ON时,即使状态变量Rpl_semi_sync_master_clients中的值小于rpl_semi_sync_master_wait_for_slave_count,Rpl_semi_sync_master_status依旧为ON;当设置为OFF时,如果clients的值小于count的值,则Rpl_semi_sync_master_status立即变为OFF。通俗地讲,就是在超时时间内,如果slave宕机的数量超过了应该要收到的ack数量,master是否降级为异步复制。
该变量在MySQL 5.7.3之前似乎没有效果,因为默认设置为ON时,超时时间内收不到任何ack时仍然会降级为异步复制。
⑧.rpl_semi_sync_master_wait_point:控制master上commit、接收ack、返回消息给客户端的时间点。值为 AFTER_SYNC 和 AFTER_COMMIT ,该选项是MySQL5.7.2后引入的,默认值为 AFTER_SYNC ,在此版本之前,等价于使用了 AFTER_COMMIT 模式。关于这两种模式,见前文对两种半同步类型的分析。
3.2 slave相关的变量:
①.rpl_semi_sync_slave_enabled:slave是否开启半同步复制。
②.rpl_semi_sync_slave_trace_level:slave的调试级别。
4.Master和Slave配置
4.1 Master配置
在Master数据库安装半同步复制插件:
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
修改Master配置 (/etc/my.cnf) 文件并开启半同步复制:
shell> vim /etc/my.cnf
[mysqld]
# 启用binlog功能
log-bin=mysql-bin
binlog_format=row
server_id = 1
# 表示在master上已经开启了半同步复制模式;
rpl_semi_sync_master_enabled=1
# 表示如果主库在某次事务中的等待时间超过10000毫秒,则降级为异步复制模式,不在等待slave从库。如果主库再次探测到slave从恢复了,则会自动切换回半同步复制模式;
rpl_semi_sync_master_timeout=1000
# 查看配置是否成功
mysql> show global 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 |
| rpl_semi_sync_master_wait_point | AFTER_COMMIT |
+------------------------------------+--------------+
4.2 Slave配置
在Slave数据库安装半同步复制插件:
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
修改Slave配置 (/etc/my.cnf) 配置文件:
shell> vim /etc/my.cnf
[mysqld]
log-bin=mysql-bin
server_id=2
read_only
# 半同步复制模式必须在主从节点同时启用,否则主节点默认使用异步复制模式.
rpl_semi_sync_slave_enabled = 1
# 查看配置是否成功
mysql> show global variables like '%semi%';
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| rpl_semi_sync_slave_enabled | ON |
| rpl_semi_sync_slave_trace_level | 32 |
+---------------------------------+-------+
5.查看Master半同步状态
mysql> show global 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 |
| rpl_semi_sync_master_wait_point | AFTER_COMMIT |
+------------------------------------+--------------+
mysql> show global status like '%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 |
+--------------------------------------------+-------+