218_mysql_复制技术_多源复制_中继日志_复制状态

举报
alexsully 发表于 2021/11/11 19:33:01 2021/11/11
【摘要】 多源复制_中继日志_复制状态

七 多源复制

7.1 复制通道

一个从库对应多个主库,一个复制通道逻辑就对应主库

  • 通道:主库到从库的事务复制路径 mysql5.7 使用 for channel 来创建和删除通道
  • 从库打开多个通道,每个通道都有自己的IO/SQ线程; RELOG中继日志,
  • 5.7中最多添加256个复制通道,每个通道唯一名称, 且独立配置/运行

7.2 单通道操作命令

        如果要给某个给定的通道特定操作,需要结合FOR CHANNEL子句使用

change master to xxx FOR CHANNEL 'Master_1'; 
start/stop slave  for CHANNEL  'Master_1';
show relaylog events FOR CHANNEL 'Master_1'\G
flush relay logs FOR CHANNEL 'Master_1'\G
show slave status FOR CHANNEL 'Master_1'\G
reset slave FOR CHANNEL 'Master_1'\G

7.3 复制语句的向前兼容性

start/stop slave 启动所有通道的复制线程 group_replication_recovery & group_replication_applier 通道除外
show slave status 打印通道的复制状态信息, group_replication_applier除外
FLUSH RELAY LOGS: 刷新所有通道的中继日志  group_replication_applier除外
RESET SLAVE 重置所有通道的复制配置信息; 会清除所有复制通道的中继日志并重新创建默认的复制通道

7.4 当从库开启多个通道,必须使用 for channel channel_name 子句作单个通道,不允许对所有通道执行操作,不指定会报错

 show relaylog events
change master to
master_pos_wait()
wait_until_sql_thread_after_gtids() 

       

7.5 启动选项和复制通道选项

  从库必须开始或设置,该参数是保证数据同步的,在MySQL库下可以看到这两个表的信息,分别是mysql.slave_master_info AND mysql.slave_relay_log_info

SET GLOBAL master_info_repository = 'TABLE';

SET GLOBAL relay_log_info_repository = 'TABLE';

master-info-repository = table # 这个参数是必须的

relay-log-info-repository = table # 这个参数是必须的

启动项影响复制拓扑中的所有通道

--log-slave-updates

Slave 接收的所有事务都写入其自身的binlog

--relay-log-purge

启用后 每个复制通道各自清除中继的relay log

--slave-transaction-retries

复制通道的应用线程重试事务的数量

--skip-slave-start

启动后 所有复制通道的线程都关闭自启动,之后启动复制 要手工启动复制线程

--slave-skip-errors

遇到error,跳过制定错误代码,继续复制线程

 

 

启动项适用于每个复制通道

--max-relay-log-size = size

单个复制通道的单个中继日志文件的大小,达到阈值后 滚动生成新的中继日志文件

--relay-log-space-limit = size

单个复制通道relay log 总大小上线

--slave-parallel-workers =value

单个复制通道 worker线程的数量

--slave-checkpoint-group = N

每个复制源 I/O线程等待时间

--relay-log-index = filename

每个复制通道 realylog索引文件的前缀名称

--relay-log=filename

表示每个通道的中继日志文件文件的前缀名称

--slave_net-timeout=N

每个通道设置此值,以便每个通道等待N秒以检查连接是否断开

--slave-skip-counter=N

每个通道设置此值,以便每个通道从其master跳过N个事件

启动后可以配置

max_relay_log_size, slave_parallel_workers, slave_checkpoint_group, slave_net_timeout, sql_slave_skip_counter

启动前必须配置(系统变量只读)

Realy_log_space_limit,

relay_log_index, relay_log

7.6 命名约定 & 注意事项

  •         不能由客户指定的复制通道: group_replication_applier &  group_replicatioin_recovery
  •         多源从库总体数据量 建议不超过1T

八 从库中继日志和状态日志

        从库启动后需要相关状态日志来判断当前位置等信息, 状态日志标识复制线程(io/sql线程)的工作位置进行持久化(relay log info & master info )

8.1 中继日志和状态日志

  • Master info : 包含slave master的连接状态和当前配置信息. 如果使用 master_info_repository = table, 会将该信息存于 mysql.slave_master_info
  • Relay log: master binlog中读取, 由从库I/O线程写入的事件信息,会被后面SQL线程回放
  • Relay log info: 保存有关从库中继日志中执行点的信息. 如使用 relay_info_repository = table 会将信息写入 mysql.slave_relay_log_info

