Mysql主从集群搭建——基于docker-compose一键部署

搭建初衷

  • 本身自己就是开发这类应用的工作者,一个私有库还是很有必要的。无论是公司项目还是私人项目都可以用到,不用担心忘记同步导致的数据丢失
  • 统一管理所有docker应用的数据(如果容器可以连接mysql的话)也方便随时修改数据
  • 结构可视化,方便拓展一些容器的功能,比如Halo的代码

注意事项

  • 所有基础应用都会在统一一个docker公用网络中,要先创建这个网络。我们这边就是创建了一个名为basenetwork的网络。后续所有Mysql、Redis、MongoDB、nacos、ES都会连到这个网络中。具体如何创建docker公用网络,百度一下或者GPT一下,很简单的
  • 为了方便容器的排序,我将所有基础服务的名称都加上了zz-前缀,可以自行修改

增加相关配置

目录结构

├── init_db
├── master
│   └── my.conf
├── slave1
│   └── my.conf
├── slave2
│   └── my.conf
└── docker-compose.yml

docker-compose.yml

version: "3"
services:
  mysql-master:
    container_name: zz-base-mysql-master
    hostname: mysql-master
    image: "mysql:5.7"
    ports:
      - 3306:3306
    volumes:
      - ./master/etc:/etc/mysql
      - ./master/var/lib:/var/lib/mysql
      - ./master/my.cnf:/etc/my.cnf
      - ./init_db/:/docker-entrypoint-initdb.d/
    environment:
      MYSQL_ROOT_PASSWORD: 填入超级管理员密码
      MYSQL_DATABASE: rule_platform
      MYSQL_USER: 填入普通用户
      MYSQL_PASSWORD: 填入普通用户密码
      TZ: Asia/Shanghai
    command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    restart: always
    networks:
      basenetwork:
        ipv4_address: 172.16.0.101

  mysql-slave-1:
    container_name: zz-base-mysql-slave-1
    hostname: mysql-slave-1
    image: "mysql:5.7"
    ports:
      - 3307:3306
    volumes:
      - ./slave1/etc:/etc/mysql
      - ./slave1/var/lib:/var/lib/mysql
      - ./slave1/my.cnf:/etc/my.cnf
      - ./slave1/init_db/:/docker-entrypoint-initdb.d/
    environment:
      MYSQL_ROOT_PASSWORD: 填入超级管理员密码
      MYSQL_DATABASE: rule_platform
      MYSQL_USER: 填入普通用户
      MYSQL_PASSWORD: 填入普通用户密码
      TZ: Asia/Shanghai
    command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    restart: always
    networks:
      basenetwork:
        ipv4_address: 172.16.0.102

  mysql-slave-2:
    container_name: zz-base-mysql-slave-2
    hostname: mysql-slave-2
    image: "mysql:5.7"
    ports:
      - 3308:3306
    volumes:
      - ./slave2/etc:/etc/mysql
      - ./slave2/var/lib:/var/lib/mysql
      - ./slave2/my.cnf:/etc/my.cnf
      - ./slave2/init_db/:/docker-entrypoint-initdb.d/
    environment:
      MYSQL_ROOT_PASSWORD: 填入超级管理员密码
      MYSQL_DATABASE: rule_platform
      MYSQL_USER: 填入普通用户
      MYSQL_PASSWORD: 填入普通用户密码
      TZ: Asia/Shanghai
    command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    restart: always
    networks:
      basenetwork:
        ipv4_address: 172.16.0.103

networks:
  basenetwork:
    external: true

master的my.cnf

[mysqld]
# 主数据库端ID号
server_id = 101
# 开启GTID模式
gtid-mode = ON
enforce-gtid-consistency = 1
# 开启二进制日志
log-bin = mysql-bin
# 不需要复制的数据库名(mysql库一般不同步)
binlog-ignore-db = mysql
# 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size = 1M
# 二进制日志自动删除的天数,默认值为0,表示“没有自动删除”,启动时和二进制日志循环时可能删除
expire_logs_days = 7
# 将函数复制到slave
log_bin_trust_function_creators = 1
# 主从复制的格式(mixed,statement,row,默认格式是statement)
binlog_format = mixed
# 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
# 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors = 1062
# log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates = ON

# MySQL 8.x,需要如下配置
default_authentication_plugin=mysql_native_password
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci

slave-1的my.cnf

[mysqld]
# 从数据库端ID号
server_id = 102
# 开启GTID模式
gtid-mode = ON
enforce-gtid-consistency = 1
# 开启二进制日志
log-bin = mysql-slave1-bin
# 不需要复制的数据库名(mysql库一般不同步)
binlog-ignore-db = mysql
# 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size = 1M
# 二进制日志自动删除的天数,默认值为0,表示“没有自动删除”,启动时和二进制日志循环时可能删除
expire_logs_days = 7
# 主从复制的格式(mixed,statement,row,默认格式是statement)
binlog_format = mixed
# 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
# 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors = 1062
# log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates = ON
relay_log = mysql-relay-bin
read_only=1

slave2的my.cnf

