云计算运维

Windows Server 2003 - Windows Server 2019 系统工具,Linux系统脚本,Mysql、Nginx、PHP、Redis、K8S、Seafile、Weblogic 、Jenkins、DNS、DHCP、FTP、IIS、Zookeeper、Rabbitmq、Oracle、Tomcat、Mavrn等服务搭建维护,请关注我.

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     |
+--------------------------------------------+-------+
  • 分享:
评论
还没有评论
    发表评论 说点什么