2. 使用docker部署一主两从MySQL集群

553 阅读2分钟

1. 整体思路

  1. 主从库全局使用GTID的方式进行同步, 方便后续的主从切换
  2. 主从库全局使用mysql-bin日志
  3. 从库严格只读, root用户也不能写入

提示:

  1. 文中使用的IP, 端口, 密码等, 需要根据自己的环境配置等去替换,如10.1.12.12是我本地的内网ip, 需要替换成你实际使用的服务器ip

2. 部署主库

2.1 docker-compose配置

docker-compose.yml

version: '3'
services:
    mysql:
        image: "mysql:8"
        container_name: mysql8-0
        restart: always
        environment:
            MYSQL_ROOT_PASSWORD: "123456"
            TZ: "Asia/Shanghai"
        volumes:
            - "./data:/var/lib/mysql"
            - "./conf/conf.d:/etc/mysql/conf.d"
        ports:
            - "13500:3306"

2.2 主库初始配置

my.cnf

[mysqld]
server-id=1
log-bin=mysql-bin
# GTID配置
gtid-mode=on
enforce-gtid-consistency=on
log-slave-updates=on
# docker容器使用的物理机IP,端口, 用于集群互通
report_host=10.1.12.12
report_host=13500

# 默认字符集
character-set-server=utf8mb4
# 默认存储引擎
default-storage-engine=INNODB
# 设置加密方式
default_authentication_plugin=mysql_native_password
# sql_mode
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'

3. 部署两个从库

参考以下配置, 修改部分配置启动两个初始从库实例

2.1 docker-compose配置

docker-compose.yml

version: '3'
services:
    mysql:
        image: "mysql:8"
        ## 从库容器名,两个从库应不同
        container_name: mysql8-1
        restart: always
        environment:
            MYSQL_ROOT_PASSWORD: "123456"
            TZ: "Asia/Shanghai"
        volumes:
            - "./data:/var/lib/mysql"
            - "./conf/conf.d:/etc/mysql/conf.d"
        ports:
            ## 从库端口
            - "13501:3306"

2.2 从库初始化配置

my.cnf

[mysqld]
# 集群任意主从库的id不能一致
server-id=2
log-bin=mysql-bin
#GTID
gtid-mode=on
enforce-gtid-consistency=on
log-slave-updates=on

# 从库设为只读
read_only=on
#super_read_only=on

# 从库实际使用的ip,端口, 用于集群内通信
report_host=10.1.12.12
report_port=13501
# 默认字符集
character-set-server=utf8mb4
# 默认存储引擎
default-storage-engine=INNODB
# 设置加密方式
default_authentication_plugin=mysql_native_password
# sql_mode
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'

2.3 配置从库注意事项:

  1. 从库首次使用docker-comose up -d初始化时, 需要注释掉super_read_only=on, 让初始化正常运行
  2. 从库启动成功之后, 应打开注释super_read_only=on, 使用docker-compose restart重新启动, 禁止root用户写入

3. 配置主从同步

由于使用了GTID, 配置主从同步变得非常方便

3.1 主库创建slave账户

创建用于从库同步的账户, 从库无需创建, 开启主从后会把该账户自动同步过去, 这样后面主从切换会十分方便

在主库执行以下语句:

create user 'slave'@'%' identified by '123456';
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%';
flush privileges;

3.2 从库开启同步

两个从库分别执行一下语句:

CHANGE MASTER TO 
    MASTER_HOST = '10.1.12.12',
    MASTER_PORT=13500, 
    MASTER_USER = 'slave', 
    MASTER_PASSWORD = '123456', 
    MASTER_AUTO_POSITION = 1; 

start slave;

3.3 测试同步

主库可以使用show slave hosts;语句查询从库是否连接正常, 并且通过创建库,表等测试从库是否复制成功

下一篇将介绍使用orchestrator进行主从切换等操作