[mysqld]
# 从数据库端ID号
server_id = 103
# 开启GTID模式
gtid-mode = ON
enforce-gtid-consistency = 1
# 开启二进制日志
log-bin = mysql-slave2-bin
# 不需要复制的数据库名(mysql库一般不同步)
binlog-ignore-db = mysql
# 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size = 1M
# 二进制日志自动删除的天数,默认值为0,表示“没有自动删除”,启动时和二进制日志循环时可能删除
expire_logs_days = 7
# 主从复制的格式(mixed,statement,row,默认格式是statement)
binlog_format = mixed
# 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
# 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors = 1062
# log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates = ON
relay_log = mysql-relay-bin
read_only=1

启动容器

填入好docker-compose.yml文件中那些需要手动填入的内容,创建好所有文件文件夹之后,就可以启动容器了。
在docker-compose.yml目录下,运行sudo docker-compose up -d即可

配置主从同步

在服务器(宿主机)上运行以下sh命令即可

# master
docker exec -it zz-base-mysql-master bash
mysql -uroot -p填入root用户密码
create user 'repl'@'%' identified by 'repl';
grant replication client,replication slave on *.* to 'repl'@'%';

# slave
docker exec -it zz-base-mysql-slave bash
mysql -uroot -p填入root用户密码
reset master;
CHANGE MASTER TO MASTER_HOST='mysql-master',MASTER_USER='repl',MASTER_PASSWORD='repl',MASTER_PORT=3306,MASTER_AUTO_POSITION=1;
start slave;

至此,完事!~

如果你某个容器要使用mysql库了,将这个容器设置在basenetwork网络下,然后就可以直接使用172.16.0.101这个地址连接到了。
内网也可以直接使用Navicat或者dataGrip连接。
当然,如果想让外网也访问到可以配置个frp,之后会再出一篇frp的教程,感谢支持!

image

END。

欢迎访问我的blog > https://blog.taotaojs.top/archives/mysql%E4%B8%BB%E4%BB%8E%E9%9B%86%E7%BE%A4%E6%90%AD%E5%BB%BA%E5%9F%BA%E4%BA%8Edocker-compose%E4%B8%80%E9%94%AE%E9%83%A8%E7%BD%B2

  • 30
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以参考以下步骤来使用 Docker Compose 部署 WordPress 连接 MySQL 主从复制: 1. 创建一个 Docker Compose 文件 `docker-compose.yml`,并在其中定义两个服务:WordPress 和 MySQL。 ``` version: '3.8' services: db-master: image: mysql:5.7 command: --server-id=1 --log-bin=mysql-bin --binlog-format=row --gtid-mode=ON --enforce-gtid-consistency=ON --slave-skip-errors=all restart: always environment: MYSQL_ROOT_PASSWORD: password MYSQL_DATABASE: wordpress volumes: - db-master:/var/lib/mysql networks: - wp-net db-slave: image: mysql:5.7 command: --server-id=2 --log-bin=mysql-bin --binlog-format=row --gtid-mode=ON --enforce-gtid-consistency=ON --slave-skip-errors=all --skip-log-slave-updates restart: always environment: MYSQL_ROOT_PASSWORD: password MYSQL_DATABASE: wordpress MYSQL_MASTER_HOST: db-master MYSQL_MASTER_PASSWORD: password MYSQL_ALLOW_EMPTY_PASSWORD: "yes" volumes: - db-slave:/var/lib/mysql depends_on: - db-master networks: - wp-net wordpress: depends_on: - db-slave image: wordpress:latest ports: - "8000:80" restart: always environment: WORDPRESS_DB_HOST: db-slave WORDPRESS_DB_USER: root WORDPRESS_DB_PASSWORD: password WORDPRESS_DB_NAME: wordpress volumes: - wp-content:/var/www/html/wp-content networks: - wp-net volumes: db-master: db-slave: wp-content: networks: wp-net: ``` 2. 在 `db-master` 和 `db-slave` 服务中,分别使用 `--server-id` 设置不同的 ID;使用 `--log-bin` 启用二进制日志;使用 `--binlog-format` 设置二进制日志格式为行格式;使用 `--gtid-mode` 和 `--enforce-gtid-consistency` 启用 GTID 并强制要求一致性;使用 `--slave-skip-errors=all` 设置从库同步时遇到错误时跳过。 3. 在 `db-master` 服务中,使用 `MYSQL_ROOT_PASSWORD` 和 `MYSQL_DATABASE` 设置 root 用户的密码和数据库名;使用 `volumes` 把数据卷挂载到 `/var/lib/mysql` 目录。 4. 在 `db-slave` 服务中,使用 `MYSQL_ROOT_PASSWORD` 和 `MYSQL_DATABASE` 设置 root 用户的密码和数据库名;使用 `MYSQL_MASTER_HOST` 和 `MYSQL_MASTER_PASSWORD` 分别设置主库的主机名和密码;使用 `MYSQL_ALLOW_EMPTY_PASSWORD` 设置空密码;使用 `depends_on` 指定依赖的服务;使用 `volumes` 把数据卷挂载到 `/var/lib/mysql` 目录。 5. 在 `wordpress` 服务中,使用 `depends_on` 指定依赖的服务;使用 `WORDPRESS_DB_HOST`、`WORDPRESS_DB_USER`、`WORDPRESS_DB_PASSWORD` 和 `WORDPRESS_DB_NAME` 分别设置数据库的主机名、用户名、密码和数据库名;使用 `volumes` 把数据卷挂载到 `/var/www/html/wp-content` 目录。 6. 运行 `docker-compose up -d` 启动服务。 这样就可以使用 Docker Compose 部署 WordPress 连接 MySQL 主从复制了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值