1、准备环境
CentOS 7.2 64位 (CentOS-7-x86_64-DVD-1511.iso)
MySQL 10.244.87.144/library/mysql5.7/centos7.3:0.4(此为内网的镜像,根据实际需要进行选择镜像地址)
Docker 1.13.1
2、安装Docker
执行命令: yum –y install docker
安装成功后,查看Docker版本,执行命令: docker version
3、启动Docker
执行命令: systemctl start docker
=====================================================================================================================
如果命令执行之后,错误信息中出现如” SELinux is not supported with the overlay2 graph driver on this kernel错误-yellowcong”,
原因是此linux的内核中的SELinux不支持 overlay2 graph driver ,解决方法有两个,要么启动一个新内核,要么就在docker里禁用selinux,–selinux-enabled=false
=====================================================================================================================
启动成功之后,将Docker设置为开机启动,
执行命令:systemctl enable docker
4、安装MySQL
使用Docker拉取MySQL镜像,镜像地址: 10.244.87.144/library/mysql5.7/centos7.3:0.4
=====================================================================================================================
在拉取之前,需要做些配置并登陆成功才能拉取到内网的镜像。
执行命令:vi /etc/docker/daemon.json ,加入如下内容,并且保存退出
{
"insecure-registries":["10.244.87.144","10.37.218.29:5000"]
}
如果/etc/docker/下不存在daemon.json文件,则创建之后再加入以上内容。
执行重启Docker命令:
systemctl stop docker
systemctl daemon-reload 按照上步提示sss
systemctl start docker
执行登陆命令: docker login 10.244.87.144, 用户名和密码都是输入admin,确保登录成功。
如果是在minikube环境中,此时如果还不能登陆成功,
执行命令:vi /usr/lib/systemd/system/docker.service
把红色圈起来的这一行只保留这么多就可以了,其他的删掉。然后重启docker服务
重启方式:
systemctl stop docker
systemctl daemon-reload 按照上步提示
systemctl start docker
重新连接
=====================================================================================================================
执行Pull命令: docker pull 10.244.87.144/library/mysql5.7/centos7.3:0.4
5、运行主从容器
执行命令:
docker run --name master -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d 10.244.87.144/library/mysql5.7/centos7.3:0.4
docker run --name slave1 -p 3307:3306 -e MYSQL_ROOT_PASSWORD=root -d 10.244.87.144/library/mysql5.7/centos7.3:0.4
docker run --name slave2 -p 3308:3306 -e MYSQL_ROOT_PASSWORD=root -d 10.244.87.144/library/mysql5.7/centos7.3:0.4
--name 为容器指定名称,这里是master
-p 将容器的指定端口映射到主机的指定端口,这里是将容器的3306端口映射到主机的3306端口
-e 设置环境变量,这里是指定root账号的密码为admin
-d 后台运行容器,并返回容器ID
执行命令:docker ps –a, 显示所有的容器,检验master容器是否启动成功,注意status是UP状态,才表示正在运行中
开放3306端口
执行命令:
firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --reload
systemctl restart firewalld.service
--permanent 表示永久开启,避免下次开机需要再次手动开启端口
6、修改MySQL配置环境
进入容器,执行命令:docker exec -it master /bin/bash
查看my.cnf路径,执行命令:find / -name 'my.cnf'
找到路径后,
如果容器内部支持”vi”命令,则可以直接修改,如果不支持,则复制出去修改之后再复制回来
docker cp master:/etc/mysql/my.cnf /usr/local/mysql/master/my.cnf
docker cp /usr/local/mysql/master/my.cnf master: /etc/mysql/my.cnf
修改my.cnf,在 [mysqld] 节点最后加上
log-bin=mysql-bin
server-id=1
两个必须都加上,不能遗漏,而且必须放在[mysqld] 节点最后,修改后保存退出。
log-bin=mysql-bin 使用binary logging,mysql-bin是log文件名的前缀
server-id=1唯一服务器ID,非0整数,不能和其他服务器的server-id重复
退出容器,执行命令: exit
重启MySQL的Docker,让配置生效
执行命令: docker restart master
启动后,重新测试连接,连接成功表示主容器配置成功
同样的方法配制从容器,需要注意的是server-id不能重复,同时也要注意下server-uuid也不能和主库重复,如果重复的话重新生成下(参见第8步的问题解决部分),并且配制完毕后需要重启容器。
7、创建主容器的复制账号
主库创建一个用户供从库登录主库进行数据同步。
在图形化界面中执行SQL:
SET sql_mode = (SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
GRANT REPLICATION SLAVE ON *.* to 'backup'@'%' IDENTIFIED BY '123456';
FLUSH PRIVILEGES;
查看授权是否成功
SHOW GRANTS for 'backup'@'%';
8、配置主从复制
使用Navicat连接从库后新建查询,执行以下SQL:
SET sql_mode = (SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
-- STOP SLAVE;
CHANGE MASTER TO
MASTER_HOST='192.168.248.129', -- 宿主机IP地址
MASTER_PORT=3306, -- 主容器的端口
MASTER_USER='backup', -- 主容器MysQL的用户名
MASTER_PASSWORD='123456', -- 主容器MysQL的密码
MASTER_LOG_FILE='mysql-bin.000001', -- 在主库中执行SHOW MASTER STATUS,将File列值填到此处
MASTER_LOG_POS=1985; -- 在主库中执行SHOW MASTER STATUS,将Position列值填到此处
START SLAVE;
=====================================================================================================================
如果执行以上语句报“[Err] 1794 - Slave is not configured or failed to initialize properly. You must at least set --server-id to enable either a master or a slave. Additional error messages can be found in the MySQL error log.”错误,
执行 show variables like 'server_id';
发现server_id为0,配置文件中的配置没有生效,经检查,log-bin=mysql-bin 和 server-id=2 一定要在 [mysqld] 节点下加上
=====================================================================================================================
语句执行完毕后,查看是否配置成功
继续在查询分析器中执行: SHOW SLAVE STATUS;
查看 Slave_IO_Running与Slave_SQL_Running
如果都是Yes,那么说明已经配置成功。
=====================================================================================================================
如果Slave_IO_Running是Connecting,查看下Last_IO_Error的报错信息,这种情况一般是1、网络不通 2、端口未映射 3 密码不对 4 pos不对
首先确保从库能访问到主库,在命令行里进行访问测试,
如果网络通畅密码正确,那么检查下第7步是否操作成功,如果第7步账号授权没问题,则再排查下端口问题,确保端口已经开放,并 执行了systemctl restart firewalld.service 命令,如果以上都没问题,再检查设置下pos 的位置要主库的一致。
如果Slave_IO_Running是No,查看一下Last_IO_Error列的信息,或者查看下错误日志,具体原因具体解决,比如可能会遇到” Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.”,这种情况是因为主库和从库的一个配置文件auto.cnf中的server-uuid节点发生了重复造成的,解决的方式就是重命名从库的auto.cnf文件,
然后重启mysql服务,再次查看slave的状态已经正常。
=====================================================================================================================
9、进行主从测试
在主库中新建一个数据库,再新建一个表,表里再随便插入一些数据,观察两个从库是否能同步操作及数据。