一、主从复制

1、一主多从搭建

1.1、启动 mysql docker-compose.yml

  1. version: "3"
  2. services:
  3. mysql_master:
  4. container_name: mysql_master
  5. image: 'mysql:8.0'
  6. volumes:
  7. - ./data/master:/var/lib/mysql
  8. - ./conf/master/master.cnf:/etc/mysql/master.cnf
  9. environment:
  10. - MYSQL_ROOT_PASSWORD=${MYSQL_MASTER_ROOT_PASSWORD}
  11. ports:
  12. - "3306:3306"
  13. restart: always
  14. networks:
  15. - mysql-replicanet
  16. mysql_slave_1:
  17. image: 'mysql:8.0'
  18. container_name: mysql_slave_1
  19. volumes:
  20. - ./data/slave1:/var/lib/mysql
  21. - ./conf/slave1/master.cnf:/etc/mysql/slave.cnf
  22. environment:
  23. - MYSQL_ROOT_PASSWORD=${MYSQL_SLAVE_ROOT_PASSWORD}
  24. ports:
  25. - "4401:3306"
  26. restart: always
  27. networks:
  28. - mysql-replicanet
  29. mysql_slave_2:
  30. image: 'mysql:8.0'
  31. container_name: mysql_slave_2
  32. volumes:
  33. - ./data/slave2:/var/lib/mysql
  34. - ./conf/slave2/master.cnf:/etc/mysql/slave.cnf
  35. environment:
  36. - MYSQL_ROOT_PASSWORD=${MYSQL_SLAVE_ROOT_PASSWORD}
  37. ports:
  38. - "4402:3306"
  39. restart: always
  40. networks:
  41. - mysql-replicanet
  42. networks:
  43. mysql-replicanet:
  44. driver: bridge

1.2、master.cnf 配置

  1. [mysqld]
  2. # ###################################################
  3. # 主主复制配置
  4. #
  5. # 如果当前实例既做主库又做从库次选线必须开启
  6. # log-slave-updates = true
  7. # 自增长ID
  8. # 特殊说明 当该实例为双主的架构时要特殊配置 以避免自增id冲突的问题
  9. # auto_increment_offset = 1
  10. # auto_increment_increment = 2
  11. # ####################################################
  12. default_authentication_plugin=mysql_native_password
  13. secure_file_priv=/var/lib/mysql
  14. # [必须]服务器唯一ID,默认是1,一般取IP最后一段
  15. server-id=1
  16. # [必须]启用二进制日志
  17. log-bin=mysql-bin
  18. # 复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步)
  19. binlog-ignore-db=mysql
  20. [client]
  21. default-character-set=utf8mb4
  22. [mysql]
  23. default-character-set=utf8mb4

1.3、slave.cnf 配置

  1. [mysqld]
  2. # ###################################################
  3. # 主主复制配置
  4. #
  5. # 如果当前实例既做主库又做从库次选线必须开启
  6. # log-slave-updates = true
  7. # 自增长ID
  8. # 特殊说明 当该实例为双主的架构时要特殊配置 以避免自增id冲突的问题
  9. # auto_increment_offset = 2
  10. # auto_increment_increment = 2
  11. # ####################################################
  12. default_authentication_plugin=mysql_native_password
  13. secure_file_priv=/var/lib/mysql
  14. # [必须]服务器唯一ID,默认是1,一般取IP最后一段
  15. server-id=2
  16. # [必须]启用二进制日志
  17. log-bin=mysql-bin
  18. # 复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步)
  19. binlog-ignore-db=mysql
  20. #只读
  21. read-only=1
  22. [client]
  23. default-character-set=utf8mb4
  24. [mysql]
  25. default-character-set=utf8mb4

1.4、进入master配置同步账号和权限

  1. # 进入docker 容器
  2. docker exec -it mysql_master bash
  3. # 进入mysql
  4. mysql -uroot -p${MYSQL_ROOT_PASSWORD}
  5. # 修改远程访问(可选)
  6. use mysql;
  7. ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'password';
  8. FLUSH PRIVILEGES;
  9. # 添加同步账号和权限
  10. CREATE USER 'slave'@'%' identified WITH mysql_native_password BY '123456';
  11. grant replication slave,replication client on *.* to 'slave'@'%';
  12. flush privileges;

1.5、获取主数据库 binlog 日志状态

  1. show master status;
  2. File |Position|Binlog_Do_DB|Binlog_Ignore_DB |Executed_Gtid_Set|
  3. ----------------|--------|------------|------------------------|-----------------|
  4. mysql-bin.000004| 156| |mysql,information_schema| |

