218_mysql_复制技术_多源复制_中继日志_复制状态
七 多源复制
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正在读取master的binlog文件 |
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对应 master的binlog名称 |
5 |
Master_log_pos |
Exec_master_log_pos |
Slave sql 线程已执行的 relay log file 对应master的binlog 位置 |
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_File的Exec_Master_Log_Pos。) |
|
10. Relay_Master_Log_File |
|
|
#slave I/O和SQL线程的状态(重要) |
|
|
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 |
slave的SQL线程读取日志参数的的错误数量和错误消息。错误数量为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_File和Until_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线程> |
|
- 点赞
- 收藏
- 关注作者
评论(0)