docker搭建mysql主从复制
1.拉取mysql镜像
docker pull mysql:5.7.28
2.启动容器
master(主):`
dcoker run -dit --name mysql-master -p 3306:3306 -e MYSQL_ROOT_PASSWORD=admin mysql:5.7.28`
slave(从): `
dcoker run -dit --name mysql-slave -p 3307:3306 -e MYSQL_ROOT_PASSWORD=admin mysql:5.7.28`
-p 映射主机端口 主机端口:容器端口
-e 设置环境变量,这里是指定root账号的密码为admin
-d 后台运行容器,并返回容器ID
可用navicat测试连接,若连接失败,查看防火墙状态和端口状态
查看防火墙状态:firewall-cmd --state
查看开放的端口:firewall-cmd --zone=public --list-port
如果端口未开放,执行firewall-cmd --permanent --zone=public --add-port=3306/tcp
–permanent 表示永久打开,避免重启后再次执行
3.容器配置
进入容器:docker exec -it mysql-master /bin/bash
master:
cd /etc/mysql
vim my.cnf
注:如果不能使用vim,先安装vim:
apt-get update
apt-get install vim
可以将此操作打包成新的镜像,避免多个从服务器反复执行安装操作:
docker commit -m "install vim" mysql-master mysql:5.7
(tag可以自定义),然后删除之前的容器重新启动
在my.cnf中添加如下配置:
[mysqld]
#同一局域网内唯一
server-id=1
#开启二进制日志功能
log-bin=master-bin
配置完成后,重启mysql服务:service mysql restart
,
重启mysql会使容器停止,重启容器:docker start mysql-master
,所以在启动容器时不要使用–rm参数(容器停止后删除容器)
下一步在Master数据库创建数据同步用户,授予用户 slave REPLICATION SLAVE权限和REPLICATION CLIENT权限,用于在主从库之间同步数据:
CREATE USER 'slave'@'%' IDENTIFIED BY 'slave';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
slave:
步骤和master一样,配置文件添加
[mysqld]
#同一局域网内唯一
server-id=2
#开启二进制日志功能,可以随便取(关键)
log-bin=slave-bin
此处过程省略。。。
4.链接master和slave
在master中进入mysql
master/mysql> show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000002 | 154 | | | |
+-------------------+----------+--------------+------------------+-------------------+
File和Position字段的值后面将会用到,在后面的操作完成之前,需要保证Master库不能做任何操作,否则将会引起状态变化,File和Position字段的值变化。
在slave中进入mysql
slave/mysql> change master to
-> master_host='172.17.0.2',
-> master_user='slave',
-> master_password='slave',
-> master_port=3306,
-> master_log_file='master-bin.000002',
-> master_log_pos=154,
-> master_connect_retry=30;
命令说明:
master_host:master的地址,指的是容器的独立ip,可以通过如下命令查询
docker inspect --format='{{.NetworkSettings.IPAddress}}' container_name|container_id
master_port:master的端口号,指的是容器的端口号
master_user:用于数据同步的用户
master_password:用于同步的用户的密码
master_log_file:指定 slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值
master_log_pos:从哪个 Position 开始读,即上文中提到的 Position 字段的值
master_connect_retry:如果连接失败,重试的时间间隔,单位是秒,默认是60秒
在Slave 中的mysql终端,查看主从同步状态。
slave/mysql> show slave status \G;
其中这两项正常情况下为No,此时主从复制为关闭状态
Slave_IO_Running: No
Slave_SQL_Running: No
开启主从复制过程:
slave/mysql> start slave
再次查看同步状态,此时可见值已经变成Yes
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
可能错误:
Slave_IO_Running,Slave_SQL_Running 可能二者没有同时改变,考虑如下
在执行change命令时,各参数请参照自己的实际查询情况替换
5.测试结果
master/mysql> create database testdb;
Query OK, 1 row affected (0.01 sec)
master/mysql> show databases;
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| testdb |
+--------------------+
5 rows in set (0.01 sec)
slave/mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| testdb |
+--------------------+
5 rows in set (0.01 sec)
可见,master创建数据库testdb,slave同步创建了testdb