220_mysql_复制技术_复制恢复_seonds_behind_master计算
十一 MySQL复制延迟 seconds_behind_master如何计算
公式:clock_of_slave - last_timestamp_executed_by_sql_thread - clock_diff_with_master
# 备注: 从库当前系统的主机时间 – 从库SQL线程正在执行的事件时间 – 主从库的时间差
clock_diff_with_master 主从机时间差, 只有在IO线程启动时候计算一次, 每次重启I/O进程都会计算这次
主从主机时间不一致情况 |
1 slave I/O 启动时,会计算主从之间的时间差(只计算第一次),然后用公式计算出 主从时延 |
有时延 I/O & SQL线程均为Yes且SQL线程空闲 |
延迟为0 |
SQL线程是Yes, I/O读取的日志未应用完 |
会用公式计算延迟;如果SQL线程执行完所有relay log 如果I/O线程不为Yes 则判定复制延迟结果为NULL |
如果SQL线程不为Yes |
判定复制延迟的结果为NULL |
当计算复制延迟为负数, |
Seconds_behind_master 为0 |
十二 从库中止后安全恢复
从库意外中止, 恢复时需要中继日志状态信息,根据该信息重新启动相关任务, 配置系统参数:relay_log_info_repository = table (中继日志状态信息保存到innodb表中) 然后 mysql.slave_relay_log_info表 就会存储slave库 SQL线程所需的位置信息
单线程复制 & 多线程复制
1 单线程
GTID_MODE |
MASTER_AUTO_POSITION |
Relay_log_recovery |
Relay_log_info_repository |
Crash type |
Recovery guaranteed |
Relay log impact |
Off |
ANY |
1 |
TABLE |
Server |
Yes |
Lost |
Off |
ANY |
1 |
ANY |
OS |
No |
Lost |
Off |
ANY |
0 |
TABLE |
Server |
Yes |
Remains |
Off |
ANY |
0 |
TABLE |
OS |
No |
Remains |
ON |
ON |
ANY |
ANY |
Any |
Yes |
Lost |
ON |
OFF |
0 |
TABLE |
Server |
Yes |
Remains |
ON |
OFF |
0 |
ANY |
OS |
No |
Remains |
relay_log_recovery =1 该参数默认是打开的,在数据库启动后立即启动自动relay log恢复, 从库意外中止后会清除未重放的中继日志, sql线程应用的位置重新拉取主库的binlog生成新的relay_log 在恢复过程中,创建一个新的relay log文件,将sql线程的位置初始化到新的relay log,并将i/o线程初始化到sql线程位置
Relay_log_recovery =0 从库意外中止,恢复时候包含对中继日志的处理(中继日志中未来得及回放的数据),等待中继日志中的数据处理后,清除中继日志 |
1 GTID & MASTER_AUTO_POSITION 开启, 保证slave意外中止后的恢复 双一前提:sync_binlog =1 & innodb_flush_log_at_trx_commit =1 |
2 传统binlog&position复制时, 指定relay_log_recovery & relay_log_info_repository=table 保证系统恢复 |
3 设置 relay_log_recovery =1 时, 已经从master拉取的但还未执行的 relay_Log会被遗弃, 从新从master中获取 |
多线程
GTID_MODE |
Sync_relay_log |
MASTER_AUTO_POSITION |
Relay_log_recovery |
Relay_log_info_repository |
Crash type |
Recovery guaranteed |
Relay log impact |
Off |
1 |
ANY |
1 |
TABLE |
Any |
Yes |
Lost |
Off |
>1 |
ANY |
1 |
TABLE |
Server |
Yes |
Lost |
Off |
>1 |
ANY |
1 |
ANY |
OS |
No |
Lost |
Off |
1 |
ANY |
0 |
TABLE |
Server |
Yes |
Remains |
Off |
1 |
ANY |
0 |
TABLE |
OS |
No |
Remains |
ON |
Any |
ON |
ANY |
ANY |
Any |
Yes |
Lost |
ON |
1 |
OFF |
0 |
TABLE |
Server |
Yes |
Remains |
ON |
1 |
OFF |
0 |
ANY |
OS |
No |
Remains |
show variables like "%sync_relay_log%"
|
sync_relay_log :设置如何保存从节点接收到的主库BINLOG 设置如何同步中继日志到中继日志文件。 当sync_relay_log = 0时,则MySQL服务不会对中继日志文件进行同步操作,依赖于操作系统来定期进行同步。 当sync_relay_log = N(N>0),则每N个sync_relay_log事件后对中继日志文件执行一次同步(调用fdatasync())。
|
sync_relay_log_info :用于设置如何将应用中继日志的位置信息同步到文件和表中,默认参数为10000 当sync_relay_log_info = FILE时: 如果sync_relay_log_info=0,则MySQL服务不会对relay-log.info文件进行同步操作,依赖于操作系统来定期进行同步。 如果sync_relay_log_info=N(N>0),则每执行N个事务后将信息使用fdatasync()同步到relay-log.info文件。 当sync_relay_log_info = TABLE 且表mysql.slave_relay_log_info使用事务存储引擎如Innodb: 在每次事务后都会更新mysql.slave_relay_log_info表的数据,忽略sync_relay_log_info的设置。 当sync_relay_log_info = TABLE 且表mysql.slave_relay_log_info不使用存储引擎如MyISAM: 如果sync_relay_log_info=0,则不更新表mysql.slave_relay_log_info的数据 如果sync_relay_log_info=N(N>0),则每执行N个事务后更新表mysql.slave_relay_log_info的数据 |
1 GTID =ON & MASTER_AUTO_POSITION = 1 ,可以保证意外中止后的恢复 2 传统复制 保证 relay_log_info_repository = table & relay_log_recovery =1 |
3 sync_relay_log =1 时, 每个事务的中继日志都要落盘; 不等于1时,取决于操作系统何时落盘 |
4传统binlog+position复制,如果意外会导致slave中的relay_log和事务不一致(事务序列中间产生间隙) 5.7.13 之前 手工设置:relay_log_recovery=0; slave_parallel_workers=0 启动server 然后start slave until sql_after_MTS_GAPS 启动复制+修改事务不一致情况; 在修改 系统变量 relay_log_recovery =1 & slave_parallel_workers =N; 在重新启动slave server
5.7.13后会自动填充事务间隙; 多源复制时,设置 relay_log_recovery=1, slave意外中止, 所有通道都会经历relay_log恢复过程,发现事务间隙自动修复 |
- 点赞
- 收藏
- 关注作者
评论(0)