MySQL8.0.25使用插件实现主从半同步复制

Posted 白-胖-子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL8.0.25使用插件实现主从半同步复制相关的知识,希望对你有一定的参考价值。

主从半同步复制的作用

  • 默认情况下,mysql的复制功能是异步的,
  • 异步复制可以提供最佳的性能,
  • 主库把binlog日志发送给从库即结束,并不验证从库是否接收完毕。
  • 这意味着当主服务器或从服务器端发生故障时,
  • 有可能从服务器没有接收到主服务器发送过来的binlog日志,
  • 这就会造成主服务器和从服务器的数据不一致,甚至在恢复时造成数据的丢失

MySQL8.0.25配置实现主从半同步

  • 先装功能插件模块,
  • 再启用插件功能,
  • 最后修改配置文件永久生效。

检查插件是否已存在

  • 使用yum或者rpm安装,使用rpm -ql查看包中部署的模块
rpm -ql mysql-server |grep semisync
/usr/lib64/mysql/plugin/semisync_master.so
/usr/lib64/mysql/plugin/semisync_slave.so
  • 使用二进制或者源码编译安装,用find查找模块是否存在
find / -name 'semisync*' 
/usr/local/mysql-8.0.25-linux-glibc2.17-x86_64-minimal/lib/plugin/semisync_master.so
/usr/local/mysql-8.0.25-linux-glibc2.17-x86_64-minimal/lib/plugin/semisync_slave.so

主和所有从节点均需安装并开启插件

  • 进入数据库并安装插件
    mysql>INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; #永久安装插件
  • 临时开启半同步功能(免重启立即生效)
    SET GLOBAL rpl_semi_sync_master_enabled=1; #临时修改变量

主节点修改配置文件并设定半同步阈值

  • 修改配置文件启用插件
vim /etc/my.cnf.d/mysql-server.cnf
[mysqld]
server-id=8
log-bin
#添加或修改下行,需要先安装semisync_master.so插件后,再重启,否则无法启动
rpl_semi_sync_master_enabled=ON 
#加或修改下行,设置3s内无法同步,也将返回成功信息给客户端
rpl_semi_sync_master_timeout=3000
  • 进入mysql设定阈值 (免重启立即生效)
    rpl_semi_sync_master_timeout=3000 #设置3s内无法同步,也将返回成功信息给客户端

从节点修改配置文件

  • 所有从节点必须全部修改
vim /etc/my.cnf.d/mysql-server.cnf
[mysqld]
server-id=8
log-bin
#添加或修改下行,需要先安装semisync_master.so插件后,再重启,否则无法启动
rpl_semi_sync_master_enabled=ON 

从节点确认配置生效

#注意:如果已经实现主从复制,需要stop slave;start slave;
mysql> stop slave;start slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)

Query OK, 0 rows affected, 1 warning (0.01 sec)

mysql> SHOW GLOBAL STATUS LIKE '%semi%';
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | ON    |
+----------------------------+-------+
1 row in set (0.00 sec)

主节点确认配置生效

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_for_slave_count | 1          |
| rpl_semi_sync_master_wait_no_slave        | ON         |
| rpl_semi_sync_master_wait_point           | AFTER_SYNC |
+-------------------------------------------+------------+
6 rows in set (0.01 sec)

mysql> SHOW GLOBAL STATUS LIKE '%semi%';
+--------------------------------------------+-------+
| Variable_name                              | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients               | 3    |
| 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     |
+--------------------------------------------+-------+
14 rows in set (0.00 sec)

测试

在master实现,创建数据库,立即成功

MariaDB [db1]> create database db2;
Query OK, 1 row affected (0.004 sec)

在所有slave节点实现,停止复制线程

MariaDB [(none)]> stop slave;
Query OK, 0 rows affected (0.011 sec)

在master实现,创建数据库,等待3s才能成功

MariaDB [db1]> create database db3;
Query OK, 1 row affected (3.003 sec)

在任意一个slave节点实现,恢复复制线程

MariaDB [(none)]> start slave;
Query OK, 0 rows affected (0.006 sec)

在master实现,创建数据库,立即成功

MariaDB [db1]> create database db4;
Query OK, 1 row affected (0.002 sec)

Mariadb-10.3.11区别

  • Mariadb-10.3.11及后续版本无法使用INSTALL PLUGIN直接安装
  • 需要数据库服务器配置文件中添加调用插件,重启数据库服务器后生效
#在master实现,启用半同步功能
[root@master ~]#vim /etc/my.cnf.d/mariadb-server.cnf
[mysqld]
server-id=8
log-bin
plugin-load-add = semisync_master
rpl_semi_sync_master_enabled=ON
rpl_semi_sync_master_timeout=3000 #设置3s内无法同步,也将返回成功信息给客户端
  • 就是多了一行配置参数,主从服务器均需通过此参数启用插件功能
  • plugin-load-add = semisync_master

以上是关于MySQL8.0.25使用插件实现主从半同步复制的主要内容,如果未能解决你的问题,请参考以下文章

MySQL半同步复制实战

MariaDB 10.3 主从半同步复制

MySQL数据库半同步复制

MySQL中的半同步复制

mysql主从之半同步复制和lossless无损复制

mysql主从复制中的半同步复制