1.6、在 slave 中配置主机信息

  • master_port:Master的端口号,指的是容器的端口号
  • master_user:用于数据同步的用户
  • master_password:用于同步的用户的密码
  • master_log_file:指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值
  • master_log_pos:从哪个 Position 开始读,即上文中提到的 Position 字段的值
  • master_connect_retry:如果连接失败,重试的时间间隔,单位是秒,默认是60秒 ```shell

    进入MySQL后执行

首先停止数据同步相关的线程: slave I/O 线程和 slave SQL 线程

STOP SLAVE ;

为了避免可能发生的错误,直接重置客户端

RESET SLAVE ;

CHANGE MASTER TO MASTER_HOST=’mysql_master’, MASTER_USER=’slave’, MASTER_PASSWORD=’123456’, MASTER_LOG_FILE=’mysql-bin.000004’, MASTER_LOG_POS=156;

启动slaver 服务

START SLAVE ;

查看从数据库的状态

SHOW SLAVE STATUS ;

看到以下两列 为Yes ,证明连接成功

Slave_IO_Running |Yes
Slave_SQL_Running |Yes

  1. <a name="vwVMy"></a>
  2. ### 2、双主复制搭建
  3. <a name="UKR4F"></a>
  4. #### 2.1、配置
  5. - 在一主多从的配置中,添加配置
  6. ```shell
  7. # ###################################################
  8. # 主主复制配置
  9. #
  10. # 如果当前实例既做主库又做从库次选线必须开启
  11. log-slave-updates = true
  12. # 自增长ID
  13. # 特殊说明 当该实例为双主的架构时要特殊配置 以避免自增id冲突的问题
  14. auto_increment_offset = 2
  15. auto_increment_increment = 2
  16. # ####################################################

2.2、配置复制账号

  1. CREATE USER 'slave'@'%' identified WITH mysql_native_password BY '123456';
  2. grant replication slave,replication client on *.* to 'slave'@'%';
  3. flush privileges;

2.3、两台主 mysql 都配置各自主 mysql 信息

  1. # 首先停止数据同步相关的线程: slave I/O 线程和 slave SQL 线程
  2. STOP SLAVE ;
  3. # 为了避免可能发生的错误,直接重置客户端
  4. RESET SLAVE ;
  5. CHANGE MASTER TO
  6. MASTER_HOST='mysql_master',
  7. MASTER_USER='slave',
  8. MASTER_PASSWORD='123456',
  9. MASTER_LOG_FILE='mysql-bin.000004',
  10. MASTER_LOG_POS=156;
  11. #启动slaver 服务
  12. START SLAVE ;
  13. # 查看从数据库的状态
  14. SHOW SLAVE STATUS ;

3、主从复制:GTID 复制模式

4、主从复制原理

4.1、MySQL 主从复制主流架构模型

  • 一主一从 / 一主多从
    • 当 Slave 增加到一定数量时,Slave 对 Master 的负载以及网络带宽都会成为一个严重的问题
  • 多主一从
    • 双主适用于写压力比较大的业务场景,或者 DBA 做维护需要主从切换的场景,通过双主架构避免了重复搭建从库的麻烦
  • 双主复制
  • 级联复制
    • 部分 slave 节点连接到它上一级的从节点上,用于减轻主库的压力。
    • 级联复制解决了一主多从场景下多个从库复制对主库的压力,带来的弊端就是数据同步延迟比较大。

4.2、涉及到三个线程

  • 一个在主节点的线程:log dump thread
  • 从库会生成两个线程:一个 I/O 线程,一个 SQL 线程

image.png

  • 主节点
    • 1、当主节点上进行 insert、update、delete 操作时,会按照时间先后顺序写入到 binlog 中;
    • 2、当从节点连接到主节点时,主节点会创建一个叫做 binlog dump 的线程;
    • 3、一个主节点有多少个从节点,就会创建多少个 binlog dump 线程;
    • 4、当主节点的 binlog 发生变化的时候,也就是进行了更改操作,binlog dump 线程就会通知从节点 (Push模式),并将相应的 binlog 内容发送给从节点;
  • 从节点

    • I/O线程: 此线程连接到主节点,主节点上的 binlog dump 线程会将 binlog 的内容发送给此线程。此线程接收到 binlog 内容后,再将内容写入到本地的 relay log。
    • SQL线程: 该线程读取 I/O 线程写入的 relay log,并且根据 relay log 的内容对从数据库做对应的操作。

      5、问题

      5.1、主从延迟问题

      5.2、主从不一致问题

  • 使用percona-toolkit工具辅助。

  • 手动重建不一致的表。

    • 1、从库停止Slave复制 mysql>stop slave;
    • 2、在主库上dump 表,并记录下同步的binlog和POS点
    • 3、找出记录的binlog和POS点
    • 4、在Slave机器上,重做Change master to指向
    • 5、Slave机器上,导入 主库 dump 的表
    • 6、从库开始 Slave 复制

      5.3、主库或者从库意外宕机引起的错误

      MMM 数据库高可用架构

  • (Master-Master replication manager for MySQL)

    MHA 数据库高可用架构

  • (MySQL Master High Availability)

keepalive 故障转移

Mysql Group Replication

Mysql InnoDB Cluster

参考