本文问题
- 半同步的过程是怎样的?
- 半同步功能是通过什么执行的?
- 如何启用半同步?
- 启用半同步有什么要求和条件?
- 半同步在什么情况下会恢复为异步主从同步?
- 在主库上可以进行哪些半同步相关的配置?
- 在从库上可以进行哪些半同步相关的配置?
- 在使用半同步时,主库上的事务在什么时点进行提交?可以通过哪个选项修改提交时点?
- 如何查看半同步的配置?
- 如何查看半同步的状态?
半同步主从同步
默认情况下,MySQL主从同步是异步的,主库将事件写入到二进制日志,从库获取主库的二进制日志并进行应用。主库不知道从库什么时候获取和应用二进制日志。
当使用异步主从同步时,如果主库崩溃,可能主库上已经提交的事务没有在从库上提交,这时故障转移到从库可能导致数据丢失。
可以使用半同步来替代异步主从同步:
- 从库在连接主库时说明是否支持半同步主从同步功能
- 如果主库启用了半同步主从同步,并且至少有一个半同步的从库,则在主库上提交事务的线程将阻塞,等待直到至少一个从库确认已接收到该事务的所有事件,或者直到超时。
- 从库在将事件写入到中继日志并且刷新到磁盘后,确认接收到事务。
- 如果没有任何从库确认收到事务并且发生超时,主库恢复为异步主从同步。当至少一个半同步从库追上主库后,主库返回到半同步主从同步
- 半同步主从同步必须在主库和从库上同时启用。如果在主库上禁用半同步主从同步,或者在主库上启用半同步主从同步但是从库未启用半同步主从同步,主库使用异步主从同步。
当主库阻塞(等待从库确认)时,执行事务的会话不会返回。当阻塞结束后,会话返回,然后可以继续执行其他语句。在这一时刻,事务已经在主库上提交,并且至少一个从库已经确认接收到事务。
半同步的安装和配置
半同步的安装
安装要求
- 数据库支持动态加载插件(
)have_dynamic_loading=YES
- 主从同步已经在正常运行。
- 不能配置多通道主从同步,半同步只支持默认通道。
安装半同步插件
主库安装半同步插件
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
从库安装半同步插件
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
启用半同步插件
主库启用半同步插件
[mysqld]
rpl_semi_sync_master_enabled=1
#或
SET GLOBAL rpl_semi_sync_master_enabled = 1;
从库启用半同步插件
[mysqld]
rpl_semi_sync_slave_enabled=1
#或
SET GLOBAL rpl_semi_sync_slave_enabled = 1
启动从库I/O线程
# 如果主从同步已经在运行,还需要停止后重新启动I/O线程来使用半同步
STOP SLAVE IO_THREAD;
START SLAVE IO_THREAD;
半同步的配置
所有半同步相关的配置都是在安装插件后才可用的,都可以动态修改。
主库配置
-
主库是否启用半同步步 默认rpl_semi_sync_master_enabled
OFF
-
半同步的超时时间 默认rpl_semi_sync_master_timeout
10000(10s)
-
主库半同步跟踪级别 默认rpl_semi_sync_master_trace_level
32
-
常规级别(功能故障时间)1
-
详细级别 (更多详细信息)16
-
网络等待级别 (更多关于网络等待的信息)32
-
功能级别 (有关功能进入和退出的信息)64
-
-
默认rpl_semi_sync_master_wait_for_slave_count
主库必须获取到多少个从库的事务确认1
-
默认rpl_semi_sync_master_wait_no_slave
当从库确认数少于应确认数量时,是否等待超时。ON
-
当从库确认数小于ON
,并且超出rpl_semi_sync_master_wait_for_slave_count
后主库才恢复到异步主从同步。rpl_semi_sync_master_timeout
-
当从库确认数小于OFF
后,主库会恢复到异步主从同步rpl_semi_sync_master_wait_for_slave_count
-
-
主库等待从库确认事务的时机。rpl_semi_sync_master_wait_point
-
AFTER_SYNC
主库将事务写入到主库自己的二进制日志和从库上,并且刷新日志到磁盘。主库等待从库确认收到事务。收到确认后,主库提交事务并给客户端返回结果。
连接主库的所有客户端可以同时看到已提交的事务。如果主库发生故障,在主库上提交的事务都主从同步到从库上,从主库到从库的故障转移是无损的。但是主库的二进制日志从可能包含未提交的事务,不能直接使用。
-
AFTER_COMMIT
主库将事务写入到主库自己的二进制日志和从库上,刷新日志到磁盘,然后提交事务。主库等待从库确认收到事务,收到确认后,主库将结果返回客户端。
连接主库的客户端中,执行事务的客户端在从库确认前不能看到事务提交,但是其他客户端可以看到该事务已经提交。如果出现问题,从库还没有处理事务。当故障转移到从库时,可能会看不到主库上关于该事务的数据。
-
从库配置
-
从库是否启用半同步 默认rpl_semi_sync_slave_enabled
OFF
-
从库半同步调试跟踪级别rpl_semi_sync_slave_trace_level
查看半同步状态
检查半同步插件是否安装
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
FROM INFORMATION_SCHEMA.PLUGINS
WHERE PLUGIN_NAME LIKE '%semi%';
+----------------------+---------------+
| PLUGIN_NAME | PLUGIN_STATUS |
+----------------------+---------------+
| rpl_semi_sync_master | ACTIVE |
+----------------------+---------------+
检查如何配置的半同步步
mysql> SHOW VARIABLES LIKE 'rpl_semi_sync%';
检查半同步步状态
主库半同步状态
-
半同步从库数量。Rpl_semi_sync_master_clients
-
主库等待从库应答的平均时间(以微秒为单位)。不建议使用此变量(始终为0),并将在以后的版本中将其删除。Rpl_semi_sync_master_net_avg_wait_time
-
主服务器等待从属服务器答复的总时间(以微秒为单位)。不建议使用此变量(始终为0),并将在以后的版本中将其删除。Rpl_semi_sync_master_net_wait_time
-
主库等待从库答复的总次数。Rpl_semi_sync_master_net_waits
-
主库关闭半同步主从同步的时间。Rpl_semi_sync_master_no_times
-
从库未成功确认的提交数。Rpl_semi_sync_master_no_tx
-
半同步主从同步当前是否在主库上运行。Rpl_semi_sync_master_status
已启用插件并且已发生提交确认。ON
未启用插件或主库由于提交确认超时已经恢复为异步主从同步。OFF
-
调用时间功能(例如Rpl_semi_sync_master_timefunc_failures
)时主库发生故障的时间。gettimeofday()
-
主库等待每个事务的平均时间(以微秒为单位)。Rpl_semi_sync_master_tx_avg_wait_time
-
主库等待事务的总时间(以微秒为单位)。Rpl_semi_sync_master_tx_wait_time
-
主库等待事务的总次数。Rpl_semi_sync_master_tx_waits
-
主节点等待事件的二进制坐标比以前等待的事件低的总次数。当事务开始等待答复的顺序与写入其二进制日志事件的顺序不同时,可能会发生这种情况。Rpl_semi_sync_master_wait_pos_backtraverse
-
当前等待从库答复的会话数。Rpl_semi_sync_master_wait_sessions
-
从库成功确认的提交数。Rpl_semi_sync_master_yes_tx
从库半同步状态
-
半同步当前是否在从属服务器上运行。如果已启用插件并且从库I/O线程正在运行则为Rpl_semi_sync_slave_status
, 否则为ON
。OFF
问题答案
-
半同步的过程是怎样的?
从库在连接主库时(启用
I/O
线程时)检测是否使用半同步。
使用半同步主从同步:
主库将事务写入到二进制日志并刷新到磁盘,根据
的配置,等待至少rpl_semi_sync_master_wait_point
个从库确认事务后提交事务并返回给客户端(N
),或者提交事务后等待至少AFTER_SYNC
个从库确认事务,然后返回给客户端(N
)AFTER_COMMIT
可以通过N
进行设置,默认为rpl_semi_sync_master_wait_for_slave_count
1
.
从库在将事务写入到中继日志并且刷新到磁盘后确认事务
如果确认事务的从库数量小于
,根据N
的配置来检查是否等待超时,如果值为rpl_semi_sync_master_wait_no_slave
,则在等待ON
时间后,主库恢复为异步主从同步,如果值为rpl_semi_sync_master_timeout
OFF
,主库直接恢复为异步主从同步。
当从库追上主库的进度后,主库返回半同步主从同步状态。
-
半同步主从同步功能是通过什么执行的?
通过半同步主从同步插件,主库插件
,从库插件semisync_master.so
semisync_slave.so
-
如何启用半同步?
安装半同步主从同步插件
# 主库
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'
# 从库
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'
# 主库
SET GLOBAL repl_semi_sync_master_enabled = 1
# 从库
SET GLOBAL repl_semi_sync_slave_enabled =1
# STOP SLAVE IO_THREAD; #如果I/O线程已启用要先停止
START SLAVE IO_THREAD;
- 启用半同步有什么要求和条件?
- 数据库可以动态加载插件
have_dynamic_loading=YES
- 主从同步已经在正常运行
- 没有配置多通道主从同步,半同步步只对默认主从同步通道有效
- 数据库可以动态加载插件
-
半同步在什么情况下会恢复为异步主从同步?
根据
rpl_semi_sync_wait_no_slave
的配置:
值为
时:等待从库确认时间大于ON
rpl_semi_sync_master_timeout
后恢复为异步主从同步
值为
时,从库确认数小于OFF
后恢复为异步主从同步rpl_semi_sync_master_wait_for_slave_count
- 在主库上可以进行哪些半同步主从同步相关的配置?
是否启用半同步步rpl_semi_sync_master_enabled
半同步超时时间rpl_semi_sync_master_timeout
需要确认事务的从库数量rpl_semi_sync_master_wait_for_slave_count
是否等待从库确认超时rpl_semi_sync_master_wait_no_slave
等待从库确认事务的时点rpl_semi_sync_master_wait_point
半同步调试跟踪状态rpl_semi_sync_master_trace_level
- 在从库上可以进行哪些半同步主从同步相关的配置?
是否启用半同步rpl_semi_sync_slave_enabled
半同步调试跟踪级别rpl_semi_sync_slave_trace_level
-
在使用半同步时,主库上的事务在什么时点进行提交?可以通过哪个选项修改提交时点?
默认主库上的事务在写入二进制日志并刷新到磁盘后,等待从库确认事务,然后提交并返回客户端.
可以通过
进行更改,默认值为rpl_semi_sync_master_wait_point
AFTER_SYNC
。
可以更改为
:主库上的事务写入到二进制日志并刷新到磁盘后就提交事务,然后等待从库确认事务,再将结果返回到客户端。这种情况下,其他连接可以看到提交后的事务。AFTER_COMMIT
- 如何查看半同步的配置?
;SHOW VARIABLES LIKE 'rpl_semi_sync%';
- 如何查看半同步的状态?
SHOW STATUS LIKE 'rpl_semi_sync%';