使用Docker在容器中实现mysql主从复制

docker部分:

1.安装docker:docker安装及命令请自行参考docker文档:点击前往

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

2.获取mysql镜像,官方镜像地址:点击前往(需注册)

docker pull mysql:5.7 (5.7 为镜像版本号,可以指定版本,不填默认最新版)


3.启动容器并绑定端口

Master(主):

docker run -p 3339:3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7


Slave(从):

docker run -p 3340:3306 --name mysql-child -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

Master对外映射的端口是3339,Slave对外映射的端口是3340。因为docker容器是相互独立的,每个容器有其独立的ip,所以不同容器使用相同的端口并不会冲突。这里我们应该尽量使用mysql默认的3306端口,否则可能会出现无法通过ip连接docker容器内mysql的

(以上的123456的密码可自行替换成自己想要设置的root密码,mysql后的5.7位mysql版本,可自行替换成自己的镜像版本)。

使用docker ps命令查看正在运行的容器:

4.进入容器并进行相关配置

docker exec -it mysql-master /bin/bash 进入主库容器

也可以通过docker exec -it bc926e597fc8/bin/bash命令进入。

bc926e597fc8是容器的id,而mysql-master是容器的名称。

进入mysql配置目录

cd  /etc/mysql

cd /etc/mysql切换到/etc/mysql目录下,然后vi my.cnf对my.cnf进行编辑。此时会报出bash: vi: command not found,需要我们在docker容器内部自行安装vim。使用apt-get install vim命令安装vim

出现问题:

执行apt-get update,然后再次执行apt-get install vim即可成功安装vim。然后我们就可以使用vim编辑my.cnf,在my.cnf中添加

(注:是my.cnf !!! 是my.cnf !!! 是my.cnf !!! 重要的事情说三遍,不是my.conf !!!)

打开后是这样的:

切换到英文模式下按    i    键,进入编辑:添加这两行

主容器:

server-id=100  ## 设置server_id,注意要唯一

log-bin=mysql-bin ## 开启二进制日志功能

从容器:

server-id=101 ## 设置server_id,注意要唯一

log-bin=mysql-slave-bin ## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用

relay_log=edu-mysql-relay-bin   ## relay_log配置中继日志

你也可以指定复制某一个数据库:replicate-do-db=库名

你也可以指定复制某一个数据表:replicate-do-table=表名

编辑完成后输入按一下esc键 继续使用键盘输入:wq 后回车 (保存并退出编辑)

配置完成之后,需要重启使配置生效。

重启主容器依次执行:docker stop mysql-master      docker start mysql-master

重启从容器依次执行:docker stop mysql-child      docker start mysql-child

下一步在Master数据库创建数据同步用户,授予用户 slave REPLICATION SLAVE权限和REPLICATION CLIENT权限,用于在主从库之间同步数据。

CREATE USER 'slave'@'%' IDENTIFIED BY '123456';

GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';

slave为同步使用的用户名,可自行取值,123456为用户密码可自行配置

在Master进入mysql

使用 mysql -uroot -p 登录mysql 回车后输入密码 回车登录

执行show master status(记住这里的file 和 position 后面会用到,在后面的操作完成之前,需要保证Master库不能做任何操作,否则将会引起状态变化,File和Position字段的值变化)

另起一个命令面板进入mysql-child容器

查看Master的地址,指的是容器的独立ip

docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称|容器id  ##查询容器的ip

在Slave 中进入 mysql,执行

change master to master_host='172.17.0.2', master_user='slave', master_password='123456', master_port=3306, master_log_file='mysql-bin.000002', master_log_pos= 359, master_connect_retry=30;

## 172.17.0.2 上面执行 docker inspect --format='{{.NetworkSettings.IPAddress}}'  mysql-matser 的 返回值

## mysql-bin.000002 上面执行 show master status 中的 file 值

## 359 上面执行 show master status 中的 position 值

## slave 访问master库的用户名

## 123456 访问master库的密码

5.开启主从复制

start slave ## 开始主从复制

查看主从复制状态

show slave status \G;

SlaveIORunning 和 SlaveSQLRunning 都是Yes,说明主从复制已经开启。此时可以测试数据同步是否成功。

使用start slave开启主从复制过程后,如果SlaveIORunning一直是Connecting,则说明主从复制一直处于连接状态,这种情况一般是下面几种原因造成的,我们可以根据 Last_IO_Error提示予以排除。

网络不通:检查ip,端口

密码不对:检查用户名和密码是否正确

pos不对:检查Master的 Position

测试主从复制最简单方法就是在Master创建一个数据库,然后检查Slave是否存在此数据库。

主库创建数据库:

从库查询数据库:

至此结束!

## ps:主从复制所带来的的延迟,请各位看官移步百度,转载请注明原处!。

你可能感兴趣的:(使用Docker在容器中实现mysql主从复制)