双主配置需要注意什么?

  • log-slave-updates 需要打开
  • auto_increment_offset 和 auto_increment_increment 需要配置不同的起点和步长。

修改mysql目录下的my.cnf

  1. # The MySQL Client configuration file.
  2. #
  3. # For explanations see
  4. # http://dev.mysql.com/doc/mysql/en/server-system-variables.html
  5. [mysql]
  6. [mysqld]
  7. sql-mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"
  8. character-set-server=utf8
  9. ## 主库配置
  10. ## 设置server_id,一般设置为IP,保证唯一就好
  11. server_id=100
  12. # 开启binlog,名字可以随意取
  13. log-bin=mysql-bin
  14. ## binlog日志格式,(mixed,statement,row,默认格式是statement)
  15. binlog_format=row
  16. ## 日志自动删除日期,默认值为0,表示不自动删除。
  17. expire_logs_days=7
  18. ## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
  19. ## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
  20. slave_skip_errors=1062
  21. ## 复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步)
  22. binlog-ignore-db=mysql
  23. #控制binlog的写入频率。每执行多少次事务写入一次(这个参数性能消耗很大,但可减小MySQL崩溃造成的损失)
  24. sync_binlog = 1
  25. #这个参数一般用在主主同步中,用来错开自增值, 防止键值冲突
  26. auto_increment_offset = 1
  27. #这个参数一般用在主主同步中,用来错开自增值, 防止键值冲突
  28. auto_increment_increment = 2
  29. #通过同步产生的变化将记录在自己的binlog中
  30. log-slave-updates=ON
  • log-slave-updates:另一台数据库通过同步产生过来的变化将同时记录在自己的binlog中。
  • auto_increment_increment : 自增步长设置为2,那么这台服务器产生的自增id ,为1,3,5,7。

复制mysql 目录生成mysql_master_second

结构如图:
image.png
修改mysql_master_second 目录下的my.cnf

  1. # The MySQL Client configuration file.
  2. #
  3. # For explanations see
  4. # http://dev.mysql.com/doc/mysql/en/server-system-variables.html
  5. [mysql]
  6. [mysqld]
  7. sql-mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"
  8. character-set-server=utf8
  9. ## 主库配置
  10. ## 设置server_id,一般设置为IP,保证唯一就好
  11. server_id=103
  12. # 开启binlog,名字可以随意取
  13. log-bin=mysql-bin
  14. ## binlog日志格式,(mixed,statement,row,默认格式是statement)
  15. binlog_format=row
  16. ## 日志自动删除日期,默认值为0,表示不自动删除。
  17. expire_logs_days=7
  18. ## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
  19. ## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
  20. slave_skip_errors=1062
  21. ## 复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步)
  22. binlog-ignore-db=mysql
  23. #控制binlog的写入频率。每执行多少次事务写入一次(这个参数性能消耗很大,但可减小MySQL崩溃造成的损失)
  24. sync_binlog = 1
  25. #这个参数一般用在主主同步中,用来错开自增值, 防止键值冲突
  26. auto_increment_offset = 2
  27. #这个参数一般用在主主同步中,用来错开自增值, 防止键值冲突
  28. auto_increment_increment = 2
  29. #通过同步产生的变化将记录在自己的binlog中
  30. log-slave-updates=ON
  • server_id : 设置为另一个值。
  • auto_increment_offset 和 auto_increment_increment修改保证自增id值不会重复。这台服务器产生的id 为2,4,6,8

