Docker Swarm 学习笔记(十): 使用 Docker Stack 部署 Docker Swarm 服务(以主从版 MySQL 8 为例)
huty
2023年05月25日 · 阅读 1,341
1、 新增 Docker Swarm 节点的元数据
- 所有需要部署 MySQL 服务的节点
docker node update --label-add app=db 节点ID
- 需要部署 MySQL 主节点的主机
docker node update --label-add role=master 节点ID
- 需要部署 MySQL 从节点的主机
docker node update --label-add role=slave 节点ID
2、 编辑 Docker Stack 的 yaml 文件
vim compose.yaml
version: "3.9"
services:
master:
image: mysql:8.0.33
container_name: mysql_8_master
hostname: master
restart: always
networks:
- db_network
ports:
- "13306:3306"
volumes:
- /etc/localtime:/etc/localtime:ro
- db_master:/var/lib/mysql
configs:
- source: master_conf
target: /etc/mysql/conf.d/master.cnf
mode: 0444
- source: master_initdb
target: /docker-entrypoint-initdb.d/master_init.sql
mode: 0444
secrets:
- root_key
- replication_key
environment:
- MYSQL_ROOT_PASSWORD_FILE=/run/secrets/root_key
- MYSQL_REPLICATION_MODE=master
- MYSQL_REPLICATION_USER=replication
- MYSQL_REPLICATION_PASSWORD_FILE=/run/secrets/replication_key
deploy:
mode: replicated
replicas: 1
restart_policy:
condition: on-failure
delay: 10s
max_attempts: 3
window: 30s
update_config:
parallelism: 1
delay: 10s
failure_action: rollback
monitor: 30s
rollback_config:
parallelism: 1
delay: 10s
placement:
constraints:
- node.labels.app==db
- node.labels.role==master
slave:
image: mysql:8.0.33
container_name: mysql_8_slave
hostname: slave
restart: always
networks:
- db_network
ports:
- "23306:3306"
volumes:
- /etc/localtime:/etc/localtime:ro
- db_slave:/var/lib/mysql
configs:
- source: slave_conf
target: /etc/mysql/conf.d/slave.cnf
mode: 0444
- source: salve_initdb
target: /docker-entrypoint-initdb.d/slave_init.sql
mode: 0444
secrets:
- root_key
environment:
- MYSQL_ROOT_PASSWORD_FILE=/run/secrets/root_key
- MYSQL_REPLICATION_MODE=slave
deploy:
mode: replicated
replicas: 1
restart_policy:
condition: on-failure
delay: 10s
max_attempts: 3
window: 30s
update_config:
parallelism: 1
delay: 10s
failure_action: rollback
monitor: 30s
rollback_config:
parallelism: 1
delay: 10s
placement:
constraints:
- node.labels.app==db
- node.labels.role==slave
depends_on:
- master
volumes:
db_master:
db_slave:
configs:
master_conf:
file: master.cnf
master_initdb:
file: master_init.sql
slave_conf:
file: slave.cnf
salve_initdb:
file: slave_init.sql
secrets:
root_key:
file: root.key
replication_key:
file: replication.key
networks:
db_network:
name: db_network
driver: overlay
driver_opts:
encrypted: 'true'
ipam:
driver: default
config:
- subnet: 172.21.0.1/24
说明:
mysql:8.0.33
为 MySQL 的镜像- 此处将主节点的 3306 映射至 13306,从节点的 3306 映射至 23306
实际使用时,修改上述两处内容即可
3、 编辑主节点 MySQL 配置文件
vim master.cnf
[mysqld]
server-id = 1
report_host = master
log_bin = master-bin
log_error = master-bin.err
binlog_format = mixed
binlog_expire_logs_seconds = 604800
max_binlog_size = 1G
binlog-ignore-db = mysql
binlog-ignore-db = sys
binlog-ignore-db = information_schema
binlog-ignore-db = performance_schema
max_connections = 1000
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
说明:
binlog_format
为主从节点的数据复制方式
statement
模式不会记录每一条更改语句,节约资源但主从数据可能不一致
row
模式记录每一条更改的语句,日志量非常大
mixed
模式是前两者优点的综合,但日志结构较为复杂binlog_expire_logs_seconds
为日志文件保留时间(秒)binlog-ignore-db
指定不需要同步的数据库
4、 编辑主节点 MySQL 初始化 SQL 文件
vim master_init.sql
create user 'replication'@'%' identified by '123456';
grant replication slave, replication client on *.* to 'replication'@'%';
show grants for 'replication'@'%';
flush privileges;
注意:
replication
为同步用户123456
为replication
用户的密码
5、 编辑从节点 MySQL 配置文件
vim slave.cnf
[mysqld]
server-id = 2
report_host = slave
replicate_ignore_db = mysql
replicate_ignore_db = sys
replicate_ignore_db = information_schema
replicate_ignore_db = performance_schema
max_connections = 1000
6、 编辑从节点 MySQL 初始化 SQL 文件
vim slave_init.sql
change master to master_host='192.168.10.100', master_port=13306, master_user='replication', master_password='123456', master_log_file='master-bin.000003', master_log_pos=157, get_master_public_key=1;
set global sql_slave_skip_counter=1;
start slave;
注意:
master_host
为主节点的 IP,因为此处使用了 Docker Swarm 的负载均衡,因此配置为集群任一节点的 IP 即可master_port
为主节点的端口号master_user
为同步时使用的用户master_password
为 master_user 用户的密码master_log_file
为同步的日志文件master_log_pos
为同步的日志文件的行数
7、 编辑 root 用户密码文件
vim root.key
123456
8、 编辑 replication 用户密码文件
vim replication.key
123456
9、 使用 Docker Stack 命令部署服务
docker stack deploy -c compose.yaml mysql_8_cluster
说明:
mysql_8_cluster
为服务的名称
10、 检查 MySQL 主从服务状态
- 查看服务
docker stack services mysql_8_cluster
- 查看服务包含的任务列表
docker stack ps mysql_8_cluster
11、 检查 MySQL 主从服务日志
- 主节点
docker service logs mysql_8_cluster_master
- 从节点
docker service logs mysql_8_cluster_slave
12、 查看 MySQL 主从状态(登录 MySQL 后执行)
- 主节点
show master status;
- 从节点
show slave status;
当 Slave_IO_Running
和 Slave_SQL_Running
都为 Yes
的时候,表示主从同步正常
13、 测试 MySQL 主从同步
- 登录 MySQL 主节点,创建数据库、表
- 登录 MySQL 从节点,检查数据库、表是否同步
评论已关闭