首页 > 数据库 >MySQL 8 半同步复制

MySQL 8 半同步复制

时间:2023-12-21 14:36:37浏览次数:310  
标签:副本 插件 同步 semi sync source 复制 MySQL rpl

安装半同步复制

半同步复制是通过插件的形式实现的。必须要在源库和副本上安装插件。源库和副本有不同的插件。插件安装后,可通过与之相关的系统变量对其进行控制。只有安装了相关插件,这些系统变量才可用。

要使用半同步复制,必须满足以下要求:

·要求 MySQL 服务器支持动态加载。要验证这一点,请检查 have_dynamic_loading 系统变量的值是否为 YES。二进制发行版应支持动态加载。

>show variables like '%have_dynamic_loading%';
+----------------------+-------+
| Variable_name        | Value |
+----------------------+-------+
| have_dynamic_loading | YES   |
+----------------------+-------+

·复制已经在运行

·不能配置了多个复制 channels ,半同步复制只是支持默认的复制 channel

从 MySQL 8.0.26 开始,提供了新的主从复制插件,使用了新的系统变量。不同的平台,插件名的前缀不同:

·源库,旧术语:rpl_semi_sync_master 插件(semisync_master.so 或 semisync_master.dll 库)
·源库,新术语(从 MySQL 8.0.26 起):rpl_semi_sync_source 插件(semisync_source.so 或 semisync_source.dll 库)
·副本,旧术语:rpl_semi_sync_slave 插件(semisync_slave.so 或 semisync_slave.dll 库)
·副本,新术语(从 MySQL 8.0.26 起):rpl_semi_sync_replica 插件(semisync_replica.so 或 semisync_replica.dll 库)

源库安装:

INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
--from MySQL 8.0.26:
INSTALL PLUGIN rpl_semi_sync_source SONAME 'semisync_source.so';

副本上安装:

INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
--from MySQL 8.0.26:
INSTALL PLUGIN rpl_semi_sync_replica SONAME 'semisync_replica.so';

确认安装是否成功:

mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
       FROM INFORMATION_SCHEMA.PLUGINS
       WHERE PLUGIN_NAME LIKE '%semi%';
+----------------------+---------------+
| PLUGIN_NAME          | PLUGIN_STATUS |
+----------------------+---------------+
| rpl_semi_sync_source | ACTIVE        |
+----------------------+---------------+

插件安装后,默认是不启用的。

 

开启半同步复制

如果一边开启,一边不开启,就是使用异步复制。

源库端:

SET GLOBAL rpl_semi_sync_master_enabled = 1;
--from MySQL 8.0.26 with the rpl_semi_sync_source plugin:
SET GLOBAL rpl_semi_sync_source_enabled = 1;

副本端:

SET GLOBAL rpl_semi_sync_slave_enabled = 1;
--from MySQL 8.0.26 with the rpl_semi_sync_replica plugin:
SET GLOBAL rpl_semi_sync_replica_enabled = 1;

 

如果是复制运行时开启半同步复制,需要重启io thread:否则还是继续使用异步复制

stop slave io_thread;
start slave io_thread;

--from MySQL 8.0.22:
stop replica io_thread;
start replica io_thread;

 

要想每次重启生效,需要配置到配置文件中

源库端:

[mysqld]
rpl_semi_sync_master_enabled=1
--from MySQL 8.0.26 with the rpl_semi_sync_source plugin:
rpl_semi_sync_source_enabled=1

副本端:

[mysqld]
rpl_semi_sync_slave_enabled=1
--from MySQL 8.0.26 with the rpl_semi_sync_source plugin:
rpl_semi_sync_replica_enabled=1

 

配置半同步复制

从 MySQL 8.0.26 开始,提供了新的主从复制插件,使用了新的系统变量。

如果安装了  rpl_semi_sync_source 和 rpl_semi_sync_replica 插件,只能看到新的系统变量和状态变量,老的已经看不到了。如果安装的是 rpl_semi_sync_master 和 rpl_semi_sync_slave 插件,只能使用老的系统变量和状态变量。新旧插件不可以同时使用。

