前言
复习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,减轻主库压力,保持日志的长时间保持(用于主从切换后复制)
实践
在某节点创建存放binlog的目录(最好是mysql从节点上,否则可能有问题,未验证)
#mysql从节点192.168.179.192 mkdir -p /app/data/mysqlbinlog远程备份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)不认修改mha配置文件
#由于本次将一个slave设置为binlog server,在其server中添加以下参数防止其变为master,防止该节点成为master增加宕机概率,导致mha无法获取备份的binlog no_master=1 #在最后添加 [binlog1] hostname=192.168.179.192 master_binlog_dir=/app/data/mysqlbinlog检验
#masterha_check_repl会检查 masterha_check_repl --conf=/app/tools/masterha/app1.cnf启动mha
nohup masterha_manager --conf=/app/tools/masterha/app1.cnf &>/app/tools/masterha/app1/manager.log &测试
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写入的内容没有复制,数据丢失
错误
- mha复制检测报错
- mysqlbinlog冲突报错




