Dcoker搭建MySQL集群保姆级教程
前提说明:本教程所使用的Docker版本为 27.5.1,docker-compose版本为 v2.33.0。所使用的MySQL版本是 8.0。话不多说直接上干货。
步骤一:创建目录结构
首先创建出如下的目录结构
mysql-cluster/ ├── master/ │ ├── my.cnf # MySQL Master 节点的配置文件 │ ├── Dockerfile # 构建 MySQL Master 节点 Docker 镜像的 Dockerfile │ └── scripts/ │ └── init.sql # 初始化 MySQL Master 数据库的 SQL 脚本 ├── slave/ │ ├── my.cnf # MySQL Slave 节点的配置文件 │ ├── Dockerfile # 构建 MySQL Slave 节点 Docker 镜像的 Dockerfile │ └── scripts/ │ └── init.sql # 初始化 MySQL Slave 数据库的 SQL 脚本 (例如,用于创建用户或初始数据) └── docker-compose.yaml # 使用 Docker Compose 编排整个 MySQL Cluster 的配置文件
步骤二:完善目录结构中的内容master/my.cnf
[mysqld] server-id = 1 log_bin = mysql-bin binlog_do_db = scholar_track # 指定需要复制的数据库名称
master/Dockerfile
FROM mysql:8.0 COPY my.cnf /etc/mysql/conf.d/ COPY scripts/init.sql /docker-entrypoint-initdb.d/
master/scripts/init.sql
-- 主节点初始化时自动执行 CREATE USER 'bearllflee'@'%' IDENTIFIED BY '292378'; GRANT REPLICATION SLAVE ON *.* TO 'bearllflee'@'%'; # 允许使用bearllflee用户进行主从复制 GRANT ALL PRIVILEGES ON *.* TO 'bearllflee'@'%'; FLUSH PRIVILEGES;
TIP:用户名和密码记得换成自己的
slave/my.cnf
[mysqld] server-id = 2 relay-log = mysql-relay-bin read_only = 1 # 从节点只读
slave/Dockerfile
FROM mysql:8.0 COPY my.cnf /etc/mysql/conf.d/ COPY scripts/init.sql /docker-entrypoint-initdb.d/
slave/scripts/init.sql
CREATE USER 'bearllflee'@'%' IDENTIFIED BY '292378'; GRANT REPLICATION SLAVE ON *.* TO 'bearllflee'@'%'; GRANT SELECT ON *.* TO 'bearllflee'@'%'; FLUSH PRIVILEGES;
TIP:用户名和密码记得换成自己的
docker-compose.yaml
version: "3.8" services: mysql-master: # mysql主节点 build: ./master # 根据master下的Dockerfile构建镜像 container_name: mysql-master # 主节点的docker容器命名 environment: # 主节点的环境变量配置 MYSQL_ROOT_PASSWORD: "292378" # root用户密码 MYSQL_DATABASE: "scholar_track" # 默认数据库名称 MYSQL_REPLICATION_USER: "bearllflee" # 用于复制的用户 MYSQL_REPLICATION_PASSWORD: "292378" # 用于复制的用户密码 volumes: - mysql_master_data:/var/lib/mysql # 将主机上的mysql_master_data卷挂载到容器内的/var/lib/mysql目录 - ./master/scripts/init.sql:/docker-entrypoint-initdb.d/init.sql # 挂载init.sql脚本 networks: - mysql_cluster_net # 连接到名为mysql_cluster_net的网络 ports: - "3306:3306" # 将主机的3306端口映射到容器的3306端口 mysql-slave: build: ./slave container_name: mysql-slave environment: MYSQL_ROOT_PASSWORD: "292378" MYSQL_DATABASE: "scholar_track" MYSQL_REPLICATION_USER: "bearllflee" MYSQL_REPLICATION_PASSWORD: "292378" MYSQL_MASTER_HOST: "mysql-master" # 设置主节点的主机名(服务名) MYSQL_MASTER_PORT: 3306 # 主节点端口号 volumes: - mysql_slave_data:/var/lib/mysql - ./slave/scripts/init.sql:/docker-entrypoint-initdb.d/init.sql networks: - mysql_cluster_net # 接到名为mysql_cluster_net的网络 depends_on: - mysql-master # 确保mysql-master服务先启动 volumes: # 定义卷 mysql_master_data: mysql_slave_data: networks: mysql_cluster_net: driver: bridge
在定义数据卷时没有目录,那数据卷在哪?
volumes:
mysql_master_data:
答:数据卷是docker自动管理的,无需指定目录,如果想查看数据卷的位置,可以通过docker volume list查看数据卷列表,再通过docker inspect xxx查看数据卷信息,其中包括数据卷位置
从节点的用于复制的用户和密码需要和主节点的一致吗?
答:需要一致,在主从复制过程中,从节点需要通过这个用户连接到主节点,并请求二进制日志(binary logs)来进行同步。从节点需要通过用户名和密码验证身份,才能连接到主节点,复制用户在主节点上需要有足够的权限来读取二进制日志和其他必要的信息,保持一致的用户名和密码可以简化配置和维护过程,避免因不同用户导致的权限管理和配置复杂性。
步骤三:执行
在docker-compose.yaml所在的目录下(这里是mysql-cluster)直接使用docker-compose up -d运行,执行完后可以使用docker-compose logs -f查看日志。
TIP:记得验证一下主从节点是否都启动成功,并且成功创建数据库和用户。
步骤四:开启主从复制
-
检查主节点状态
docker exec -it mysql-master /bin/bash # 进入容器内部 mysql -u root -p # 连接mysqlSHOW MASTER STATUS\G # 查看主节点信息,记录下来mysql> SHOW MASTER STATUS\G *************************** 1. row *************************** File: mysql-bin.000003 Position: 940 Binlog_Do_DB: scholar_track Binlog_Ignore_DB: Executed_Gtid_Set: 1 row in set (0.00 sec)
-
进入从节点
docker exec -it mysql-slave /bin/bash # 进入容器内部 mysql -u root -p # 连接mysql执行下面SQL语句
CHANGE MASTER TO MASTER_HOST='mysql-master', MASTER_USER='bearllflee', MASTER_PASSWORD='292378', MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS=940; START SLAVE; SHOW SLAVE STATUS\G
Slave_IO_State: Waiting for source to send event Master_Host: mysql-master Master_User: bearllflee Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000003 Read_Master_Log_Pos: 940 Relay_Log_File: mysql-relay-bin.000002 Relay_Log_Pos: 324 Relay_Master_Log_File: mysql-bin.000003 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB:
如果 Slave_IO_Running、Slave_SQL_Running都是yes,说明成功
解释一个问题
为什么操作主从节点查看状态、开启主从复制不是用自己创建的用户(bearllflee),而是用root
答:因为自己创建的用户只是用于从节点去连接主节点,监听日志,并同步数据,而开启主从复制这个功能需要用到root用户
步骤五:验证
-
在主节点创建表,插入数据
USE scholar_track; CREATE TABLE test (id INT); INSERT INTO test VALUES (1);
-
查看从节点是否同步
SELECT * FROM scholar_track.test;
主从复制搭建成功~,如果想要拓展从节点数量也很简单,把slave目录复制几份,修改my.cnf中的server-id,然后在docker-compose.yaml文件中也复制几分从节点的配置即可。