细说MYSQL主从复制(一)

Sep 21, 2019

基于Docker的Mysql主从复制搭建

为什么基于Docker搭建?

  • 资源有限
  • 一台机器上可以运行多个Docker容器
  • Docker容器之间相互独立,有独立ip,互不冲突
  • Docker使用步骤简便,启动容器在秒级别

1、利用Docker搭建主从服务器

  • 首先拉取docker镜像,我们这里使用5.7版本的mysql:

    1
    docker pull reg.zuinianqing.com/library/dockerui:1.17
  • 然后使用此镜像启动容器(因为我是两台mac,因此使用的是同一个命令)

    1
    docker run  -p 3306:3306 --name mysql -itd --net mynetwork --ip 10.18.3.5 reg.zuinianqing.com/library/mysql:5.7 && docker restart mysql

2、配置主Master

通过docker exec -it 627a2368c865 /bin/bash命令进入到Master容器内部,也可以通过docker exec -it mysql /bin/bash命令进入。627a2368c865是容器的id,而mysql-master是容器的名称。
cd /etc/mysql切换到/etc/mysql目录下,然后vi my.cnf对my.cnf进行编辑

1
2
log-bin=mysql-bin
server-id=1

配置完成后重启mysql

3、配置Slave

1
2
3
server-id=101
log-bin=mysql-slave-bin
relay_log=edu-mysql-relay-bin

配置完成后重启mysql

4、在主服务器上建立帐户并授权slave:

1
GRANT REPLICATION SLAVE,FILE ON *.* TO 'mysync'@'192.168.2.100' IDENTIFIED BY 'q123456';

5、登录主服务器的mysql,查询master的状态

6、配置从服务器Slave:

1
change master to master_host='192.168.2.100',master_user='mysync',master_password='q123456',master_log_file='mysql-bin.000008',master_log_pos=154,master_port=3306;

7、检查从服务器复制功能状态:

碰到问题

在配置主从复制模式的时候发现配置失败

1
2
mysql> show slave status\G;
Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work

问题分析

问题提示主从使用了相同的server UUID,一个个的检查:

  • 检查主从server_id

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    主库:
    mysql> show variables like 'server_id';
    +---------------+-------+
    | Variable_name | Value |
    +---------------+-------+
    | server_id | 1 |
    +---------------+-------+
    1 row in set (0.01 sec)

    从库:
    mysql> show variables like 'server_id';
    +---------------+-------+
    | Variable_name | Value |
    +---------------+-------+
    | server_id | 2 |
    +---------------+-------+
    1 row in set (0.01 sec)
  • server_id不一样,排除。检查主从状态:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    主库:
    mysql> show master status;
    +------------------+----------+--------------+------------------+-------------------+
    | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    +------------------+----------+--------------+------------------+-------------------+
    | mysql-bin.000008 | 154 | | | |
    +------------------+----------+--------------+------------------+-------------------+
    1 row in set (0.00 sec)

    从库:
    mysql> show master status;
    +------------------+----------+--------------+------------------+-------------------+
    | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    +------------------+----------+--------------+------------------+-------------------+
    | mysql-bin.000001 | 306 | | | |
    +------------------+----------+--------------+------------------+-------------------+
    1 row in set (0.00 sec)

File一样,排除。

  • 最后检查发现他们的auto.cnf中的server-uuid是一样的。。。
    1
    2
    3
    4
    [root@localhost ~]# vim /var/lib/mysql/auto.cnf

    [auto]
    server-uuid=4f37a731-9b79-11e8-8013-000c29f0700f

问题解决
停止从库的mysqld服务,删除他的auto.cnf文件,再启动数据库服务即可(或者手动修改 从库的 uuid值)

最后

      以前总是太懒,不愿意专研,其实沉下心来,好好研究配置下,会发现并没有自己想像的那么难,而且还能加深理解。