CentOS下使用docker-compose搭建django+mysql主从复制
1、环境
- 虚拟机:VMware 16.04
- 系统:CentOS 7.5
- 网络环境:桥接
- python:3.5
- django:1.11.5
- mysql:5.7.17(注意拉取的镜像版本,如果是8.0以上的话,在docker-compose启动时会有问题:Authentication plugin ‘caching_sha2_password’ cannot be loaded)
2、准备
1.登录服务器,在Desktop下创建文件夹作为项目根目录(具体在哪个位置创建都可,没有硬性要求。我这里是直接放在/root/Desktop目录下,没有创建文件夹)
目录如下:
django-project(你的django项目)
apps
django-project
manage.py
...
master
Dockerfile
my.cnf
slave
Dockerfile
my.cnf
docker-compose.yml
requirements.txt
3、配置
3.1 配置docker-compose.yml
version: '3'
services:
mysql-master:
build:
context: ./
dockerfile: master/Dockerfile
environment:
- "MYSQL_ROOT_PASSWORD=你的数据库密码"
- "MYSQL_DATABASE=你的数据库名称"
links:
- mysql-slave
ports:
- "33065:3306"
restart: always
hostname: mysql-master
mysql-slave:
build:
context: ./
dockerfile: slave/Dockerfile
environment:
- "MYSQL_ROOT_PASSWORD=你的数据库密码"
- "MYSQL_DATABASE=你的数据库名称"
ports:
- "33066:3306"
restart: always
hostname: mysql-slave
web:
build: .
command: python django-project/manage.py runserver 0.0.0.0:8000
volumes:
- .:/django-project
ports:
- "8000:8000"
links:
- mysql-master
3.2 主数据库master配置
3.2.1 配置Dockerfile
FROM mysql:5.7.17
MAINTAINER root
ADD ./master/my.cnf /etc/mysql/my.cnf
3.2.2 配置my.cnf文件
[mysqld]
## 设置server_id,一般设置为IP,注意要唯一
server_id=100
## 复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步)
binlog-ignore-db=mysql
## 开启二进制日志功能,可以随便取,最好有含义(关键就是这里了)
log-bin=replicas-mysql-bin
## 为每个session分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size=1M
## 主从复制的格式(mixed,statement,row,默认格式是statement)
binlog_format=mixed
## 二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
3.2 从数据库slave配置
3.2.1 配置Dockerfile
FROM mysql:5.7.17
MAINTAINER root
ADD ./slave/my.cnf /etc/mysql/my.cnf
3.2.2 配置my.cnf文件
[mysqld]
## 设置server_id,一般设置为IP,注意要唯一
server_id=101
## 复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步)
binlog-ignore-db=mysql
## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
log-bin=replicas-mysql-slave1-bin
## 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size=1M
## 主从复制的格式(mixed,statement,row,默认格式是statement)
binlog_format=mixed
## 二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
## relay_log配置中继日志
relay_log=replicas-mysql-relay-bin
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
## 防止改变数据(除了特殊的线程)
read_only=1
4、创建容器
注意:要在docker-cpmpose.yml所在的那个目录进行操作,运行 docker-compose 启动命令
$ docker-compose up
运行完成后,使用docker ps命令来查看容器是否创建成功
$ docker ps
如图即为创建成功
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6955da6ae2a4 desktop_web "python django-project/..." 2 hours ago Up 2 hours 0.0.0.0:8000->8000/tcp desktop_web_1
5bf734b4024c desktop_mysql-master "docker-entrypoint..." 2 hours ago Up 2 hours 0.0.0.0:33065->3306/tcp desktop_mysql-master_1
93f56623b8fa desktop_mysql-slave "docker-entrypoint..." 2 hours ago Up 2 hours 0.0.0.0:33066->3306/tcp desktop_mysql-slave_1
但此时,mysql主从复制还不能使用,需要继续配置。
5、mysql主从复制配置
5.1 先进入主数据master中,查看状态
mysql> show master status;
+---------------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------------------+----------+--------------+------------------+-------------------+
| replicas-mysql-bin.000003 | 79539 | | mysql | |
+---------------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
先记住File和Position这两个参数的值,等下在配置从数据库时会用到。
5.2 从库配置主库信息
在 从数据库 上运行 主数据库 的相关配置 sql 进行主从关联
1、先进入从数据库容器
[root@localhost ~]# docker exec -it 93f56623b8fa /bin/bash
2、进入mysql中
root@mysql-slave:/# mysql -uroot -proot
3、添加配置
mysql> CHANGE MASTER TO
-> MASTER_HOST='mysql-master',
-> MASTER_USER='root',
-> MASTER_PASSWORD='root',
-> MASTER_LOG_FILE='replicas-mysql-bin.000003',
-> MASTER_LOG_POS=79539;
Query OK, 0 rows affected, 2 warnings (0.02 sec)
4、然后重启从数据库
mysql> stop slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> start slave;
Query OK, 0 rows affected (0.20 sec)
5、查看是否关联成功
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: mysql-master
Master_User: root
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: replicas-mysql-bin.000003
Read_Master_Log_Pos: 79539
Relay_Log_File: replicas-mysql-relay-bin.000002
Relay_Log_Pos: 329
Relay_Master_Log_File: replicas-mysql-bin.000003
Slave_IO_Running: Yes
Slave_SQL_Running: 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: 79539
Relay_Log_Space: 545
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: 0
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: 100
Master_UUID: 0af3611e-0bd4-11e9-b25a-0242ac120005
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)
如果有 Slave_IO_Running ,Slave_SQL_Running 这两个值为Yes即可,表示已经主从复制成功。
如果这两个参数只要有一个为No,就说明是由问题的。
可参考这篇文章进行排查:MySQL主从同步故障,一般来说引起同步故障的原因是在从数据库配置时File和Position这两个参数没有配对,可重新进入master主库中重新 show master status查看一下为好。
mysql> show master status;
6、运行
最后,启动一下docker-compose命令。
[root@localhost Desktop]# docker-compose up
至此,项目已经可以跑起来了