docker部署mysql5.7,并配置主从同步

该文详细介绍了如何在Docker环境下配置MySQL的主从复制。首先,在宿主机创建挂载目录,接着拉取MySQL镜像,然后使用docker-compose创建并启动主从两个容器。在容器内配置MySQL,包括授权远程访问和调整配置。最后,创建主从节点的配置文件,创建同步账户,查看并记录主节点状态,然后在从节点上配置并启动复制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 在宿主机创建MySQL挂载目录

配置在这两台服务器上: 131.0.4.21(主),131.0.4.22(从)
主从两台机器均执行mkdir -p /data/docker_data/mysql/conf /data/docker_data/mysql/logs /data/docker_data/mysql/data

2 docker拉取MySQL镜像

主从2台均拉去

docker pull mysql:5.7.28

3 创建容器(使用docker-compose)

主从2台均创建 注意容器名称自行修改,主mysql名为mysql-master 从为mysql-slave

#创建docker-compose文件夹
mkdir -p /data/docker_data/mysql/docker-compose
#创建文件
cd /data/docker_data/mysql/docker-compose
vi docker-compose.yml

写入以下内容:

version: '3.5'
services:
  mysql:
    image: mysql:5.7.28
    container_name: mysql-master
    privileged: true
    restart: always
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: xxlopws@aaji12560
      MYSQL_PASS: root
      TZ: Asia/Shanghai
    command:
      --wait_timeout=31536000
      --interactive_timeout=31536000
      --max_connections=1000
      --default-authentication-plugin=mysql_native_password
      --lower-case-table-names=1
      --default-time_zone='+8:00'
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_unicode_ci
    volumes:
      - "/data/docker_data/mysql/data:/var/lib/mysql"
      - "/data/docker_data/mysql/conf:/etc/mysql/conf.d"
      - "/data/docker_data/mysql/logs:/var/log/mysql"

进入docker-compose目录,本样例中是/data/docker_data/mysql/docker-compose目录,下面有docker-compose.yml文件,执行如下命令:

docker-compose up -d --build

备注:

重启容器
docker-compose restart
停止容器:会删除容器
docker-compose down
停止但不删除容器:
docker-compose stop

docker-compose.yml文件中参数解释

参数解释:
	* 
--name 容器名字
	* 
-p 3306:3306 物理机端口:容器内部端口
	* 
-e 运行参数 初始化 root 用户的密码
	* 
-d 后台运行 mysql:5.7 镜像名字加标签
	* 
-v /opt/docker_v/mysql/conf:/etc/mysql:将主机当前目录下的 conf/my.cnf 挂载到容器的 /etc/mysql/my.cnf。//配置文件目录
	* 
-v /opt/docker_v/mysql/data:/var/lib/mysql :将主机当前目录下的data目录挂载到容器的 /var/lib/mysql 。//数据库文件存放目录
	* 
--lower-case-table-names 大小写敏感配置 0 :敏感 1:不敏感
	* 
TZ=Asia/shanghai : 设置容器时区
	* 
character-set-server : 服务器字符集,在创建数据库和表时不特别指定字符集,这样统一采用character-set-server字符集。
	* 
character-set-database : 数据库字符集
	* 
character-set-table : 数据库表字符集
	* 
collation-server : 排序规则字符集
	* 
default-time_zone : mysql的时区


4 进入容器内部,配置

以下命令进入容器内部:

docker exec -it mysql-master bash

然后mysql:mysql -u root -p,输入docker-compose中设置的密码
授权外网可访问:

GRANT ALL ON *.* TO 'root'@'%' ;

查看大小写和时间配置是否正确:

mysql> show variables like '%time_zone%';
+------------------+--------+
| Variable_name | Value |
+------------------+--------+
| system_time_zone | CST |
| time_zone | +08:00 |
+------------------+--------+
2 rows in set (0.00 sec)

mysql> show variables like '%case%';
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| lower_case_file_system | OFF |
| lower_case_table_names | 1 |
+------------------------+-------+
2 rows in set (0.00 sec)

修改允许远程连接:

#指定数据库
use mysql;
#查看用户连接范围
select user, host from user;
#修改mysql允许远程连接,不用管ERROR 1062 (23000): Duplicate entry '%-root' for key 'PRIMARY'
update user set host='%' where user='root';
#刷新
flush privileges;

使用图形化界面进行连接,创建数据库和表选择utf8mb4

5 配置主从

5.1 主节点、从节点创建自己的配置文件

