220_mysql_复制技术_复制恢复_seonds_behind_master计算

举报
alexsully 发表于 2021/11/12 12:26:48 2021/11/12
【摘要】 复制恢复相关配置和计算主从延迟时间

十一 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线程均为YesSQL线程空闲

延迟为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),则每Nsync_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恢复过程,发现事务间隙自动修复

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。