本文问题
- 半同步复制的过程是怎样的?
- 半同步复制功能是通过什么执行的?
- 如何启用半同步复制?
- 启用半同步复制有什么要求和条件?
- 半同步复制在什么情况下会恢复为异步复制?
- 在主库上可以进行哪些半同步复制相关的配置?
- 在从库上可以进行哪些半同步复制相关的配置?
- 在使用半同步复制时,主库上的事务在什么时点进行提交?可以通过哪个选项修改提交时点?
- 如何查看半同步复制的配置?
- 如何查看半同步复制的状态?
半同步复制
默认情况下,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%';
检查半同步复制状态
mysql> SHOW STATUS LIKE 'Rpl_semi_sync%';
主库半同步复制状态
-
Rpl_semi_sync_master_clients
半同步从库数量。 -
Rpl_semi_sync_master_net_avg_wait_time
主库等待从库应答的平均时间(以微秒为单位)。不建议使用此变量(始终为0),并将在以后的版本中将其删除。 -
Rpl_semi_sync_master_net_wait_time
主服务器等待从属服务器答复的总时间(以微秒为单位)。不建议使用此变量(始终为0),并将在以后的版本中将其删除。 -
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
从库成功确认的提交数。
从库半同步复制状态
-
Rpl_semi_sync_slave_status
半同步复制当前是否在从属服务器上运行。如果已启用插件并且从属I / O线程正在运行则为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
启用从库的I/O
线程
# 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%';
网友评论