复制的基本原则

MySQL复制过程分为三步:

  • Master将改变记录到二进制日志(Binary Log)。这些记录过程叫做二进制日志事件,Binary Log Events
  • Slave将Master的Binary Log Events拷贝到它的中继日志(Replay Log);
  • Slave重做中继日志中的事件,将改变应用到自己的数据库中。MySQL复制是异步且串行化的。

复制的最大问题

  • 每个Slave只有一个Master。
  • 每个Slave只能有一个唯一的服务器ID。
  • 每个Master可以有多个Salve。

一主一从配置

基本准备

  1. [root@parak home]# mkdir -p mysql-3307/conf mysql-3307/data mysql-3308/conf mysql-3308/data
  2. [root@parak home]# touch mysql-3307/conf/my.cnf mysql-3308/conf/my.cnf
  3. # Master配置文件
  4. [root@parak home]# vi mysql-3307/conf/my.cnf
  5. [mysqld]
  6. datadir = /var/lib/mysql
  7. server-id = 1
  8. log-bin = mysql-bin
  9. sql_mode=STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
  10. # Slave配置文件
  11. [root@parak home]# vi mysql-3308/conf/my.cnf
  12. [mysqld]
  13. datadir = /var/lib/mysql
  14. server-id = 2
  15. log-bin = mysql-bin
  16. sql_mode=STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION

Docker启动

mysql-3307用作Master

  1. docker run -d \
  2. -v /home/mysql-3307/conf/my.cnf:/etc/my.cnf \
  3. -v /home/mysql-3307/data:/var/lib/mysql \
  4. -p 3307:3306 \
  5. -e MYSQL_ROOT_PASSWORD=KAG1823 \
  6. --restart=always \
  7. --name mysql-3307 \
  8. mysql:8.0.20

mysql-3308用作Slave

  1. docker run -d \
  2. -v /home/mysql-3308/conf/my.cnf:/etc/my.cnf \
  3. -v /home/mysql-3308/data:/var/lib/mysql \
  4. -p 3308:3306 \
  5. -e MYSQL_ROOT_PASSWORD=KAG1823 \
  6. --restart=always \
  7. --name mysql-3308 \
  8. mysql:8.0.20

查看网络

查看bridge网络的所有容器:docker inspect bridgr

根据容器ID或者容器名称查询:docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称 | 容器id

  1. [root@parak ~]# docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql-3307
  2. 172.17.0.5
  3. [root@parak ~]# docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql-3308
  4. 172.17.0.6

mysql-3307的IP为:172.17.0.5

mysql-3308的IP为:172.17.0.6

Master配置

进入Master内部

  1. # 创建用户,用于Slave访问Master
  2. mysql> CREATE USER 'Khighness'@'%' IDENTIFIED WITH mysql_native_password BY 'KAG1823';
  3. Query OK, 0 rows affected (0.00 sec)
  4. mysql> GRANT REPLICATION SLAVE ON *.* TO 'Khighness'@'%';
  5. Query OK, 0 rows affected (0.00 sec)
  6. mysql> FLUSH PRIVILEGES;
  7. Query OK, 0 rows affected (0.00 sec)
  8. # 记录File和Position
  9. mysql> SHOW MASTER STATUS\G;
  10. *************************** 1. row ***************************
  11. File: mysql-bin.000003
  12. Position: 4440
  13. Binlog_Do_DB:
  14. Binlog_Ignore_DB:
  15. Executed_Gtid_Set:
  16. 1 row in set (0.00 sec)
  17. ERROR:
  18. No query specified

用户名:slave

File:mysql-bin.000003

Position:4440

Slave配置

进入Slave内部

  1. mysql> CHANGE MASTER TO
  2. -> MASTER_HOST='172.17.0.5',
  3. -> MASTER_PORT=3307,
  4. -> MASTER_USER='Khighness',
  5. -> MASTER_PASSWORD='KAG1823',
  6. -> MASTER_LOG_FILE='mysql-bin.000003',
  7. -> MASTER_LOG_POS=4440;
  8. Query OK, 0 rows affected, 2 warnings (0.02 sec)
  9. mysql> START SLAVE;
  10. Query OK, 0 rows affected (0.01 sec)