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)

先记住FilePosition这两个参数的值,等下在配置从数据库时会用到。

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_RunningSlave_SQL_Running 这两个值为Yes即可,表示已经主从复制成功。
如果这两个参数只要有一个为No,就说明是由问题的。
可参考这篇文章进行排查:MySQL主从同步故障,一般来说引起同步故障的原因是在从数据库配置时FilePosition这两个参数没有配对,可重新进入master主库中重新 show master status查看一下为好。

mysql> show master status;

6、运行

最后,启动一下docker-compose命令。

[root@localhost Desktop]# docker-compose up

至此,项目已经可以跑起来了

猜你喜欢

转载自blog.csdn.net/huazhiliandong/article/details/85374169