Docker Swarm 学习笔记(十): 使用 Docker Stack 部署 Docker Swarm 服务(以主从版 MySQL 8 为例)
                            huty
                            2023年05月25日  ·  阅读 3,922
                        
                    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 从节点,检查数据库、表是否同步
 
评论已关闭