·rpl_semi_sync_source_enabled 或 rpl_semi_sync_master_enabled

主库上是否开启半同步复制。默认是0,表示不开启

·rpl_semi_sync_replica_enabled 或 rpl_semi_sync_slave_enabled

从库上是否开启半同步复制

·rpl_semi_sync_source_timeout 或 rpl_semi_sync_master_timeout

单位是毫秒,控制主库等待ack消息的等待超时时间,默认是10000,即10秒,超时后切换成异步复制

·rpl_semi_sync_source_wait_for_replica_count 或 rpl_semi_sync_master_wait_for_slave_count

默认是0,表示主库不需要等待从库的ack

·rpl_semi_sync_source_wait_point 或 rpl_semi_sync_master_wait_point

这两个系统变量控制着半同步源服务器在向提交事务的客户端返回状态前等待事务接收副本确认的时间点。支持的值有:

(1)after_sync:

这是默认值。源库将每个事务写入自己的二进制日志和副本,并将二进制日志写入磁盘。同步后,源库会等待副本确认收到事务。收到确认后,源库会将事务提交到存储引擎,并将结果返回给客户端,然后客户端就可以继续处理。

使用 after_sync 设置,所有的客户端同时看到提交的事务,即在收到副本的ack后,在源库上提交事务到存储引擎。

如果源库发生失败,源库上所有提交的事务已经发送到副本的relay中。源库异常退出集群或故障转移到副本,是无损的,因为副本是最新的。故障转移后,就不应该继续使用老的源库了。

(2)after_commit:

源库将每个事务写入自己的二进制日志和副本,同步二进制日志,并将事务提交到存储引擎。提交后,源库会等待副本确认收到事务。收到确认后,源会向客户端返回一个结果,然后客户端就可以继续。

使用 after_commit,只有在服务器向存储引擎提交并收到副本确认后,发出事务的客户端才会获得返回状态。在提交之后和副本确认之前,其他客户端可以在提交客户端之前看到已提交的事务。

如果出了差错,副本没有处理事务,那么在源库意外退出并故障切换到副本的情况下,这些客户端就有可能在源库上看到的数据,在副本上被丢失。

从 MySQL 8.0.23 开始,启用限制回调的系统变量 replication_sender_observe_commit_only 和增加共享锁并避免不必要锁获取的 replication_optimize_for_static_plugin_config,可以提高半同步复制的性能。随着复制数量的增加,这些设置会有所帮助,因为对锁的争夺会降低性能。半同步复制源服务器也能从启用这些系统变量中获得性能优势,因为它们使用与复制相同的锁定机制。

半同步复制的监控

半同步复制插件增加了很多状态变量,可以使用 show status 命令查看:

mysql> SHOW STATUS LIKE 'Rpl_semi_sync%';

说明:

·Rpl_semi_sync_source_clients 或 Rpl_semi_sync_master_clients:连接到源服务器的半同步副本的数量。

·Rpl_semi_sync_source_status 或 Rpl_semi_sync_master_status:半同步复制当前是否在源服务器上运行。如果插件已启用,且提交确认尚未发生,则值为 1。如果未启用插件,或源服务器因提交确认超时而退回到异步复制,则值为 0。

·Rpl_semi_sync_source_no_tx 或 Rpl_semi_sync_master_no_tx:副本未成功确认的提交次数。

·Rpl_semi_sync_source_yes_tx 或 Rpl_semi_sync_master_yes_tx:副本成功确认的提交次数。

·Rpl_semi_sync_replica_status 或 Rpl_semi_sync_slave_status:半同步复制当前是否在副本上运行。如果插件已启用且复制 I/O(接收器)线程正在运行,则该值为 1,否则为 0。

标签:副本,插件,同步,semi,sync,source,复制,MySQL,rpl
From: https://www.cnblogs.com/abclife/p/17913599.html