8.2 从库中继日志 (relay log file 指单个中继日志文件, relay log 通常指 顺序编号的中继日志文件和中继日志索引文件)

                 binlog 类似, 由一组 顺序编号的文件 & 一个索引文件组成 host-name-relay-bin.nnnnn, host-name-relay-bin.index

                 如果不指定 (relay_log  &  relay_log_index )会使用主机名,如果主机被改,只能停止slave, 旧文件内容添加到新文件中

  •     cat new_relay_log_name.indx >> old_relay_log_name.index  #先将新文件追加到旧文件中
  •     mv old_relay_log_name.index  new_relay_log_name.index  # 再为旧索引文件重命名

slave 创建新的中继日志文件有如下情况

  •         每次启动IO线程
  •         FLUSH LOGS, FLUSH RELAY LOGS mysqladmin flush-logs
  •         日志正常滚动:设置系统 max_relay_log_size 值大于0 , 达到阈值 滚动,如果设置为0 ,达到max_binlog_size 阈值进行滚动

 

8.3 从库状态日志

     master info & mysql.slave_relay_log表 外部查看建议 performance schema.replication_applier_status_by_worker

Master.info

文件中的行编号

Mysql.slave_master_info表的列

Show slave status展示的列

描述信息

1

Number_of_lines

表示文件中的行编号或表中的列编号

2

Master_log_name

Master_log_file

表示当前slave正在读取masterbinlog文件

3

Master_log_pos

Read_Master_log_pos

表示当前正在从master读取的binlog的当前位置

4

Host

Master_Host

主机的主机名(IP地址)

5

User_name

Master_user

Slave用于连接 master的用户名

6

User_password

密码

7

Port

Master_port

连接master的端口

8

Connect_retry

Connect_retry

Slave 在尝试连接master之前将等待的时间间隔(S为单位)

9

Enable_ssl

Master_ssl_allowed

表示server是否支持SSL连接

10

Ssl_ca

Master_ssl_CA_File

CA 证书文件名

11

Ssl_capath

Master_ssl_CA_PATH

CA证书路径

12

Ssl_cert

Master_SSL_Cert

CA颁发的server证书文件名称

13

Ssl_cipher

Master_ssl_cipher

Ssl连接握手中可能使用的加密算法列表

14

Ssl_key

Master_ssl_key

Ssl 秘钥文件的名称

15

Ssl_verify_server_cert

Master_ Ssl_verify_server_cert

是否检查证书

16

Hearbeat

复制机制的心跳检测时间间隔 单位S

17

Bind

Master_bind

表示slave使用那个网络接口连接到master

18

Ignored_server_ids

Replicate_ignore_server_ids

表示slave需要忽略的主库server id 列表

19

Uuid

Master_uuid

表示主库的UUID

20

Retry_count

Master_retry_count

表示允许重连主库的最大次数

21

Ssl_crl

Ssl证书吊销列表文件的路径

22

Ssl_crlpath

表示包含ssl证书吊销列表文件目录路径

23

Enabled_auto_position

Auto_position

是否使用自动定位功能

24

Channel_name

Channel_name

表示复制通道的名称

25

Tls_version

Master_TLS_Version

表示在master上的TLS版本

Relay log info & mysql.slave_relay_log_info

 R

elay-log.info文件中的行编号

Mysql.slave_relay_log_info表中的列

Show slave status展示的列

描述信息

1

Number_of_lines

表中列编号

2

Relay_log_name

Relay_log_file

当前中继日志的文件名

3

Relay_log_pos

Relay_master_log_pos

每个relay log file被成功执行后,此位置更新

4

Master_log_name

Relay_master_log_file

Slave sql线程读取的relay log file对应 masterbinlog名称

5

Master_log_pos

Exec_master_log_pos

Slave sql 线程已执行的 relay log file 对应masterbinlog 位置

6

Sql_delay

Sql_delay

表示从库必须滞后于主库的秒数

7

Number_of_workers

Slave 执行回放事务的worker线程数

8

Id

内部使用,常量1

9

Channel_name

Channel_name

