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:主从复制所带来的的延迟,请各位看官移步百度,转载请注明原处!。