相关文章

  • Mysql报错:too many connections原因及解决方法
    原因是mysql连接数过多解决方案一:1、linux登录mysql:mysql-uroot-p;2、查看mysql允许的最大连接数showvariableslike'%max_connections%';3、查看这次mysql服务启动到现在,同一时刻最多mysql有多少连接showstatuslike'Max_used_connections';4、修改mysql最大连......
  • H3C交换机NTP时间同步配置
    H3C核心交换机同步外网时间,再作为内网NTP服务器,其它交换机再从核心交换机同步时间,以保障内网设备时间统一核心交换机配置:[H3C]clockprotocolntp#时钟协议ntp开启[H3C]clocktimezonexi'anadd8:00:00#时区设置xi'an,并设置+8为北京时间[H3C]ntp-servicee......
  • 支持 Postman 同步,IDEA 插件 Fast Request 2023.2.3 发布
    简介RestfulFastRequest 是一个类似于Postman的IDEA插件。它是一个强大的restfulapi工具包插件,可以根据已有的方法帮助您快速、自动生成url和params。RestfulFastRequest=API调试工具+API管理工具+API搜索工具。它有一个漂亮的界面来完成请求、检查服......
  • 转:mysql查看表大小
    原文:mysql查看表大小useinformation_schema;--查看各库占用大小selectTABLE_SCHEMA,concat(truncate(sum(data_length)/1024/1024,2),'MB')asdata_size,concat(truncate(sum(index_length)/1024/1024,2),'MB')asindex_sizefrominformation_schema.tables......
  • MySQL 对 bit 类型与字符判断结果不一致现象
     结论涉及bit类型的比较时,最好给常量的比较对象都加上b前缀,比如a='1'变成a=b'1',来避免结果的非预期不一致现象。复现SQLCREATETABLEt1(`id`varchar(36),`status`bit(1),`open`bit(1),`store_id`varchar(20),PRIMARYKEY(`id`),KEY`inde......
  • MySQL 8.0.12 深入理解bit类型
     背景:在阿里巴巴推荐的MySQL建表规范里要求如下:表达是与否概念的字段,必须使用is_xxx的方式命名,数据类型是unsignedtinyint(1表示是,0表示否)。解释:在MySQL里表示是和否的概念可以使用如下三种方案:1.使用bit(1)类型,此时bit允许存储的是ASCII中的0和1.0表示否1表示是的概念......
  • MySQL 获取日期、时间、时间戳
    MySQL获取当前日期、时间、时间戳函数_mysqldate_sub时间戳-CSDN博客#获取当前时间curtime()mysql>selectcurtime();+-----------+|curtime()|+-----------+|10:39:25|+-----------+#获取当前日期curdate()mysql>selectcurdate();+------------+|cur......
  • day02-MySQL
    数据库-MySQL1.数据库基础操作mysql-u用户名-p密码[-h数据库服务器的IP地址-P端口号]-h参数不加,默认连接的是本地127.0.0.1的MySQL服务器,-P参数不加,默认连接的端口号是3306eg.mysql-uroot-p1234查询所有数据库showdatabases;创建数据库created......
  • 生产环境部署过的二种mysql同步: binlog和gtid
    生产环境部署过的二种mysql同步:binlog和gtid服务器A:192.168.21.33|master|winserver2019服务器B:192.168.21.40|slave |winserver2019Mysql版本:8.0.34.0数据库连接软件:mysql-workbench-community-8.0.30-winx64(注:linux版本一样的配置方法,注意my.ini和......
  • MySQL-基础篇
    索引的数据结构二叉树树高度普通二叉树最坏n.红黑树二叉平衡树,树高度logn+1.以20000000条数据为例,h=log20000000=25Hash表对索引的key进行一次hash计算就可以定位出数据存储的位置很多时候Hash索引要比B+Tree更高效仅能满足=、in,不支持范围查询hash冲突问题(数组+链表)......