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数据库进行任意操作,从机都会进行同步。

相关推荐
CryptoPP8 分钟前
使用WebSocket实时获取印度股票数据源(无调用次数限制)实战
后端·python·websocket·网络协议·区块链
白宇横流学长14 分钟前
基于SpringBoot实现的大创管理系统设计与实现【源码+文档】
java·spring boot·后端
草捏子44 分钟前
状态机设计:比if-else优雅100倍的设计
后端
考虑考虑2 小时前
Springboot3.5.x结构化日志新属性
spring boot·后端·spring
涡能增压发动积2 小时前
一起来学 Langgraph [第三节]
后端
sky_ph3 小时前
JAVA-GC浅析(二)G1(Garbage First)回收器
java·后端
涡能增压发动积3 小时前
一起来学 Langgraph [第二节]
后端
hello早上好3 小时前
Spring不同类型的ApplicationContext的创建方式
java·后端·架构
roman_日积跬步-终至千里3 小时前
【Go语言基础【20】】Go的包与工程
开发语言·后端·golang
00后程序员4 小时前
提升移动端网页调试效率:WebDebugX 与常见工具组合实践
后端