docker搭建mysql主从复制

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值