51工具盒子

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

mysql 主从之半同步复制

mysql 主从之半同步复制

概念介绍说明:

在MySQL5.5版本之前,数据库的复制是异步操作,主库和从库的数据之间存在一定的延迟,这样就存在数据存储不一致的隐患;

假设当主库上写入一个事务并提交成功, 而从库尚未得到主库推送的binlog日志时,主库宕机了;

例如主库可能因磁盘损坏、内存故障等造成主库上该事务binlog丢失,此时从库就可能损失这个事务,从而造成主从不一致;

为了解决这个问题,数据库服务引入了半同步复制机制。

当采用异步方式同步数据,由于从库异常宕机情况出现,造成主从数据不一致情况出现,还会有以下影响情况:

  • 会造成从库可能创建语句没有执行,后续的插入语句也必然失败,形成SQL线程运行故障;
  • 由于主从数据信息不一致,在架构设计上在读取从库数据信息时,就会读取数据信息异常;

说明:利用半同步复制机制,主要是用于解决主从数据复制不一致的问题,即解决主从数据一致性问题,也可以避免SQL线程故障;

实现工作机制:

在MySQL5.5之前的异步复制时,主库执行完commit提交操作后,在主库写入binlog日志后即可成功返回客户端;

无需等待binlog日志传送给从库;

半同步复制时,为了保证主库上的每个binlog事务能够被可靠的复制到从库上,主库在每次事务成功提交时,并不及时反馈给前端用户;

而是等待其中一个从库也接收到binlog事务并成功写入中继日志后,主库才返回commit操作成功给客户端。

半同步复制保证了事务成功提交后,至少有两份日志记录,一份在主库的binlog日志上,另一份在至少一个从库的中继日志relaylog上

从而更进一步保证了数据的完整性。

简单说明:半同步复制技术应用,主要是阻塞主库事务提交的执行过程,从而实现数据最终一致性目的;

半同步复制技术与传统主从复制技术不同之处:

  • 在主库提交操作时候会受到阻塞,等待从库IO线程返回ack确认信号后,才能使主库提交操作成功;

  • 从库IO线程接收到binlog日志信息,当日志信息写入到磁盘上的relaylog文件时,会给主库返回ack信号; 在主库上会利用ack_receiver线程接收返回的ack信号;

  • 当主库上的ack_receiver线程接收到ack信号信息时,会产生事件触发机制,告诉主库事务提交操作成功了;

  • 如果在接收ack信号时,等待信号时间超过了预设值的超时时间,半同步复制会切换为原始的异步复制方式; 预设的等待超时时间的数值,由参数rpl_semi_sync_master_timeout设置的毫秒数决定;

功能应用实践:

① 主从数据库安装半同步功能插件

# 进行主从同步重构
[root@baimeidashu-01 ~]# mysqldump -uroot -A -S /tmp/mysql3307.sock --master-data=2 --single-transaction >/tmp/full.sql
[root@baimeidashu-01 ~]# grep "\-- CHANGE" /tmp/full.sql
-- CHANGE MASTER TO MASTER_LOG_FILE='binlog.000004', MASTER_LOG_POS=5240;
-- 在主库进行数据备份,并获取备份位置点信息
mysql> stop slave;
mysql> reset slave all;
mysql> CHANGE MASTER TO
  MASTER_HOST='192.168.30.101',
  MASTER_USER='repl',
  MASTER_PASSWORD='123456',
  MASTER_PORT=3307,
  MASTER_LOG_FILE='binlog.000004',
  MASTER_LOG_POS=5240,
  MASTER_CONNECT_RETRY=10;
mysql> start slave;
-- 实现从库数据库同步功能重构
​
# 主库安装半同步插件(3307)
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
-- 主库利用插件控制ack_receiver线程接收ack确认信息,并且会控制commit阻塞,实现半同步复制功能
mysql> show plugins;
+---------------------------------+----------+--------------------+--------------------------+----------+
| Name                                    | Status   | Type                   | Library                       | License |
+---------------------------------+----------+--------------------+--------------------------+----------+
| rpl_semi_sync_master       | ACTIVE  | REPLICATION    | semisync_master.so | GPL        |
+---------------------------------+----------+--------------------+--------------------------+----------+
-- 查看插件是否进行加载
​
# 从库安装半同步插件(3309)
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
-- 从库利用插件控制IO线程发送ack确认信息;
mysql> show plugins;
+---------------------------------+----------+--------------------+--------------------------+----------+
| Name                                    | Status   | Type                   | Library                       | License |
+---------------------------------+----------+--------------------+--------------------------+----------+
| rpl_semi_sync_slave          | ACTIVE  | REPLICATION    | semisync_slave.so    | GPL       |
+---------------------------------+----------+--------------------+--------------------------+----------+
-- 查看插件是否进行加载

说明:一般在高可用数据库架构环境中,可以在高可用的两台主机上均安装好主库插件和从库插件;

② 主从数据库启动半同步插件功能:

# 主库启动半同步功能
mysql> set global rpl_semi_sync_master_enabled =1;
​
# 从库启动半同步功能
mysql> set global rpl_semi_sync_slave_enabled =1;
​
# 重启从库上的IO线程
mysql> stop slave IO_THREAD;
mysql> start slave IO_THREAD;
​
# 核实确认半同步功能状态:
mysql> show status like 'rpl_semi_sync_master_status';
+--------------------------------------+-------+
| Variable_name                           | Value |
+--------------------------------------+-------+
| Rpl_semi_sync_master_status | ON     |
+--------------------------------------+-------+
1 row in set (0.01 sec)
-- 核实主库半同步功能是否激活
​
mysql> show status like 'rpl_semi_sync_slave_status';
+--------------------------------------+-------+
| Variable_name                           | Value |
+--------------------------------------+-------+
| Rpl_semi_sync_slave_status   | ON     |
+--------------------------------------+-------+
1 row in set (0.00 sec)
-- 核实从库半同步功能是否激活

③ 主从数据库半同步功能永久配置:

# 在数据库配置文件中编写以下参数
rpl_semi_sync_master_enabled=on
-- 主库半同步功能启停设置,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
binlog_group_commit_sync_delay=1
binlog_group_commit_sync_no_delay_count=1000
-- 实现事务组提交方式,将多个事务合并成组推送到从库上,避免dump线程采用串型方式提交事务,造成主从同步延时;
​
rpl_semi_sync_slave_enabled=on
-- 从库半同步功能启停设置,on为激活设置
rpl_semi_sync_slave_trace_level=32
赞(1)
未经允许不得转载:工具盒子 » mysql 主从之半同步复制