Docker完成MySQL主从数据库配置经验教程
使用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容器,然后进入容器进行复制修改:
!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
上面是我修改的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最后一段,这里看情况分配
这是我主库的 my.cnf
。子库基本相同,只是servier-id
不同,子库为2并且这个文件也放在文件夹中。
构建所需的文件结构如下:
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,镜像会随机命名。推荐格式为 名称:标签
配置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 exec -it mysql-master 命令 bash
和 docker exec -it 从属主 bash
。前往容器。执行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
使用GRANT DUPLICATE CHILD TO *.* 'user'@'%'identified by 'mysql';
或GRANT DUPLICATE DUPLICATE TO *.* 'user'@'168.192.168。 1.200' 由 'mysql' 识别;
创建用户。上一张可以用所有ip访问,下一张只能指定ip。
然后使用 GRANT SELECT,REPLICATION SLAVE ON *.* TO 'user'@'%';
向该用户授予读取权限。
使用show master status
可以查看mysql master容器的状态,并打印以下信息:
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 | 154 | | | |
+------------------+----------+--------------+------------------+-------------------+
使用hostname
可以查看master容器的主机名。例如,我的主容器是 483842c63235
。
然后配置slave mysql数据库:
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主从集配置。
Shell脚本
点击相应的shell脚本,1分钟即可启动一组主从mysql容器。运行这个脚本需要进行一些小的修改,主要是mysql配置文件。
#!/bin/bash
MASTER_DIR=/var/lib/mysql/mysql-master
SLAVE_DIR=/var/lib/mysql/mysql-slave
## First we could rm the existed container
docker rm -f mysql-master
docker rm -f mysql-slave
## Rm the existed directory
rm -rf $MASTER_DIR
rm -rf $SLAVE_DIR
## Start instance
docker run -p 3306 --name mysql-master -v /etc/master.cnf:/etc/mysql/my.cnf -v $MASTER_DIR:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -d master/mysql:5.7.20
docker run -p 3306 --name mysql-slave -v /etc/slave.cnf:/etc/mysql/my.cnf -v $MASTER_DIR:/var/lib/mysql --link mysql-master:master -e MYSQL_ROOT_PASSWORD=root -d slave/mysql:5.7.20
## Creating a User for Replication
docker stop mysql-master mysql-slave
docker start mysql-master mysql-slave
sleep 3
docker exec -it mysql-master mysql -S /var/lib/mysql/mysql.sock -e "CREATE USER 'users'@'127.0.0.1' IDENTIFIED BY 'mysql';GRANT REPLICATION SLAVE ON *.* TO 'users'@'127.0.0.1';"
## Obtaining the Replication Master Binary Log Coordinates
master_status=`docker exec -it master mysql -S /var/lib/mysql/mysql.sock -e "show master status\G"`
master_log_file=`echo "$master_status" | awk 'NR==2{print substr($2,1,length($2)-1)}'`
master_log_pos=`echo "$master_status" | awk 'NR==3{print $2}'`
master_log_file="'""$master_log_file""'"
## Setting Up Replication Slaves
docker exec -it mysql-slave mysql -S /var/lib/mysql/mysql.sock -e "CHANGE MASTER TO MASTER_HOST='master',MASTER_PORT=3306,MASTER_USER='users',MASTER_PASSWORD='mysql',MASTER_LOG_FILE=$master_log_file,MASTER_LOG_POS=$master_log_pos;"
docker exec -it mysql-slave mysql -S /var/lib/mysql/mysql.sock -e "start slave;"
docker exec -it mysql-slave mysql -S /var/lib/mysql/mysql.sock -e "show slave status\G"
## Creates shortcuts
grep "alias mysql-master" /etc/profile
if [ $? -eq 1 ];then
echo 'alias mysql="docker exec -it mysql-master mysql"' >> /etc/profile
echo 'alias master="docker exec -it mysql-master mysql -h 127.0.0.1 -P3306"' >> /etc/profile
echo 'alias slave="docker exec -it mysql-master mysql -h 127.0.0.1 -P3307"' >> /etc/profile
source /etc/profile
fi
作者:麦索
链接:https://juejin.im/post/59fd71c25188254dfa1287a9
来源:掘金
版权归作者所有。商业转载请联系作者获得许可。非商业转载请注明来源。
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。