docker-compose 同一个虚拟机上面部署mysql集群 (一主一从)

docker-compose文件

bash 复制代码
version: "2"
services:
  mysql-master:
    #network_mode: "host"
    environment:
      MYSQL_ROOT_PASSWORD: "你数据库的密码"
    image: "docker.io/mysql:latest"
    restart: always
    container_name: mysql-master
    ports:
      - "3307:3306"
    volumes:
      - ./mysql/master/db:/var/lib/mysql
      - ./mysql/master/conf/my.cnf:/etc/my.cnf
      - ./mysql/master/init/init.sql:/docker-entrypoint-initdb.d/init.sql
    command: --max_connections=1000 --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci --default-authentication-plugin=mysql_native_password
  mysql-slave:
    #network_mode: "host"
    environment:
      MYSQL_ROOT_PASSWORD: "数据库密码"
    image: "docker.io/mysql:latest"
    restart: always
    container_name: mysql-slave
    ports:
      - "3308:3306"
    volumes:
      - ./mysql/slave/db:/var/lib/mysql
      - ./mysql/slave/conf/my.cnf:/etc/my.cnf
      - ./mysql/slave/init/init.sql:/docker-entrypoint-initdb.d/init.sql
    command: --max_connections=1000 --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci --default-authentication-plugin=mysql_native_password

挂载目录如下:

docker-compose文件与mysql文件夹同级

主机挂载文件配置

conf文件夹: my.cnf文件如下:

ini 复制代码
[mysqld]
user=mysql
default-storage-engine=INNODB
character-set-server=utf8
binlog-ignore-db=mysql
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M  
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed  
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7  
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
log-bin=mall-mysql-bin # 开启 binlog
binlog-format=ROW # 选择 ROW 模式
server_id=101 # 配置 MySQL replaction 需要定义,不要和 canal 的 slaveId 重复
binlog-do-db=user #需要进行主从同步的数据库
replicate-ignore-db=mysql #不需要进行主从同步的数据库
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8

init文件夹: init.sql文件是数据库初始化时执行的sql语句。

如下:

sql 复制代码
use mysql;
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '主机数据库密码';
flush privileges;
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE ON *.* to 'slave'@'%';
FLUSH PRIVILEGES;

分别创建两个角色,第一个用于数据库远程登录,第二个用于数据库从机角色。 db文件夹没有文件。

从机挂载文件配置

结构与主机一样,稍微修改一下挂载文件:

conf中的my.cnf

ini 复制代码
[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=102
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql  
## 开启二进制日志功能,以备Slave作为其它数据库实例的Master时使用
log-bin=mall-mysql-slave1-bin  
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M  
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed  
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7  
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062  
## relay_log配置中继日志
relay_log=mall-mysql-relay-bin  
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1  
## slave设置为只读(具有super权限的用户除外)
read_only=1
binlog-do-db=user
replicate-ignore-db=mysql

init.sql:

sql 复制代码
use mysql;
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '从机数据库密码';
flush privileges;

创建一个角色用于远程登录就好。

开始部署

进入到docker-compose文件夹:

启动: docker-compose up -d

可以用命令:docker exec -it 容器id /bin/bash进入两个数据库容器内部,

然后用 mysql -u root -p命令登录

这里我navicat远程连接进行演示:

对于主机的配置:

1.执行create database user;,创建user数据库(刚刚主机my.init文件中指出的需要同步的数据库)

2.执行show master status;

记下第一列和第二列的内容,后面会有用。

从机的配置

1.执行create database user;,创建user数据库(这一步其实也可以放到init.sql文件里面一起执行)

2.执行

ini 复制代码
CHANGE MASTER TO MASTER_HOST='主机数据库的ip地址',MASTER_USER='slave',MASTER_PASSWORD='123456',MASTER_LOG_FILE='上面查出来的第一列的文件名',MASTER_LOG_POS=第二列的数字;

比如我这里是: CHANGE MASTER TO MASTER_HOST='主机ip',MASTER_USER='slave',MASTER_PASSWORD='123456',MASTER_PORT=3307,MASTER_LOG_FILE='mall-mysql-bin.000010',MASTER_LOG_POS=156;

3.执行:start slave;开始主从同步

4.执行:show slave status; 如果出现两个yes即为成功:

此时对user数据库进行任意操作,从机都会进行同步。

相关推荐
代码小鑫4 分钟前
A031-基于SpringBoot的健身房管理系统设计与实现
java·开发语言·数据库·spring boot·后端
Json____9 分钟前
学法减分交管12123模拟练习小程序源码前端和后端和搭建教程
前端·后端·学习·小程序·uni-app·学法减分·驾考题库
monkey_meng29 分钟前
【Rust类型驱动开发 Type Driven Development】
开发语言·后端·rust
落落落sss37 分钟前
MQ集群
java·服务器·开发语言·后端·elasticsearch·adb·ruby
大鲤余1 小时前
Rust,删除cargo安装的可执行文件
开发语言·后端·rust
她说彩礼65万1 小时前
Asp.NET Core Mvc中一个视图怎么设置多个强数据类型
后端·asp.net·mvc
陈随易1 小时前
农村程序员-关于小孩教育的思考
前端·后端·程序员
_江南一点雨1 小时前
SpringBoot 3.3.5 试用CRaC,启动速度提升3到10倍
java·spring boot·后端
转转技术团队2 小时前
空间换时间-将查询数据性能提升100倍的计数系统实践
java·后端·架构
r0ad2 小时前
SpringCloud2023实战之接口服务测试工具SpringBootTest
spring boot·后端·spring cloud