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

相关推荐
玉红7772 小时前
R语言的数据类型
开发语言·后端·golang
lvbu_2024war013 小时前
MATLAB语言的网络编程
开发语言·后端·golang
问道飞鱼3 小时前
【Springboot知识】Springboot进阶-实现CAS完整流程
java·spring boot·后端·cas
Q_19284999064 小时前
基于Spring Boot的电影网站系统
java·spring boot·后端
豌豆花下猫4 小时前
Python 潮流周刊#83:uv 的使用技巧(摘要)
后端·python·ai
凡人的AI工具箱4 小时前
每天40分玩转Django:Django部署概述
开发语言·数据库·后端·python·django
SomeB1oody4 小时前
【Rust自学】7.2. 路径(Path)Pt.1:相对路径、绝对路径与pub关键字
开发语言·后端·rust
SomeB1oody4 小时前
【Rust自学】7.3. 路径(Path)Pt.2:访问父级模块、pub关键字在结构体和枚举类型上的使用
开发语言·后端·rust
Bony-5 小时前
Go语言反射从入门到进阶
开发语言·后端·golang
凡人的AI工具箱6 小时前
每天40分玩转Django:Django Email
数据库·人工智能·后端·python·django·sqlite