复制的基本原则
MySQL复制过程分为三步:
- Master将改变记录到二进制日志(Binary Log)。这些记录过程叫做二进制日志事件,
Binary Log Events; - Slave将Master的
Binary Log Events拷贝到它的中继日志(Replay Log); - Slave重做中继日志中的事件,将改变应用到自己的数据库中。MySQL复制是异步且串行化的。
复制的最大问题
- 每个Slave只有一个Master。
- 每个Slave只能有一个唯一的服务器ID。
- 每个Master可以有多个Salve。
一主一从配置
基本准备
[root@parak home]# mkdir -p mysql-3307/conf mysql-3307/data mysql-3308/conf mysql-3308/data[root@parak home]# touch mysql-3307/conf/my.cnf mysql-3308/conf/my.cnf# Master配置文件[root@parak home]# vi mysql-3307/conf/my.cnf[mysqld]datadir = /var/lib/mysqlserver-id = 1log-bin = mysql-binsql_mode=STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION# Slave配置文件[root@parak home]# vi mysql-3308/conf/my.cnf[mysqld]datadir = /var/lib/mysqlserver-id = 2log-bin = mysql-binsql_mode=STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
Docker启动
mysql-3307用作Master
docker run -d \-v /home/mysql-3307/conf/my.cnf:/etc/my.cnf \-v /home/mysql-3307/data:/var/lib/mysql \-p 3307:3306 \-e MYSQL_ROOT_PASSWORD=KAG1823 \--restart=always \--name mysql-3307 \mysql:8.0.20
mysql-3308用作Slave
docker run -d \-v /home/mysql-3308/conf/my.cnf:/etc/my.cnf \-v /home/mysql-3308/data:/var/lib/mysql \-p 3308:3306 \-e MYSQL_ROOT_PASSWORD=KAG1823 \--restart=always \--name mysql-3308 \mysql:8.0.20
查看网络
查看bridge网络的所有容器:docker inspect bridgr
根据容器ID或者容器名称查询:docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称 | 容器id
[root@parak ~]# docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql-3307172.17.0.5[root@parak ~]# docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql-3308172.17.0.6
mysql-3307的IP为:172.17.0.5
mysql-3308的IP为:172.17.0.6
Master配置
进入Master内部
# 创建用户,用于Slave访问Mastermysql> CREATE USER 'Khighness'@'%' IDENTIFIED WITH mysql_native_password BY 'KAG1823';Query OK, 0 rows affected (0.00 sec)mysql> GRANT REPLICATION SLAVE ON *.* TO 'Khighness'@'%';Query OK, 0 rows affected (0.00 sec)mysql> FLUSH PRIVILEGES;Query OK, 0 rows affected (0.00 sec)# 记录File和Positionmysql> SHOW MASTER STATUS\G;*************************** 1. row ***************************File: mysql-bin.000003Position: 4440Binlog_Do_DB:Binlog_Ignore_DB:Executed_Gtid_Set:1 row in set (0.00 sec)ERROR:No query specified
用户名:slave
File:mysql-bin.000003
Position:4440
Slave配置
进入Slave内部
mysql> CHANGE MASTER TO-> MASTER_HOST='172.17.0.5',-> MASTER_PORT=3307,-> MASTER_USER='Khighness',-> MASTER_PASSWORD='KAG1823',-> MASTER_LOG_FILE='mysql-bin.000003',-> MASTER_LOG_POS=4440;Query OK, 0 rows affected, 2 warnings (0.02 sec)mysql> START SLAVE;Query OK, 0 rows affected (0.01 sec)
