Docker也能实现主从复制,手把手教你

推荐你先看一下linux下mysql主从复制的详细步骤,以便于你能更好的理解下面的每一步操作
mysql主从复制详解

1.准备工作

准备一台装有docker的虚拟机
docker的安装步骤详解

1.关闭selinux,防火墙和清空iptables
[root@localhost ~]# systemctl stop firewalld 
[root@localhost ~]# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@localhost ~]# setenforce 0
[root@localhost ~]# iptables -F
2.拉取mysql镜像
[root@localhost ~]# docker pull mysql:5.7.25

如果你发现镜像拉取的非常慢,可以使用加速器。
docker加速器的配置

2.主服务器镜像的实现
[root@localhost ~]# mkdir mysql_master   #创建目录用来存放Dockerfile文件
[root@localhost ~]# cd mysql_master/
[root@localhost mysql_master]# vim Dockerfile   #添加以下内容
From mysql:5.7.25
MAINTAINER yjssjm yjssjm@aliyun.com

ENV MYSQL_ALLOW_EMPTY_PASSWORD yes
COPY modify_file.sh /mysql/modify_file.sh
COPY set_mysql.sql /mysql/set_mysql.sql
CMD ["sh", "/mysql/modify_file.sh"]
=========================================================================
核心逻辑就是拷贝两个文件进去,然后在容器启动的时候执行modify_file.sh,
由 modify_file.sh 执行set_mysql.sql文件。
前两行是信息描述,用的是mysql:5.7.25的镜像
ENV MYSQL_ALLOW_EMPTY_PASSWORD yes     #设置免密登录,为了下面进入数据库更容易
#拷贝两个文件,
# modify_file.sh的内容是修改配置文件
# set_mysql.sql的内容是设置密码和创建并授权用户
COPY modify_file.sh /mysql/modify_file.sh  
COPY set_mysql.sql /mysql/set_mysql.sql
CMD ["sh", "/mysql/modify_file.sh"]     #执行代码
=========================================================================
[root@localhost mysql_master]# vim modify_file.sh  #添加以下代码
#!/bin/bash
set -e
echo '1. set server_id....'
sed -i '/\[mysqld\]/a server-id=1\nlog-bin=/var/log/mysql/mysql-bin\ngtid-mode=ON\nenforce-gtid-consistency=ON' /etc/mysql/mysql.conf.d/mysqld.cnf
echo '2. start mysql...'
service mysql start
echo '3. setting password...'
sed -i 's/MYSQLROOTPASSWORD/'$MYSQL_ROOT_PASSWORD'/' /mysql/set_mysql.sql
sed -i 's/MYSQLREPLICATIONUSER/'$MYSQL_REPLICATION_USER'/' /mysql/set_mysql.sql
sed -i 's/MYSQLREPLICATIONPASSWORD/'$MYSQL_REPLICATION_PASSWORD'/' /mysql/set_mysql.sql
mysql < /mysql/set_mysql.sql
echo '4. service mysql status'
echo 'mysql for yjssjm if ready...'
tail -f /dev/null
=========================================================================
echo 是为了方便看信息以及排错
第一个sed -i  是设置server-id以及开启二进制日志
后面的sed -i  是启动容器时获取的变量
tail -f /dev/null    防止进程挂掉
=========================================================================
[root@localhost mysql_master]# vim set_mysql.sql #添加以下内容
use mysql;
set password for root@'localhost' = password("MYSQLROOTPASSWORD");
grant all on *.* to "MYSQLREPLICATIONUSER"@'%' identified by "MYSQLREPLICATIONPASSWORD" with grant option;
flush privileges;
=========================================================================
这个文件是对 MySQL 进行一些权限配置,比如设置用户密码,创建新用户,数据库授权等
use mysql;  #用户是存放在mysql库的user表里面的
set password for root@'localhost' = password("MYSQLROOTPASSWORD");  #设置root密码
grant all on *.* to "MYSQLREPLICATIONUSER"@'%' identified by "MYSQLREPLICATIONPASSWORD" with grant option;   #创建用户密码并授权
flush privileges;    #刷新
=========================================================================
[root@localhost mysql_master]# ls
Dockerfile  modify_file.sh  set_mysql.sql
[root@localhost mysql_master]# docker build -t mysql-master:v1 .     #构建镜像
Sending build context to Docker daemon  4.608kB
Step 1/6 : From mysql:5.7.25
 ---> 98455b9624a9
Step 2/6 : MAINTAINER yjssjm yjssjm@aliyun.com
 ---> Running in 4053c380c91f
Removing intermediate container 4053c380c91f
 ---> 3b549fcb3fc3
Step 3/6 : ENV MYSQL_ALLOW_EMPTY_PASSWORD yes
 ---> Running in ac27438b17ac
Removing intermediate container ac27438b17ac
 ---> d947010baa60
Step 4/6 : COPY modify_file.sh /mysql/modify_file.sh
 ---> 538441b32558
Step 5/6 : COPY set_mysql.sql /mysql/set_mysql.sql
 ---> 4002252ab7e8
Step 6/6 : CMD ["sh", "/mysql/modify_file.sh"]
 ---> Running in 7326f27387a7
