使用 Docker 完成 MySQL 数据库主从配置

本文详细介绍如何使用Docker快速构建MySQL主从集群,包括Dockerfile编写、镜像构建及容器配置等步骤。

使用 docker 进行数据库主从配置,因为我有这个需求,而在网上搜索后发现没有满足我需求的相关实践文档,有的是一些
零零碎碎的文档,而且在参照这些文档进行部署的时候我还踩了许多坑。

因此根据我自己部署成功的经验,我写了这个文档。

使用 docker 自然就需要有 docker 环境,当然 docker 的镜像在国内访问比较慢,建议使用国内的源

构建 DockerFile

我们的工作是在 Mysql 镜像基础上进行的。

docker pull mysql:5.7.20 这条命令会下载最新的 mysql 镜像,当然也可以指定版本。

新建一个 DockerFile 文件:

FROM mysql:5.7.20
EXPOSE 3306
COPY my.cnf /etc/mysql/
CMD ["mysqld"]

在构建镜像前,我们需要 mysql 的配置文件 my.cnf ,可以先启动一个 mysql 的容器,然后进入容器复制它下来,并对其进行修改:

master 的my.cnf 如下:

!includedir /etc/mysql/conf.d/
[mysqld]
pid-file=/var/run/mysqld/mysqld.pid
socket=/var/run/mysqld/mysqld.sock
datadir=/var/lib/mysql
#log-error=/var/log/mysql/error.log
#By default we only accept connections from localhost
#bind-address = 127.0.0.1
log-bin=/var/log/mysql/mysql-bin.index
server-id=1
#Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

slave 的my.conf 如下;

!includedir /etc/mysql/conf.d/
[mysqld]
pid-file=/var/run/mysqld/mysqld.pid
socket=/var/run/mysqld/mysqld.sock
datadir=/var/lib/mysql
#log-error=/var/log/mysql/error.log
#By default we only accept connections from localhost
#bind-address = 127.0.0.1
log-bin=/var/log/mysql/mysql-bin.index
server-id=2
#Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

以上是我修改好的一个 my.conf 文件,我们主要修改的是以下这些选项:

#bind-address= 127.0.0.1 # 注释这个选项可以让远程机器访问,或者可以修改为 0.0.0.0
log-bin=/var/log/mysql/mysql-bin.index # 开启 log-bin 日志,日志路径
server-id=1 # 服务器唯一ID,默认是1,一般取IP最后一段,这里看情况分配

构建需要的文件结构就是以下这样:

master
├── Dockerfile
└── my.cnf
slave
├── Dockerfile
└── my.cnf

然后在master目录中使用 docker build -t master/mysql:5.7.20 . 命令构建镜像主库,从库构建命令 docker build -t
slave/mysql:5.7.20 .。命令最后有个.,不要忘记,代表当前目录。-t 的意思是tag,是 --tag
的缩写,也就是命名这个镜像,如果不加docker会随机给这个镜像一个名字,建议格式为name:tag

配置docker容器

构建完成后我们使用以下命令启动主库和从库

docker run -p 3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=root -d master/mysql:5.7.20

docker run -p 3306 --name mysql-slave --link mysql-master:master -e MYSQL_ROOT_PASSWORD=root -d
slave/mysql:5.7.20

进入docker容器进行操作:

1.然后分别执行 docker exec -it mysql-master bash 和 docker exec -it slave-master bash 命令进入到容器内部。
2.执行 mysql -uroot -proot 进入mysql环境,这时我们的环境搭建就已经完成了,下面正式配置主从连接。

当然此时docker会分配一个唯一的端口给容器,我们也可以用mysql客户端连接进行配置。使用docker ps查看端口号,就可以用客户端连接进行管理。

检查容器是否启动状态:
☁ mysql-master-slave docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS
PORTS NAMES
6c7648e829e0 slave/mysql:5.7.20 "docker-entrypoint..." 4 minutes ago Up 4 minutes
0.0.0.0:32769->3306/tcp mysql-slave
483842c63235 master/mysql:5.7.20 "docker-entrypoint..." 5 minutes ago Up 5 minutes
0.0.0.0:32768->3306/tcp mysql-master

创建用户并指定ip可以访问:

1.所有ip可以访问:

GRANT REPLICATION SLAVE ON . to 'user'@'%' identified by 'mysql';

2.指定的ip可以访问:

GRANT REPLICATION SLAVE ON . TO 'user'@'192.168.1.200' IDENTIFIED BY 'mysql';

3.指定网段可以访问:

GRANT REPLICATION SLAVE ON . TO 'user'@'192.168.1.%' IDENTIFIED BY 'mysql';

使用show master status查看mysql主容器的状态,打印如下信息:

+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 | 154 | | | |
+------------------+----------+--------------+------------------+-------------------+
使用hostname查看主容器的hostname,如我的主容器是483842c63235。

从数据库最重要的配置:

change master to
master_host='master',#要连接的主服务器的ip
master_user='user',#指定的用户名,最好不要用root
master_log_file='mysql-bin.000003',#主库记录的值
master_log_pos=154,#主库的pos值
master_port=3306,#主库3306映射的端口
master_password='mysql';#主库要连接的用户的密码了
使用start slave启动主从同步

使用命令查看:show slave status\G

打印如下信息:

*************************** 1. row ***************************
Slave_IO_State: Connecting to master
Master_Host: master //主服务器地址
Master_User: user //授权帐户名,尽量避免使用root
Master_Port: 3306 //数据库端口,部分版本没有此行
Connect_Retry: 60
Master_Log_File: mysql-bin.000003 //同步主库的日志文件名
Read_Master_Log_Pos: 154 //同步读取二进制日志的位置,大于等于
Relay_Log_File: 6c7648e829e0-relay-bin.000001
Relay_Log_Pos: 4
Relay_Master_Log_File: mysql-bin.000003
Slave_IO_Running: Yes //此状态必须YES
Slave_SQL_Running: Yes //此状态必须YES
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 154
Relay_Log_Space: 154
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:

Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 0
Master_UUID:
Master_Info_File: /var/lib/mysql/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
1 row in set (0.00 sec)
这样就是完成了一组主从mysql的配置。

登陆master终端

mysql> create database sunhao;
Query OK, 1 row affected (0.01 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sunhao |
| sys |
+--------------------+
5 rows in set (0.00 sec)
mysql> use sunhao
Database changed
mysql> create table sunhao(id int(3),name char(10));
Query OK, 0 rows affected (0.04 sec)
mysql> insert into sunhao values(1,'xiaoshuai');
Query OK, 1 row affected (0.01 sec)
mysql> select * from sunhao;
+------+-----------+
| id | name |
+------+-----------+
| 1 | xiaoshuai |
+------+-----------+
1 row in set (0.00 sec)

登陆slave终端

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sunhao |
| sys |
+--------------------+
5 rows in set (0.00 sec)
mysql> use sunhao
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> select * from sunhao;
+------+-----------+
| id | name |
+------+-----------+
| 1 | xiaoshuai |
+------+-----------+

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值