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

2023-12-13 13:02:46

搭建初衷

  • 本身自己就是开发这类应用的工作者,一个私有库还是很有必要的。无论是公司项目还是私人项目都可以用到,不用担心忘记同步导致的数据丢失
  • 统一管理所有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

文章来源:https://blog.csdn.net/taotaojs/article/details/134835384
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。