#进入之前映射的本地文件目录
cd /data/docker_data/mysql/conf
#创建自己的mysql配置文件,/etc/mysql/conf.d下的文件会被容器中的mysql配置文件引入全局配置中
vi myconf.cnf
#添加如下内容 1.开启binlog
[mysqld]
#开启二进制日志
log-bin=mall-mysql-bin
#设置server-id,和从不能一样
server-id=1
# 设置使用的二进制日志格式(row-行级别;statement=语句级别;mixed-混合级别)
binlog-format=mixed
#同步的数据库名称,如果不配置,表示同步所有的库
## binlog-do-db=db1
#指定不需要同步的数据库名称
binlog-ignore-db=mysql
#设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
# 二进制日志过期清理时间,默认为0,表示不自动清理
expire_logs_days=7
#忽略主从复制中遇到的所有错误活指定的错误类型,避免slave端复制中断
## 如:1062错误码代表主键重复;1032错误码代表主从数据库数据不一致
slave_skip_errors=1062

从节点,如上同理进行配置

[mysqld]
## 开启二进制日志功能,以备slave作为其它数据库实例的Master时使用
log-bin=mall-mysql-slave1-bin
## 设置server_id,同一局域网中需要唯一
server_id=2
## 指定不需要同步的数据库
binlog-ignore-db=mysql
# 设置二进制日志使用内存大小(事务)
binlog_cache_size=2M
## 设置使用的二进制日志格式
binlog_format=mixed
## 二进制日志过期清理时间,默认为0,代表不自动清理
expire_logs_days=7
## 忽略主从复制中遇到的所有错误活指定的错误类型,避免slave端复制中断
## 如:1062错误码代表主键重复;1032错误码代表主从数据库数据不一致
slave_skip_errors=1062
## relay_log配置中继日志
relay_log=mall-mysql-relay-bin
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
## slave设置为只读权限(具有super权限的用户除外)
read_only=1

5.2 创建数据库同步账户

使用docker命令重新进入到主节点Master容器内部:

docker exec -it mysql-master /bin/bash

在Master数据库创建数据同步用户,授予用户 slave REPLICATION SLAVE权限和REPLICATION CLIENT权限,用于在主从库之间同步数据。登录到mysql客户端:

mysql -u root -p
#创建用户并授权:
mysql> CREATE USER 'slave'@'%' IDENTIFIED BY 'master@test123';
Query OK, 0 rows affected (0.00 sec)

mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
Query OK, 0 rows affected (0.00 sec)

5.3 查看Master状态记住file和position

进入Master库mysql客户端:输入show master status查看Master状态:

mysql> show master status;
+-----------------------+----------+--------------+------------------+-------------------+
| File                  | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-----------------------+----------+--------------+------------------+-------------------+
| mall-mysql-bin.000001 |      154 |              | mysql            |                   |
+-----------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

记住File和Position,后面需要用到。此时一定不要操作Master库,否则将会引起Master状态的变化,File和Position字段也将会进行变化。

5.4 从节点配置、启动同步

进入到Slave库myslq客户端,执行如下命令:(注意master-bin.000004的master_log_pos位置要一样)

docker exec -it mysql-slave /bin/bash
mysql -u root -p
mysql> change master to master_host='131.0.4.21', master_user='slave', master_password='master@test123', master_port=3306, master_log_file='mall-mysql-bin.000003', master_log_pos=154, master_connect_retry=30;
Query OK, 0 rows affected, 2 warnings (0.01 sec)

命令说明:master_host :Master库的地址,指的是容器的独立ip
master_port:Master的端口号,指的是容器的端口号 master_user:用于数据同步的用户
master_password:用于同步的用户的密码 master_log_file:指定 Slave
从哪个日志文件开始复制数据,即上文中提到的 File 字段的值 master_log_pos:从哪个 Position
开始读,即上文中提到的 Position 字段的值
master_connect_retry:如果连接失败,重试的时间间隔,单位是秒,默认是60秒

1)开启主从复制:

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

2)查看状态:

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 131.0.4.21
                  Master_User: slave
                  Master_Port: 3306
                Connect_Retry: 30
              Master_Log_File: mall-mysql-bin.000003
          Read_Master_Log_Pos: 154
               Relay_Log_File: mall-mysql-relay-bin.000002
                Relay_Log_Pos: 325
        Relay_Master_Log_File: mall-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: 154
              Relay_Log_Space: 537
              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: 1
                  Master_UUID: 98cac7a3-13ff-11ed-a406-0242ac120002
             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,表示主从状态正常。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值