• 搜索
  • 夜间模式
    ©2026  依刻学习 Theme by OneBlog

    依刻学习博客

    搜索
    标签
  • 首页>
  • 学习的一天>
  • 正文
  • MHA实践(3)

    2025年03月23日 12 阅读 0 评论 4016 字

    前言

    复习MHA,搭建binlog-server并测试

    |NODE|IP|ROLE|
    |-|-|-|
    |T1|192.168.179.191|master,MHA-node|
    |T2|192.168.179.192|slave,MHA-manager,binlog-server|
    |T3|192.168.179.193|slave,MHA-node|
    配置了binlog-server,减轻主库压力,保持日志的长时间保持(用于主从切换后复制)

    实践

    1. 在某节点创建存放binlog的目录(最好是mysql从节点上,否则可能有问题,未验证)

      #mysql从节点192.168.179.192
      mkdir -p /app/data/mysqlbinlog
    2. 远程备份binlog

      #指定备份binlog的目标master节点(一般就直接从mysql-bin.000001开始复制)
      nohup mysqlbinlog --no-defaults --read-from-remote-server --raw --result-file=/app/data/mysqlbinlog/ --host=192.168.179.191 --port=3306 --user=monmha --password='!@#$%^&[]{O2p' --stop-never mysql-bin.000001  --server-id=9999  &>/dev/null & 
      #--read-from-remote-server:从远程服务器直接读取binlog
      #--raw:输出原始binlog内容
      #--result-file:指定输出目录(不是文件名)
      #经测试,--result-file准确说是文件名前缀(如/data/backcp-->backcpmysql-bin.000001)或者是路径,一定要在末尾加/(如/data/backcp/-->backcp/mysql-bin.000001)
      #--stop-never:,表示持续监听新事件

      要在--result-file指定的目录后加/,不可以使用任何文件名,因为MHA只能识别mysql-bin.000001类型的binlog文件,其他的文件名(例如backcpmysql-bin.000001)不认

    3. 修改mha配置文件

      #由于本次将一个slave设置为binlog server,在其server中添加以下参数防止其变为master,防止该节点成为master增加宕机概率,导致mha无法获取备份的binlog
      no_master=1
      #在最后添加
      [binlog1]
      hostname=192.168.179.192
      master_binlog_dir=/app/data/mysqlbinlog
    4. 检验

      #masterha_check_repl会检查
      masterha_check_repl --conf=/app/tools/masterha/app1.cnf


    5. 启动mha

      nohup masterha_manager  --conf=/app/tools/masterha/app1.cnf &>/app/tools/masterha/app1/manager.log &
    6. 测试

      1.关闭从节点IO线程

      stop slave io_thread;
      show slave status\G;

      2.主节点写并更新binlog

      #主节点写操作,使用flush logs;快速更新日志
      create database test;
      use test;
      flush logs;
      create table dept
      ( deptno int unsigned auto_increment primary key comment '部门编号',
      dname  varchar(15) comment '部门名称'  ,
      loc  varchar(50) comment '部门所在位置'
      )engine = innodb default charset=utf8mb4 comment='员工部门表';
      flush logs;
      insert into dept values (10,'ACCOUNTING','NEW YORK');
      flush logs;
      insert into dept values (20,'RESEARCH','DALLAS');
      flush logs;
      insert into dept values (30,'SALES','CHICAGO');
      flush logs;
      insert into dept values (40,'OPERATIONS','BOSTON');
      flush logs;
      show master status\G;
      


      此时slave节点没有变化,因为关闭的IO线程,不会再复制master节点的binlog
      3.关闭master节点,模拟宕机

      systemctl stop mysqld

      关闭master节点后,经过多次测试,结果如下
      关闭了mysqld,会导致mysqlbinlog后台退出,某种程度上这个mysqlbinlog就是一次性的,但是结合mha错误修改的脚本可以实现即使主从切换也可继续备份binlog
      MHA检测到master节点宕机,立即进行主从切换,因为再T2节点设置了no_master,所以会将T3作为master节点(只有T1,T2,T3节点)
      MHA设置新master与新slave时会自动设置只读和解除只读,所以只需要按照一般配置从库




      虽然日志状态还是binlog1,但是实际上已经完成了原本binlog(master)的写入,这个地方我一直以为没写入,导致重复测试花了不少时间

    如果没有该binlog-server,MHA检测到启用GTID模式后并不会去复制master上的binlog,导致IO关闭后master写入的内容没有复制,数据丢失

    错误

    1. mha复制检测报错
    • 错误
    • 原因
      因为指定的binlog目录下没有binlog文件
      binlog文件不是mysql-bin.000001类型的文件名
    • 解决
      修改mysqlbinlog的复制保存路径,不要加文件名,末尾必须是/
    1. mysqlbinlog冲突报错
    • 错误
    • 原因
      因为我使用xshell的输出到多个终端导致2个slave同时运行了mysqlbinlog命令并且指定为同一个server-id导致的
    • 解决
      避免使用已经存在的server-id
    本文著作权归作者 [ wymm ] 享有,未经作者书面授权,禁止转载,封面图片来源于 [ 互联网 ] ,本文仅供个人学习、研究和欣赏使用。如有异议,请联系博主及时处理。
    取消回复

    发表留言
    回复

    Copyright©2026  All Rights Reserved.  Load:0.017 s
    Theme by OneBlog V3.6.5
    夜间模式

    开源不易,请尊重作者版权,保留基本的版权信息。