• 下面的架构是双主同步+各自有从节点

下载

docker pull mishamx/mysql docker tag mishamx/mysql rep docker rmi mishamx/mysql

创建容器

主节点

  1. docker run -d -p 9003:3306 \
  2. -e MYSQL_MASTER_PORT=3306 \
  3. -e MYSQL_ROOT_PASSWORD=root \
  4. -e MYSQL_REPLICATION_USER=backup \
  5. -e MYSQL_REPLICATION_PASSWORD=backup \
  6. -v rnv1:/var/lib/mysql \
  7. --privileged \
  8. --name rn1 \
  9. --net=<虚拟网络> rep

配置文件

  • /etc/mysql/my.cnf
    1. [mysq1d]
    2. character_set_server=utf8mb4
    3. # 要不同
    4. server_id=1001
    5. log_bin=mysql_bin
    6. relay_log=relay_bin
    7. # 由于双主节点互相同步,互相为 slave
    8. ## 表示 slave 将复制事件写进自己的二进制日志
    9. log-slave-updates=1
    10. # 数据同步模式
    11. ## 不指定引擎时,默认使用 Innodb 引擎
    12. ## 一个事务中,有 sql 执行错误,则回滚事务
    13. sq1_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

从节点

  1. docker run -d -p 9004:3306 \
  2. -e MYSQL_MASTER_HOST=rn1 \
  3. -e MYSQL_MASTER_PORT=3306 \
  4. -e MYSQL_ROOT_PASSWORD=root \
  5. -e MYSQL_REPLICATION_USER=backup \
  6. -e MYSQL_REPLICATION_PASSWORD=backup \
  7. -v rnv2:/var/lib/mysql \
  8. --privileged \
  9. --name rn2 \
  10. --net=<主节点同一个虚拟网络> rep
  • 修改了 --name
  • 就多了 MYSQL_MASTER_HOST

配置文件

  • /etc/mysql/my.cnf
    1. [mysqld]
    2. server_id=1003
    3. character_set_server=utf8mb4
    4. log_bin=mysql_bin
    5. # 表示 slave 将复制事件写进自己的二进制日志
    6. relay_log=relay_bin
    7. # 只读
    8. read-only=1

配置主从同步

  • 各个从分别同步各自的主
  • 双主配置互相同步
    1. stop slave;
    2. change master to
    3. -- swarm 网络可能会变化,所以设置 docker 名即可
    4. master_host='rn1',
    5. master_port=3306,
    6. master_use r='backup',
    7. master_password='backup';

注意点

主节点宕机

  • 主从同步失效,但是从节点可读

**