MySQL

MySql双主搭建

2019-03-26  本文已影响13人  Scallion

简单介绍一下搭建MySql双主的背景:

1. 两台mysql都可读写,互为主备,默认只使用一台(masterA)负责数据的写入,另一台(masterB)备用;
2.masterA是masterB的主库,masterB又是masterA的主库,它们互为主从;
3.两台主库之间做高可用,采用keepalived方案(使用VIP对外提供服务);
4.所有提供服务的从服务器与masterB进行主从同步(双主多从);
5.采用高可用策略的时候,masterA或masterB均不因宕机恢复后而抢占VIP(非抢占模式);
这样做可以在一定程度上保证主库的高可用,在一台主库down掉之后,可以在极短的时间内切换到另一台主库上(尽可能减少主库宕机对业务造成的影响),减少了主从同步给线上主库带来的压力;

系统配置及MySql版本

系统:Centos6.5
MySql版本:mysql-5.7.21.4-linux
数据库IP:172.16.124.143、172.16.124.144
数据库端口:都是3306

请提前安装MySql,本文档未涉及到MySql的安装教程

Mysql-5.7.21.4安装参考链接


MySql配置


搭建MySql双主


配置完成双主,相互在两个数据库操作数据,测试数据同步


搭建过程中遇到的问题

                   Last_Errno: 1032
                 Last_Error: Could not execute Delete_rows event on table mytest.user; Can't find record in 'user', Error_code: 1032; handler error HA_ERR_END_OF_FILE; the event's master log mysql-bin.000007, end_log_pos 2844
                 Last_SQL_Errno: 1032
             Last_SQL_Error: Could not execute Delete_rows event on table mytest.user; Can't find record in 'user', Error_code: 1032; handler error HA_ERR_END_OF_FILE; the event's master log mysql-bin.000007, end_log_pos 2844

解决,因为在搭建双主测试时造成的数据不一致,导致同步失败。

   STOP SLAVE; #停止从节点
   set GLOBAL sql_slave_skip_counter=1;    #由于master要删除一条记录,而slave上找不到故报错,这种情况主上都将其删除了,那么从机可以直接跳过
   START SLAVE;    #启动从节点

如果在搭建过程中遇到这样的错误,也可通过上面的方法解决

    Last_SQL_Errno: 1007
   Last_SQL_Error: Error 'Can't create database 'test'; database exists' on query. Default database: 'test'. Query: 'create database test'

初步分析可能是在连接主库时,填写二进制日志文件(MASTER_LOG_FILE )或二进制日志偏移量出错(MASTER_LOG_POS)

解决:

查看主库二进制文件记录信息,记下File, Position信息

     mysql> show master status;
     +------------------+----------+--------------+---------------------------------------------+-------------------+
     | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB                            | Executed_Gtid_Set |
     +------------------+----------+--------------+---------------------------------------------+-------------------+
     | mysql-bin.000008 |     1434 |              | mysql,information_schema,performance_schema |                   |
     +------------------+----------+--------------+---------------------------------------------+-------------------+
     1 row in set (0.00 sec)

     File :当前正在记录的二进制日志文件
     Position :记录偏移量,日志 mysql-bin.000008 所记录到的位置。
     Binlog_Do_DB :要记录日志的数据库
     Binlog_Ignore_DB :不记录日志的数据库
     Executed_Gtid_Set :已执行的事务ID

在从节点连上数据库,执行一下操作,基本可以解决

     STOP SLAVE; #停止从节点
     CHANGE MASTER TO MASTER_LOG_FILE='testdbbinlog.000008',MASTER_LOG_POS=1434;  #设置MASTER_LOG_FILE与MASTER_LOG_POS为刚在主节点查询到的值(File, Position)
     START SLAVE;    #启动从节点
    mysql> start slave;
    ERROR 1872 (HY000): Slave failed to initialize relay log info structure from the repository

    报错原因:
    从库已经存在之前的relay log

    解决方法:
    使用RESET SLAVE语句,清除master信息和relay日志的信息,删除所有的relay日志文件,并开始创建一个全新的中继日志
    mysql> stop slave;
    mysql> reset slave;

上一篇 下一篇

猜你喜欢

热点阅读