mysql 主从复制原理,概念,故障的检控/分析/处理

1. 主从复制的原理 (Classic Replication)

1.1 主从中涉及到的文件和线程

1.1.1 涉及的线程

主库:
DUMP THREAD
从库:
IO  THREAD
SQL THREAD

1.1.2 涉及的文件

主库:
mysql-bin.000001    =====》主库的二进制文件

从库: db01
-relay.000001 ===》中继日志 master.info ===》主库信息记录日志 relay-log.info ===> 记录中继应用情况信息

1.2 主从复制原理

 

 

 

 

 

 主从复制原理描述:

1.change master to 时,ip pot user password binlog position写入到master.info进行记录
2. start slave 时,从库会启动IO线程和SQL线程
3.IO_T,读取master.info信息,获取主库信息连接主库
4. 主库会生成一个准备binlog DUMP线程,来响应从库
5. IO_T根据master.info记录的binlog文件名和position号,请求主库DUMP最新日志
6. DUMP线程检查主库的binlog日志,如果有新的,TP(传送)给从从库的IO_T
7. IO_T将收到的日志存储到了TCP/IP 缓存,立即返回ACK给主库 ,主库工作完成
8.IO_T将缓存中的数据,存储到relay-log日志文件,更新master.info文件binlog 文件名和postion,IO_T工作完成
9.SQL_T读取relay-log.info文件,获取到上次执行到的relay-log的位置,作为起点,回放relay-log
10.SQL_T回放完成之后,会更新relay-log.info文件。
11. relay-log会有自动清理的功能。
细节:
1.主库一旦有新的日志生成,会发送“信号”给binlog dump ,IO线程再请求

2. 主从故障监控\分析\处理 *****

2.1 从库查看到的主从信息整理

mysql> show slave status \G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
# 主库的相关信息(master.info中的信息)
Master_Host: 192.168.0.104
Master_User: repl
Master_Port: 3306
Connect_Retry: 10
Master_Log_File: mysql-bin.000011    # 获取到的最新的主库日志文件
Read_Master_Log_Pos: 779            # 当前主库最新的position位置

# 从库relay应用信息有关的(relay.info中的信息)
Relay_Log_File: 192-relay-bin.000005
Relay_Log_Pos: 992                        # 上下两个表示relay_log的文件名和position
Relay_Master_Log_File: mysql-bin.000011    # 对应主库的文件名

# 从库线程运行状态
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Last_IO_Errno: 0
Last_IO_Error: 
Last_SQL_Errno: 0
Last_SQL_Error: 

# 过滤复制有关的信息(有选择性的复制主库)
Replicate_Do_DB: 
Replicate_Ignore_DB: 
Replicate_Do_Table: 
Replicate_Ignore_Table: 
Replicate_Wild_Do_Table: 
Replicate_Wild_Ignore_Table: 
   
# 从库延时主库的时间(秒)
Seconds_Behind_Master: 0

# 延时从库配置
SQL_Delay: 0
SQL_Remaining_Delay: NULL

# gtid复制有关的状态信息
Retrieved_Gtid_Set: 
Executed_Gtid_Set: 
Auto_Position: 0

2.2 故障排查思路

主从复制的核心就是从库的两个线程(io和sql)加上主库的dump线程,而dump线程又是主库自动开启的,出问题的概率不大。

从库线程之io线程解析:
io线程的工作职责:
  1. 连接主库
  2. 请求主库的binlog
  3. 存储请求到的binlog
从库线程之sql线程解析:
sql线程工作职责:
  1. 读取并执行relaylog中的日志
  2. 更新relay-info中的信息

2.2.1 排查连接异常思路

手动使用复制账户连接主库,核对账户,密码,ip,端口等配置信息是否正确,如果是这些信息异常导致的,则按照以下步骤到从库重新设置。
核对防火墙的影响。
stop slave reset slave all change master to xxxxxx start slave
如果是因为数据库最大链接数满了引起的连接异常,可手动增大最大连接数限制

[root@db01 ~]# mysql -urepl -p123 -h 10.0.0.51 -P 3307 
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1040 (HY000): Too many connections
处理方法:
db01 [(none)]>set global max_connections=300;

2.2.2 排查主库binlog请求不到异常

1. 确认主从binlog是否开启
2. 确认从库配置的二进制日志文件是否存在
3. 针对主库做过重置二进制文件序号的命令(即主库执行了:reset master)解决办法?
  分析,之所以同步失败,是因为主库重置了二进制序号,而该操作不会被从库同步到,所以导致从库中储存的二进制文件和position号无效。   主库执行:show binlog events in 'xxxxx.000001';找到最开始的position号,从新配置从库的同步信息即可。   (reset master后刷出来的新二进制文件,开始的position号一定是154吗?)

2.2.3 排查sql线程异常:

1. relay-log文件找不到了. 重新构建主从
2. 报各种从库的对象存在,违反了约束等,虽然不大可能出现. 处理掉从库中异常提示中的问题.
3. 一切以主库为主.
不建议的操作如下:
方法一:
stop slave; 
set global sql_slave_skip_counter = 1;
#将同步指针向下移动一个,如果多次不同步,可以重复操作。
start slave;
方法二:
从库配置文件中添加跳过配置,出现以下异常时自动跳过
slave-skip-errors = 1032,1062,1007
常见错误代码:
1007:对象已存在
1032:无法执行DML
1062:主键冲突,或约束冲突

但是,以上操作有时是有风险的,最安全的做法就是重新构建主从。把握一个原则,一切以主库为主.
,以上操作有时是有风险的,最安全的做法就是重新构建主从。把握一个原则,一切以主库为主.

一劳永逸的方法:

(1) 可以设置从库只读.
db01 [(none)]>show variables like '%read_only%';
注意:
只会影响到普通用户,对管理员用户无效。
read_only  # 用来控制普通用户只读
supper_read_only  # 用来控制所有用户含root只读;
(
2)加中间件 读写分离。
atlas
mycat
proxySQL
maxscale

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2020-05-19 00:52  叶落kiss  阅读(255)  评论(0编辑  收藏  举报