zoukankan      html  css  js  c++  java
  • 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

     

  • 相关阅读:
    读取points文件
    JSP语法1
    servlet与SSI
    JDBC连接数据库
    django开发Blog(2)
    django开发Blog(1)
    JSP学习2:useBean动作标签
    django开发Blog(4)
    Servelet基础
    servlet会话管理2
  • 原文地址:https://www.cnblogs.com/quzq/p/12907895.html
Copyright © 2011-2022 走看看