51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

MariaDB 半同步复制

1.安装MYSQL两台服务器

Master:192.168.37.10

Slave:192.168.37.20

  1. 半同步插件介绍

  半同步复制是使用插件实现的,因此必须将插件安装到服务器中才能使它们可用。安装插件后,您可以通过与之关联的系统变量来控制它。在安装关联的插件之前,这些系统变量不可用。
  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     |
+--------------------------------------------+-------+
赞(1)
未经允许不得转载:工具盒子 » MariaDB 半同步复制