1.使用docker搭建主从

1.1.拉取镜像

  1. 使用docker拉取mysql镜像,以5.7版本为例
1
docker pull mysql:5.7
  1. 查看镜像
1
docker images mysql

1.2.运行容器

  1. 运行master
    1
    2
    3
    4
    5
    6
    7
    8
    docker run \
    --name mysql-master \
    -v /tmp/mysql-master/conf:/etc/mysql/conf.d \
    -v /tmp/mysql-master/data:/var/lib/mysql \
    -e MYSQL_ROOT_PASSWORD=123456 \
    -p 3300:3306 \
    -d \
    mysql:5.7

参数说明:

  • –name mysql-master 指定容器名称

  • -v /tmp/mysql-master/conf:/etc/mysql/conf.d 配置文件挂载

  • -v /tmp/mysql-master/data:/var/lib/mysql 数据挂载

  • -e MYSQL_ROOT_PASSWORD=123456 配置root密码

  • -p 3300:3306 映射端口

  1. 运行从机slave
1
2
3
4
5
6
7
8
docker run \
--name mysql-slave \
-v /tmp/mysql-slave/conf:/etc/mysql/conf.d \
-v /tmp/mysql-slave/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-p 3301:3306 \
-d \
mysql:5.7

1.3.修改主从配置文件

  1. 创建并配置主机my.cnf文件
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    vim /tmp/mysql-master/conf/my.cnf

    #文件内配置
    [mysqld]
    server-id=1
    log-bin=/var/lib/mysql/mysql-bin
    binlog-do-db=test

    #重启容器
    docker restart mysql-master
  • server-id=1 [必须]主服务器唯一ID
  • log-bin=/var/lib/mysql/mysql-bin [必须]启用二进制日志,指名路径
  • binlog-do-db=test 指定需要同步数据库,如果不配置代表同步所有库
  1. 在master中创建用户并授予权限
    1
    2
    3
    CREATE USER 'salve'@'%' IDENTIFIED BY '123456';
    GRANT REPLICATION SLAVE ON *.* TO 'salve'@'%';
    FLUSH PRIVILEGES;
    测试 show master status;

image-20230907005301756

  1. 创建并配置从机my.cnf
1
2
3
4
5
6
7
8
9
10
#1.
vim /tmp/mysql-slave/conf

#2.
[mysqld]
server-id=2
relay_log=mysql-relay-bin
read_only=1

#3.重启容器
  • relay_log 配置中继日志
  • read_only=1 设置为只读,该项如果不设置,表示slave可读可写

1.4.开启主从复制

1
2
3
4
5
6
7
8
9
10
11
#1.进入容器并连接mysql客户端
docker exec -it mysql-slave mysql -uroot

#执行命令
CHANGE MASTER TO
MASTER_HOST='192.168.149.111',
MASTER_PORT=3300,
MASTER_USER='salve',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000003',
MASTER_LOG_POS=306;
  • MASTER_HOST 主机ip
  • MASTER_PORT 主机端口
  • MASTER_USER 连接主机的用户名
  • MASTER_PASSWORD 连接主机的密码
  • MASTER_LOG_FILE 主服务器上正在写入的二进制日志文件名
  • MASTER_LOG_POS 从主服务器的哪个二进制日志位置开始复制。

启动复制

1
START SLAVE;

检查复制状态

1
show slave status \G;

image-20230907021648475

Slave_IO_Running 和 Slave_SQL_Running 都显示为 “Yes”,这表示主从复制已成功启动。

创建需要同步的测试数据库(必须和配置文件中配置的数据库名称相同)

image-20230907001851704

image-20230907002025203

1.5.测试

主机新建库、新建表、insert记录,从机复制:

1
2
3
4
5
6
7
CREATE DATABASE test;

CREATE TABLE mytbl(id INT,NAME VARCHAR(16));

INSERT INTO mytbl VALUES(1, 'zhang3');

INSERT INTO mytbl VALUES(2,@@hostname);

1.6.补充

停止主从

1
stop slave; 

重新配置主从-需要在从机上执行:

1
2
3
stop slave;

reset master; #删除Master中所有的binglog文件,并将日志索引文件清空,重新开始所有新的日志文件(慎用)

2.使用Docker Compose简化

  1. 创建docker-compose.yml文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
version: '3'
services:
# 服务名, 主节点
mysql-master:
# 容器名
container_name: mysql-master
# mysql 镜像
image: mysql:5.7
# 暴露端口号: 宿主机端口:容器内端口号
ports:
- 3000:3306
hostname: mysql-master
privileged: true
# 按照路径挂载目录: 日志、配置文件、数据
volumes:
- ./mysql-master/logs:/var/log/mysql
- ./mysql-master/conf/my.cnf:/etc/mysql/my.cnf
- ./mysql-master/data:/var/lib/mysql
- ./mysql-master/script:/docker-entrypoint-initdb.d # 容器首次初始化时执行
# 环境变量: mysql密码
environment:
MYSQL_ROOT_PASSWORD: "123456"
MASTER_SYNC_USER: "slave"
MASTER_SYNC_PASSWORD: "123456"
ADMIN_USER: "root"
ADMIN_PASSWORD: "123456"
# 使用的网卡
networks:
- mysql
# 从节点
mysql-slave:
container_name: mysql-slave
image: mysql:5.7
ports:
- 3301:3306
hostname: mysql-slave
privileged: true
volumes:
- ./mysql-slave/logs:/var/log/mysql
- ./mysql-slave/conf/my.cnf:/etc/mysql/my.cnf
- ./mysql-slave/data:/var/lib/mysql
- ./mysql-slave/script:/docker-entrypoint-initdb.d
environment:
MYSQL_ROOT_PASSWORD: "123456"
MASTER_SYNC_USER: "slave"
MASTER_SYNC_PASSWORD: "123456"
ADMIN_USER: "root"
ADMIN_PASSWORD: "root123"
MASTER_HOST: "mysql-master"
TZ: "Asia/Shanghai"
networks:
- mysql
# 配置网卡
networks:
# 使用网卡,桥接模式
mysql:
driver: bridge
  1. 配置主机配置文件
1
2
3
4
5
6
7
8
vim mysql-master/conf/my.cnf


[mysqld]
server-id=1
log-bin=/var/lib/mysql/mysql-bin
binlog-do-db=test

3.从机配置文件

4.初始化脚本

………