Removing intermediate container 7326f27387a7
 ---> 7322b9343734
Successfully built 7322b9343734
Successfully tagged mysql-master:v1
启动容器:
[root@localhost mysql_master]# docker run  --name my_mysql -e MYSQL_ROOT_PASSWORD="1" -e MYSQL_REPLICATION_USER="yjssjm"  -e MYSQL_REPLICATION_PASSWORD="1"  -d mysql-master:v1
5445abea89563e7545bfdc1d811e757d8b9310fe6cf548fef40397d0400f6c72
进入容器:
[root@localhost mysql_master]# docker exec -it my_mysql bash
从容器里面进入数据库
root@5445abea8956:/# mysql -uroot -p1
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.25-log MySQL Community Server (GPL)

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> select * from mysql.user where user='yjssjm'\G     #查看权限
*************************** 1. row ***************************
                  Host: %
                  User: yjssjm
           Select_priv: Y

mysql-master镜像创建成功

3.从服务器镜像的实现
[root@localhost ~]# mkdir mysql_slave   #创建目录用来存放Dockerfile文件
[root@localhost ~]# cd mysql_slave/
[root@localhost mysql_slave]# vim Dockerfile   #添加以下内容
From mysql:5.7.25
MAINTAINER yjssjm yjssjm@aliyun.com

ENV MYSQL_ALLOW_EMPTY_PASSWORD yes
COPY modify_file.sh /mysql/modify_file.sh
COPY set_mysql.sql /mysql/set_mysql.sql
CMD ["sh", "/mysql/modify_file.sh"]
[root@localhost mysql_slave]# vim modify_file.sh  #添加以下代码
#!/bin/bash
set -e
echo '1. set server_id...'
RAND="$(date +%s | rev | cut -c 1-2)$(echo ${RANDOM})"
sed -i '/\[mysqld\]/a server-id='$RAND'\nlog-bin=/var/log/mysql/mysql-bin\ngtid-mode=ON\nenforce-gtid-consistency=ON' /etc/mysql/mysql.conf.d/mysqld.cnf
echo '2. start mysql...'
service mysql start
echo '3. setting password...'
sed -i 's/MYSQLROOTPASSWORD/'$MYSQL_ROOT_PASSWORD'/' /mysql/set_mysql.sql
sed -i 's/MYSQLMASTERSERVICEHOST/'$MYSQL_MASTER_SERVICE_HOST'/' /mysql/set_mysql.sql
sed -i 's/MYSQLREPLICATIONUSER/'$MYSQL_REPLICATION_USER'/' /mysql/set_mysql.sql
sed -i 's/MYSQLREPLICATIONPASSWORD/'$MYSQL_REPLICATION_PASSWORD'/' /mysql/set_mysql.sql
mysql < /mysql/set_mysql.sql
echo '4. service mysql status'
echo 'mysql for yjssjm if ready...'
tail -f /dev/null
[root@localhost mysql_slave]# vim set_mysql.sql #添加以下内容
use mysql;
set password for root@'localhost' = password('MYSQLROOTPASSWORD');
flush privileges;
CHANGE MASTER TO master_host='MYSQLMASTERSERVICEHOST', master_user='MYSQLREPLICATIONUSER', master_password='MYSQLREPLICATIONPASSWORD' ;
START SLAVE;

制作镜像:
[root@localhost mysql_slave]# docker build -t mysql-slave .
Sending build context to Docker daemon  4.608kB
Step 1/6 : From mysql:5.7.25
 ---> 98455b9624a9
Step 2/6 : MAINTAINER yjssjm yjssjm@aliyun.com
 ---> Using cache
 ---> 3b549fcb3fc3
Step 3/6 : ENV MYSQL_ALLOW_EMPTY_PASSWORD yes
 ---> Using cache
 ---> d947010baa60
Step 4/6 : COPY modify_file.sh /mysql/modify_file.sh
 ---> 3de921a04bd8
Step 5/6 : COPY set_mysql.sql /mysql/set_mysql.sql
 ---> a975955612a6
Step 6/6 : CMD ["sh", "/mysql/modify_file.sh"]
 ---> Running in 6f9015330329
Removing intermediate container 6f9015330329
 ---> f7e5fe492d83
Successfully built f7e5fe492d83
Successfully tagged mysql-slave:latest

查看mysql-master的容器IP:
[root@localhost mysql_slave]# docker inspect my_mysql |grep IPAddr
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.3",
                    "IPAddress": "172.17.0.3",

启动容器:
[root@localhost mysql_slave]# docker run  --name my_mysql2 -e MYSQL_ROOT_PASSWORD="1" -e MYSQL_MASTER_SERVICE_HOST="172.17.0.3" -e MYSQL_REPLICATION_USER='yjssjm' -e MYSQL_REPLICATION_PASSWORD="1"   -d mysql-slave
d28db0864c484a6dc312fba8d3d97381568fd1d74733f99ad097b1819b61dd4c

测试:
再打开一个标签,分别进入master容器的数据库和slave容器的数据库
在这里插入图片描述
创建一个库进行测试
在这里插入图片描述
成功
一主多从我们主需要再起n个从服务器的容器就行了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值