表示复制通道的名称

Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.100
Master_User: mysync
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.001822
Read_Master_Log_Pos: 290072815
Relay_Log_File: mysqld-relay-bin.005201
Relay_Log_Pos: 256529594
Relay_Master_Log_File: mysql-bin.001821
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: 
Replicate_Ignore_DB: 
Replicate_Do_Table: 
Replicate_Ignore_Table: 
Replicate_Wild_Do_Table: 
Replicate_Wild_Ignore_Table: 
Last_Errno: 0
Last_Error: 
Skip_Counter: 0
Exec_Master_Log_Pos: 256529431
Relay_Log_Space: 709504534
Until_Condition: None
Until_Log_File: 
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File: 
Master_SSL_CA_Path: 
Master_SSL_Cert: 
Master_SSL_Cipher: 
Master_SSL_Key: 
Seconds_Behind_Master: 2923
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error: 
Last_SQL_Errno: 0
Last_SQL_Error: 
Replicate_Ignore_Server_Ids: 
Master_Server_Id: 1
Master_UUID: 13ee75bb-99e2-11e6-be4d-b499baa80e6e
Master_Info_File: /home/data/mysql/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Reading event from the relay log
Master_Retry_Count: 86400
Master_Bind: 
Last_IO_Error_Timestamp: 
Last_SQL_Error_Timestamp: 
Master_SSL_Crl: 
Master_SSL_Crlpath: 
Retrieved_Gtid_Set: 
Executed_Gtid_Set: 
Auto_Position: 0

1.	Slave_IO_State
这里显示了当前slave I/O线程的状态(slave连接到master的状态)。状态信息和使用show processlist | grep "system user"(会显示两条信息,一条slave I/O线程的,一条是slave SQL线程的)显示的内容一样

1) waiting for master update: 这是connecting to master状态之前的状态
2) connecting to master: I/O线程正尝试连接到master

3) checking master version: 在与master建立连接后,会出现该状态。该状态出现的时间非常短暂。

4) registering slave on master:在与master建立连接后,会出现该状态。该状态出现的时间非常短暂。  

5) requesting binlog dump: 在与master建立连接后,会出现该状态。在这个状态下,I/O线程向master发送请求,请求binlog,位置从指定的binglog 名字和binglog的position位置开始

6) waiting to reconnect after a failed binlog dump request:如果因为连接断开,导致binglog的请求失败,I/O线程会进入睡眠状态。然后定期尝试重连。尝试重连的时间间隔,可以使用命令"change master to master_connect_trt=X;"改变。

7) reconnecting after a failed binglog dump request: I/O进程正在尝试连接master

8) waiting for master to send event: 说明,已经成功连接到master,正等待二进制日志时间的到达。如果master 空闲,这个状态会持续很长时间。如果等待的时间超过了slave_net_timeout(单位是秒)的值,会出现连接超时。在这种状态下,I/O线程会人为连接失败,并开始尝试重连

9) queueing master event to the relay log: 此时,I/O线程已经读取了一个event,并复制到了relay log 中。这样SQL 线程可以执行此event

10) waiting to reconnect after a failed master event read: 读取时出现的错误(因为连接断开)。在尝试重连之前,I/O线程进入sleep状态,sleep的时间是master_connect_try的值(默认是60秒)

11) reconnecting after a failed master event read: I/O线程正尝试重连master。如果连接建立,状态会变成"waiting for master to send event"

12) waiting for the slave sql thread to free enough relay log space: 这是因为设置了relay_log_space_limit,并且relay log的大小已经整张到了最大值。I/O线程正在等待SQL线程通过删除一些relay log,来释放relay log的空间

13) waiting for slave mutex on exit: I/O线程停止时会出现的状态,出现的时间非常短

1. Slave_IO_State

这里显示了当前slave I/O线程的状态(slave连接到master的状态)。状态信息和使用show processlist | grep "system user"(会显示两条信息,一条slave I/O线程的,一条是slave SQL线程的)显示的内容一样。

2. Master_Host

mysql主库的ip地址

 

3. Master_User

master上面的一个用户。用来负责主从复制的用户,创建主从复制的时候建立的(具有reolication slave权限)

 

4. Master_Port

master服务器的端口

 

5. Connect_Retry

连接中断后,重新尝试连接的时间间隔。默认值是60

 

#master相关的日志的信息

 

 

6. Master_Log_File

当前I/O线程正在读取的主服务器二进制日志文件的名称

 

7. Read_Master_Log_Pos

当前I/O线程正在读取的二进制日志的位置

 

#relay log相关的信息

 

 

8. Relay_Log_File

当前slave SQL线程正在读取并执行的relay log的文件名

 

9. Relay_Log_Pos

当前slave SQL线程正在读取并执行的relay log文件中的位置;(Relay_Log_File下的Relay_Log_Pos其实一一对应着Relay_Master_Log_FileExec_Master_Log_Pos。)

 

10. Relay_Master_Log_File

 

 

#slave I/OSQL线程的状态(重要)

 

 

11. Slave_IO_Running

I/O线程是否被启动并成功地连接到主服务器上

 

12. Slave_SQL_Running

SQL线程是否被启动

 

