主从复制的流程:
1. 主服务器上面的任何修改都会通过自己的 I/O tread(I/O 线程)保存在二进制日志 Binary log 里面。
2. 从服务器上面也启动一个 I/O thread,通过配置好的用户名和密码, 连接到主服务器上面请求读取二进
制日志,然后把读取到的二进制日志写到本地的一个Realy log(中继日志)里面。
3. 从服务器上面同时开启一个 SQL thread 定时检查 Realy log(这个文件也是二进制的),如果发现有更新立即把更新的内容在本机的数据库上面执行一遍。
准备镜像
[root@localhost ~]# docker pull mysql:5.7
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7 f8fcde8b9ae2 3 days ago 449MB
docker run --name mysql-master --privileged=true -v /home/mysql/master-data:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=a123456. -d mysql:5.7
--privileged指定了当前容器是否真正的具有root权限,所谓的root权限是指具有宿主机的root权限,而不仅仅只是在容器内部有root权限;
-v指定了容器中指定目录挂载到宿主机上的某个目录,这样做的目的在于防止容器中配置的数据丢失,因为docker容器在重启之后是不会保留前一次在其内部运行的相关数据的;
-p表示宿主机上的某个端口映射到docker容器内的某个端口,这里也就是将宿主机的3306端口映射到容器内部的3306端口
-e表示指定当前容器运行的环境变量,该变量一般在容器内部程序的配置文件中使用,而在外部运行容器指定该参数。这里的MYSQL_ROOT_PASSWORD表示容器内部的MySQL的启动密码;
docker exec -it mysql-slave1 /bin/bash
apt-get update
apt-get install vim
vim /etc/mysql/my.cnf
[mysqld]
server-id=100 # 从的id要注意不要一致
log-bin=mysql-bin
service mysql restart
docker start mysql-master #重启容器
mysql -uroot -pmysql -uroot -pa123456.
grant replication slave on *.* to 'test'@'%' identified by '123456';
flush privileges; #刷新
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 154 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
记得以上File
信息 和 Position
信息 ,从服务器需要用到
docker run --name mysql-slave1 --privileged=true -v /home/mysql/slave1-data:/var/lib/mysql -p 3307:3306 --link mysql-master:master -e MYSQL_ROOT_PASSWORD=a123456. -d mysql:5.7
docker exec -it mysql-slave1 /bin/bash
apt-get update
apt-get install vim
vim /etc/mysql/my.cnf
[mysqld]
server-id=101 # 从的id要注意不要一致
service mysql restart
docker start mysql-master #重启容器
mysql -uroot -pa123456.
mysql> change master to master_host='master', master_user='test', master_password='123456', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos=154, master_connect_retry=30;
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
docker run --name mysql-slave2 --privileged=true -v /home/mysql/slave2-data:/var/lib/mysql -p 3308:3306 --link mysql-master:master -e MYSQL_ROOT_PASSWORD=a123456. -d mysql:5.7
docker exec -it mysql-slave1 /bin/bash
apt-get update
apt-get install vim
vim /etc/mysql/my.cnf
[mysqld]
server-id=102 # 从的id要注意不要一致
service mysql restart
docker start mysql-master #重启容器
mysql -uroot -pa123456.
mysql> change master to master_host='master', master_user='test', master_password='123456', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos=154, master_connect_retry=30;
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)