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

相关推荐
大得36937 分钟前
django生成迁移文件,执行生成到数据库
后端·python·django
寻月隐君41 分钟前
Rust Web 开发实战:使用 SQLx 连接 PostgreSQL 数据库
后端·rust·github
RainbowSea1 小时前
伙伴匹配系统(移动端 H5 网站(APP 风格)基于Spring Boot 后端 + Vue3 - 06
java·spring boot·后端
Keya1 小时前
MacOS端口被占用的解决方法
前端·后端·设计模式
用户9096783069431 小时前
Python 判断一个字符串中是否含有数字
后端
jakeswang1 小时前
应用缓存不止是Redis!——亿级流量系统架构设计系列
redis·分布式·后端·缓存
RainbowSea1 小时前
伙伴匹配系统(移动端 H5 网站(APP 风格)基于Spring Boot 后端 + Vue3 - 05
vue.js·spring boot·后端
污橘1 小时前
Nginx反向代理Oracle
后端·程序员
紫穹1 小时前
005.LangChain Model
后端
葡萄城技术团队1 小时前
六大缓存(Caching)策略揭秘:延迟与复杂性的完美平衡
后端