架构图

创建双写同步 Replication 集群 - 图1


双写同步 replication 集群

创建同步账号

  • 使用 root 账号进行创建

    CREATE USER ‘backup’@’%’ IDENTIFIED BY “Root666.”; GRANT super,reload,replication slave ON . TO ‘backup’@’%’; flush privileges;

双主都开启 binlog 和 relaylog

  1. [mysqld]
  2. ## 其他配置
  3. # 集群中 server_id 要求不一致
  4. server_id = 100
  5. # 开启 binlog 日志,并且设置 binlog 日志名称
  6. log_bin = mysql_bin
  7. # 中继日志。作为 replication 的从库时,会读取主库的 binlog 写入到 relay_log 中
  8. relay_log=relay_bin
  9. # 表示 slave 将复制事件写进自己的 binlog
  10. log_slave_updates
  11. ##主从复制的 格式 mixed,statement,row ,默认格式是 statement
  12. binlog_format=row
  13. ##############################################################################################
  14. ## gtid,可选
  15. ##############################################################################################
  16. gtid_mdoe=on
  17. ## gtid_mode 的前置条件
  18. enforce_gtid_consistency
  19. # log-slave-updates=on # 上面设置过了
  20. master_info_repository=TABLE
  21. relay_log_info_repository=TABLE
  22. ##############################################################################################
  23. ## 其他可选配置
  24. ##############################################################################################
  25. ##复制过滤: 指明需要备份的数据库,注意一条指令只能配置一个database
  26. # binlog-do-db=test
  27. ##复制过滤: 知名不需要备份的数据库 不输出 mysql 库 一般不同步)注意一条指令只能配置一个database
  28. # binlog-ignore-db=mysql
  29. ## 为每个 session 分配的内存,在事务过程中用来存储二进制日志的缓存
  30. binlog_cache_size=1M
  31. ## 二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。
  32. expire_logs_days=7
  33. ## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave 端复制中断。
  34. ## 如:1062 错误是指一些主键重复,1032 错误是因为主从数据库数据不一致
  35. slave_skip_errors=1062,1032

配置主从同步

  • 从库上执行 sql 语句

    STOP SLAVE; CHANGE MASTER TO master_host=’‘, master_port = ‘‘, master_user=’‘, master_password=’‘; START SLAVE;

  • 查看主从同步状态

    SHOW SLAVE STATUS; # 下方字段为 YES 表示成功

    image.png

  • 再另一台从库中也执行上述步骤,成为双向同步架构

主从同步状态异常

SHOW SLAVE STATUS;

image.png

  • 查看 error_log, cat /var/log/mysqld.log

    1. [ERROR] Slave I/O for channel '': Fatal error:
    2. The slave I/O thread stops because master and slave have equal MySQL server UUIDs;
    3. these UUIDs must be different for replication to work. Error_code: 1593
  • sql 中查看 show variables like '%server_uuid%'; 发现 UUID 的确一样

    • 因为两个虚拟机我是直接 copy 的,造成 UUID 一样
  • 解决
  • 找到 auto.cnf ,修改 server_uuid

    find / -name auto.cnf vim /var/lib/mysql/auto.cnf

  • 重启 mysql

    systemctl restart mysqld;

  • 然后再 sql 中再次执行

    STOP SLAVE; START SLAVE;


其他配置

  • 可以指定 3 个参数, 用于复制线程重连主库
    • master-retry-count
      • 需要在 Change Master 搭建主备复制时指定
    • master-connect-retry
      • 需要在 Change Master 搭建主备复制时指定
    • slave-net-timeout
      • 是一个全局变量,可以在 MySQL 运行时在线设置
  • todo 重试策略

配置 HaProxy 和 Keepalived

  • 和之前的类似
  • 该 replication 集群对外暴露一个虚拟 IP