MySQL的双主模式


binlog(二进制日志)

  1. 简介
    binlog是记录所有 数据库表结构变更(例如CREATE、ALTER TABLE…)

    以及表数据修改(INSERT、UPDATE、DELETE…)的二进制日志

    不会记录 SELECT和SHOW 等操作,因为这类操作对数据本身并没有修改

    binlog 的主要目的是复制和恢复

    用于 MySQL主从复制 Master端开启binlog,Master把它的二进制日志传递给slaves来达到master-slave数据一致的目的

  2. 分类

    • 二进制日志索引文件(文件名后缀为.index)用于记录所有的二进制文件
      文本文件,其中内容为当前的 二进制日志文件(binlog文件)列表

    • 二进制日志文件(文件名后缀为.00000*)记录数据库所有的DDL和DML(除了数据查询语句)语句事件

  3. 开启
    vim /etc/my.cnfvim /etc/mysql/mysql.conf.d/mysqld.cnf

    log-bin = mysql-bin #没有给定值,写成 log-bin=,则默认名称为主机名(注:名称若带有小数点,则只取第一个小数点前的部分作为名称)

    启用 binlog 之后须重启MySQL才能生效
    service mysql restart
    重启后,可以进入MySQL查看是否成功开启
    show variables like '%log_bin%';

    注:
    如果/etc目录下没有my.cnf
    可以在/usr/share/mysql目录下找到my-default.cnf
    复制到/etc目录下
    cp /usr/share/mysql/my-default.cnf /etc/my.cnf


MySQL的双主模式

  1. 简介
    两台mysql都可读写,互为主备
    默认只使用一台(masterA)负责数据的写入,另一台(masterB)备用
    masterA是masterB的主库,masterB又是masterA的主库,它们互为主从

  2. 益弊
    在一定程度上保证主库的高可用,
    在一台主库down掉之后,可以在极短的时间内切换到另一台主库上(尽可能减少主库宕机对业务造成的影响),减少了主从同步给线上主库带来的压力;

    masterB可能会一直处于空闲状态(可以用它当从库,负责部分查询)
    主库后面提供服务的从库要等masterB先同步完了数据后才能去masterB上去同步数据,
    这样可能会造成一定程度的同步延时


在Linux上,搭建MySQL双主模式

  1. 搭建环境
    OS:CentOS 6.10
    MySQL:MySQL-5.6.26
    masterA IP:192.168.10.70
    masterB IP:192.168.10.71

  2. 修改.cnf配置文件
    更改两台主机中的MySQL配置文件/etc/my.cnf
    vim /etc/my.cnf
    在 masterA 的my.cnf中添加

    server-id = 1
    log-bin = binlog
    auto-increment-increment = 2
    auto-increment-offset = 1

    在 masterB 的my.cnf中添加

    server-id = 2
    log-bin = binlog
    auto-increment-increment = 2
    auto-increment-offset = 2

    参数说明:

    server-id Mysql唯一标识,一个集群中唯一
    log-bin 开启log-bin
    auto-increment-increment 整个结构中服务器的总数(共两台服务器,所以值为2)
    auto-increment-offset 自动增长的起点(因为服务器都设定了一次自动增长的值为2,所以他们的起点必须得不同,这样才能避免两台服务器数据同步时出现主键冲突)

  3. 重启MySQL使配置生效,再次登录MySQL

  4. 创建并添加同步数据需要的用户
    在 masterA 的MySQL中

CREATE USER [email protected]'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'userA'@'192.168.10.%' IDENTIFIED BY '123456';
FLUSH PRIVILEGES;

[ Linux ]在Linux上,搭建MySQL双主模式

在 masterB 的MySQL中

CREATE USER [email protected]'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'userA'@'192.168.10.%' IDENTIFIED BY '123456';
FLUSH PRIVILEGES;

[ Linux ]在Linux上,搭建MySQL双主模式
5. 查看master的状态
SHOW MASTER STATUS;
masterA 的 MASTER STATUS
[ Linux ]在Linux上,搭建MySQL双主模式
masterB 的 MASTER STATUS
[ Linux ]在Linux上,搭建MySQL双主模式

  1. 说明二进制日志路径
    在 masterB 上执行
    CHANGE MASTER TO MASTER_HOST='192.168.10.70',MASTER_USER='userA',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000002',MASTER_LOG_POS=585;
    [ Linux ]在Linux上,搭建MySQL双主模式
    在 masterA 上执行
    CHANGE MASTER TO MASTER_HOST='192.168.10.71',MASTER_USER='userB',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=1147;
    [ Linux ]在Linux上,搭建MySQL双主模式

    参数说明
    masterB上填的参数信息都对应 masterA 中设定的参数(masterA同理)

    以 masterB 为例,参数信息应该为:
    MASTER_HOST masterA 的 host
    MASTER_USER 在 masterA 中创建的 userA
    MASTER_PASSWORD userA 对应的密码
    MASTER_LOG_FILE SHOW MASTER STATUS;查询出的第一项文件名(File)
    MASTER_LOG_POS SHOW MASTER STATUS;查询出的第二项文件名(Posotion)

  2. 开启复制功能
    在 masterA 和 masterB 中都执行
    start slave;
    [ Linux ]在Linux上,搭建MySQL双主模式
    至此 Linux上的MySQL双主模式配置完成

  3. 测试
    在 masterA 中建立数据库
    [ Linux ]在Linux上,搭建MySQL双主模式
    然后在 masterB 中查询是否也建立了相应的数据库
    [ Linux ]在Linux上,搭建MySQL双主模式
    可以看到 masterA 与 masterB 之间已经进行了同步


遇到的问题

  • masterA 和 masterB 的数据不同步
    查看 slave 的状态
    show slave status
    其中 Slave_IO_Running 和 Slave_SQL_Running 状态都要为Yes

    如果 Slave_SQL_Running 状态为No
    [ Linux ]在Linux上,搭建MySQL双主模式
    执行如下操作

    stop slave;
    set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
    start slave;


附录

  • masterA的my.cnf配置信息
    [ Linux ]在Linux上,搭建MySQL双主模式
  • masterB的my.cnf配置信息
    [ Linux ]在Linux上,搭建MySQL双主模式

相关文章:

  • 2021-06-11
  • 2022-01-22
  • 2021-12-06
  • 2022-12-23
  • 2021-05-27
  • 2021-08-02
  • 2021-12-19
猜你喜欢
  • 2022-12-23
  • 2021-10-08
  • 2021-11-16
  • 2021-11-29
  • 2021-05-30
  • 2021-10-21
  • 2021-08-09
相关资源
相似解决方案