修改docker-compose.yml

  1. version: '3'
  2. networks: #定义网路
  3. backend:
  4. driver: ${NETWORKS_DRIVER}
  5. services:
  6. mysql-master: # Master 节点
  7. build:
  8. context: ./mysql #自定义镜像
  9. args:
  10. - MYSQL_VERSION=${MYSQL_VERSION}
  11. environment:
  12. - MYSQL_DATABASE=${MYSQL_DATABASE} #默认创建数据库
  13. - MYSQL_USER=${MYSQL_USER} #创建用户
  14. - MYSQL_PASSWORD=${MYSQL_PASSWORD} #用户密码
  15. - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD} #root 用户秘密
  16. - TZ=${WORKSPACE_TIMEZONE}
  17. volumes:
  18. - ${DATA_PATH_HOST}/mysql:/var/lib/mysql
  19. - ${MYSQL_ENTRYPOINT_INITDB}:/docker-entrypoint-initdb.d
  20. ports:
  21. - "3308:3306"
  22. networks:
  23. - backend
  24. mysql-slave: #Slave 节点
  25. build:
  26. context: ./mysql_slave #自定义镜像
  27. args:
  28. - MYSQL_VERSION=${MYSQL_VERSION}
  29. environment:
  30. - MYSQL_DATABASE=${MYSQL_DATABASE} #默认创建数据库
  31. - MYSQL_USER=${MYSQL_USER} #创建用户
  32. - MYSQL_PASSWORD=${MYSQL_PASSWORD} #用户密码
  33. - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD} #root 用户秘密
  34. - TZ=${WORKSPACE_TIMEZONE}
  35. volumes:
  36. - ${DATA_PATH_HOST}/mysql_slave:/var/lib/mysql
  37. - ${MYSQL_ENTRYPOINT_INITDB}:/docker-entrypoint-initdb.d
  38. ports:
  39. - "3309:3306"
  40. networks:
  41. - backend
  42. mysql-master-second: # 第二个 Master 节点
  43. build:
  44. context: ./mysql_master_second #自定义镜像
  45. args:
  46. - MYSQL_VERSION=${MYSQL_VERSION}
  47. environment:
  48. - MYSQL_DATABASE=${MYSQL_DATABASE} #默认创建数据库
  49. - MYSQL_USER=${MYSQL_USER} #创建用户
  50. - MYSQL_PASSWORD=${MYSQL_PASSWORD} #用户密码
  51. - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD} #root 用户秘密
  52. - TZ=${WORKSPACE_TIMEZONE}
  53. volumes:
  54. - ${DATA_PATH_HOST}/mysql:/var/lib/mysql
  55. - ${MYSQL_ENTRYPOINT_INITDB}:/docker-entrypoint-initdb.d
  56. ports:
  57. - "3310:3306"
  58. networks:
  59. - backend

启动服务

  1. docker-compose up -d --build mysql-master
  2. docker-compose up -d --build mysql-master-second

现在两台Master 服务器已经启动,分别在mysql-master,和 mysql-master-second 创建账号。

  1. grant file,select,replication slave on *.* to 'slave'@'%' identified by '123456';

查看 mysql-master状态:

  1. show master status;

image.png

查看mysql-master-second 状态:
image.png

设置互为主从关系

  • mysql-master-second设置为mysql-master 的从库:

    1. change master to master_host='mysql-master',master_user='slave',master_password='123456',master_log_file='mysql-bin.000004',master_log_pos=448;
    2. start slave;
    3. show slave status;
  • mysql-master设置为mysql-master-second的从库:

    1. change master to master_host='mysql-master-second',master_user='slave',master_password='123456',master_log_file='mysql-bin.000003',master_log_pos=453;
    2. start slave;
    3. show slave status;

    这样双主结构就完成了。

动手问题

也许还有小伙伴对log-slave-updates 的作用还不是特别明白。 亲自动手做下下面的实验吧。

  1. 搭建两台Master 服务器 master_first和master_second,形成双主配置,log-slave-updates 配置为OFF。
  2. 搭建一台Slave 服务器,将Slave 服务器设置为master_first的从库。
  3. 在master_first 创建一个student 表格,字段自拟。观察master_second 和 slave 节点情况。
  4. 在master_second 节点插入一条student数据,观察master_first 和 slave 节点情况。

将log-slave-updates 配置为ON重复上述实验。