基于Docker的Mysql主从复制搭建
为什么基于Docker搭建?
- 资源有限
- 虚拟机搭建对机器配置有要求,并且安装mysql步骤繁琐
- 一台机器上可以运行多个Docker容器
- Docker容器之间相互独立,有独立ip,互不冲突
- Docker使用步骤简便,启动容器在秒级别
利用Docker搭建主从服务器(一主一从)
1、拉取镜像,以mysql 5.7版本为例
docker pull mysql:5.7
2、创建主机
docker run -p 3307:3306 --name mysql-master \
-v /usr/local/docker_data/mysql-master/log:/var/log/mysql \
-v /usr/local/docker_data/mysql-master/data:/var/lib/mysql \
-v /usr/local/docker_data/mysql-master/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=123456 \
--privileged=true \
-d mysql:5.7
3、创建从机
docker run -p 3308:3306 --name mysql-slave \
-v /usr/local/docker_data/mysql-slave/log:/var/log/mysql \
-v /usr/local/docker_data/mysql-slave/data:/var/lib/mysql \
-v /usr/local/docker_data/mysql-slave/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=123456 \
--privileged=true \
-d mysql:5.7
4、查看是否启动成功
5、修改配置文件
由于docker创建的myql下没有my.cnf文件,所以需要先创建my.cnf文件
/usr/local/docker_data/mysql-master/conf
touch my.cnf
vim my.cnf
对主机的my.cnf进行修改
[mysqld]
## 同一局域网内注意要唯一
server-id=100
## 开启二进制日志功能,可以随便取(关键)
log-bin=mysql-bin
#不同步的二进制数据库,如果不设置可以将其注释掉
binlog-ignore-db=information_schema
binlog-ignore-db=mysql
binlog-ignore-db=personalsite
binlog-ignore-db=test
同样需要对从机的my.cnf配置文件进行修改
/usr/local/docker_data/mysql-slave/conf
touch my.cnf
vim my.cnf
从机的my.cnf,【必须】从服务器唯一ID
[mysqld]
## 设置server_id,注意要唯一
server-id=101
## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
log-bin=mysql-slave-bin
## relay_log配置中继日志
relay_log=edu-mysql-relay-bin
#不同步的二进制数据库,如果不设置可以将其注释掉
binlog-ignore-db=information_schema
binlog-ignore-db=mysql
binlog-ignore-db=personalsite
binlog-ignore-db=test
6、重启主机和从机
docker restart mysql-master
docker restart mysql-slave
并docker ps检查容器是否启动,如果没有启动,绝大多数原因是配置文件中存在错误。
此时可以使用Navicat等工具测试连接mysql,方便后续操作的执行
7、链接Master(主)和Slave(从)
(1)链接主机mysql
(2)创建slave用户
创建用户名为slave,密码为123456的用户。并授予用户REPLICATION SLAVE权限和REPLICATION CLIENT权限,用于在主从库之间同步数据。
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
(3)刷新权限
flush privileges;
(4)全局锁库锁表,防止master状态有变更
FLUSH TABLES WITH READ LOCK;
(5)查看master状态
show master status;
记录下 File 和 Position 的值
(6)查看主机mysql容器的ip地址
docker inspect mysql-master
(6)链接从机mysql
(7)设置从机链接主机
注意:这里是直接连接docker里面的ip,所以端口应该是3306 ,如果是连接外面的代理端口 则应该是 宿主机ip:3307
change master to master_host='172.17.0.2', master_user='slave', master_password='123456', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos=1385;
master_log_file
和 master_log_pos
的值取上面 show master status;
的查询结果
master_log_pos 表示从某个点开始同步,如果需要同步之前的历史数据,需要找到对应的历史节点值
(8)从机开启复制功能
start slave;
(9)查询结果
show slave status;
主要看这两个值,如果 SlaveIORunning 和 SlaveSQLRunning 都是Yes 则表示连接成功,否则为失败
如果失败了可以看下面的日志提示
(10)重新配置主从连接
如果连接失败需要重新配置第(8)步,需要先停止复制功能
停止复制功能
stop slave
重置master
reset master
重新配置
change master to master_host='172.16.0.16', master_user='slave', master_password='123456', master_port=3307, master_log_file='mysql-bin.000001', master_log_pos=761;
启动复制功能
start slave
(11)如果连接成功,记得对主库进行解锁
UNLOCK TABLES;
解锁之后可以测试主从复制功能,在主机数据库创建表,插入数据,从机会自动同步
。。。。。。
(12)关闭主从复制功能
在从机mysql输入
stop slave;
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 奇怪的阿峰
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果