13. Replicate_Do_DB

 

 

  Replicate_Ignore_DB

  Replicate_Do_Table

  Replicate_Ignore_Table

  Replicate_Wild_Do_Table

  Replicate_Wild_Ignore_Table

这些参数都是为了用来指明哪些库或表在复制的时候不要同步到从库,但是这些参数用的时候要小心,因为 当跨库使用的时候 可能会出现问题。

 

一般情况下 ,限制的时候都用Replicate_Wild_Ignore_Table这个参数

 

14. Last_Errno

Last_Error

slaveSQL线程读取日志参数的的错误数量和错误消息。错误数量为0并且消息为空字符串表示没有错误。

如果Last_Error值不是空值,它也会在从属服务器的错误日志中作为消息显示。

 

15. Skip_Counter

SQL_SLAVE_SKIP_COUNTER的值,用于设置跳过sql执行步数

 

16. Exec_Master_Log_Pos

slave SQL线程当前执行的事件,对应在master相应的二进制日志中的position。(结合Relay_Master_Log_File理解,而且在Relay_Master_Log_File这个值等于Master_Log_File值的时候,Exec_Master_Log_Pos是不可能超过Read_Master_Log_Pos的。)

 

17. Relay_Log_Space

所有原有的中继日志结合起来的总大小。

 

18. Until_Condition:

Until_Log_File:

Until_Log_Pos: 0

START SLAVE语句的UNTIL子句中指定的值

Until_Condition具有以下值:

1) 如果没有指定UNTIL子句,则没有值

2) 如果从属服务器正在读取,直到达到主服务器的二进制日志的给定位置为止,则值为Master

3) 如果从属服务器正在读取,直到达到其中继日志的给定位置为止,则值为Relay

Until_Log_FileUntil_Log_Pos用于指示日志文件名和位置值。日志文件名和位置值定义了SQL线程在哪个点中止执行

19.

Master_SSL_Allowed: No

Master_SSL_CA_File:

Master_SSL_CA_Path:

Master_SSL_Cert:

Master_SSL_Cipher:

Master_SSL_Key:

Master_SSL_Verify_Server_Cert: No

Master_SSL_Crl:

Master_SSL_Crlpath:

这些字段显示了被从属服务器使用加密相关的参数。这些参数用于连接主服务器

Master_SSL_Allowed具有以下值:

 

1) 如果允许对主服务器进行SSL连接,则值为Yes

2) 如果不允许对主服务器进行SSL连接,则值为No

3) 如果允许SSL连接,但是从属服务器没有让SSL支持被启用,则值为Ignored

SSL有关的字段的值对应于–master-ca,master-capath,master-cert,master-cipher和–master-key选项的值。

20. seconds_Behind_Master

这个值是时间戳的差值。是slave当前的时间戳和master记录该事件时的时间戳的差值

 

21. Last_IO_Errno:

  Last_IO_Error:

  Last_SQL_Errno: 0

  Last_SQL_Error:

最后一次I/O线程或者SQL线程的错误号和错误消息

 

22. Replicate_Ignore_Server_Ids

主从复制,从库忽略的主库服务器Id号。就是不以这些服务器Id为主库

 

23.

Master_Server_Id

Master_UUID

Master_Info_File

分别表示主库服务器id号,主库服务器的UUID好,还有在从库中保存主库服务器相关的目录位置

 

24. SQL_Delay

一个非负整数,表示秒数,Slave滞后多少秒于master

 

25. SQL_Remaining_Delay

Slave_SQL_Running_State 等待,直到MASTER_DELAY秒后,Master执行的事件,此字段包含一个整数,表示有多少秒左右的延迟。在其他时候,这个字段是NULL

 

26. Slave_SQL_Running_State

SQL线程运行状态

SQL线程运行状态:

 

1) Reading event from the relay log

线程已经从中继日志读取一个事件,可以对事件进行处理了

2) Has read all relay log; waiting for the slave I/O thread to update it

线程已经处理了中继日志文件中的所有事件,现在正等待I/O线程将新事件写入中继日志

3) Waiting for slave mutex on exit

线程停止时发生的一个很简单的状态

27. Master_Retry_Count

连接主库失败最多的重试次数

 

28. Master_Bind

slave从库在多网络接口的情况下使用,以确定用哪一个slave网络接口连接到master

 

29.

Last_IO_Error_Timestamp:

Last_SQL_Error_Timestamp

最后一次I/O线程或者SQL线程错误时的时间戳

 

#GTID模式相关

 

 

30. Retrieved_Gtid_Set

获取到的GTID<IO线程>

 

31.Executed_Gtid_Set

  执行过的GTID<SQL线程>

 

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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