docker-compose mysql8.0 主从同步

目的

数据安全

原理

利用二进制日志作为主从同步的信使
docker-compose mysql8.0 主从同步_第1张图片

主库

my.cnf

# 创建目录
sudo mkdir -p /srv/mysql/master
# 创建文件
sudo vim /srv/mysql/master/my.cnf

/srv/mysql/master/my.cnf

[mysql]
# mysql默认字符集
default-character-set=utf8mb4

[mysqld]
# mysqld默认字符集
character-set-server=utf8mb4
# 新建表默认存储引擎
default-storage-engine=INNODB
# 认证方式
default_authentication_plugin=mysql_native_password
# 禁止域名解析,只能使用ip,可以提高性能
# skip-name-resolve
# !mysql的数据存放目录
datadir=/var/lib/mysql
# 表名不区分大小写
lower_case_table_names=1
# 最大允许数据包大小
max_allowed_packet=128M

# !设置唯一库ID
server-id=1
# !开启二进制日志并指定日志名前缀
log-bin=/var/lib/mysql/mysql-bin
# 二进制日志格式
## STATEMENT(默认):基于SQL语句的模式,binlog小,可能出错
## MIXED:混合模式,binlog大
## ROW:基于行的模式,记录行的变化,binlog最大,不出错
# binlog_format=ROW
# 最大二进制日志文件大小
max_binlog_size=100M
# 清除过期日志的时间(7天,单位s)
binlog_expire_logs_seconds=604800

mysql-master-compose.yaml

# 创建目录
sudo mkdir -p /srv/compose-file /srv/mysql/master/data /srv/mysql/master/mysql-files /srv/mysql/master/sql
# 创建文件mysql-master-compose.yaml,把mysql-master-compose.yaml中的内容放入
sudo vim /srv/compose-file/mysql-master-compose.yaml
# 运行文件mysql-master-compose.yaml
sudo docker-compose -f /srv/compose-file/mysql-master-compose.yaml up -d
# 检查
sudo docker logs -f mysql8-master

/srv/compose-file/mysql-master-compose.yaml

version: '3'
services:
  mysql8:
    image: mysql:8.0
    container_name: mysql8-master
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: xcrj_pwd
      TZ: Asia/Shanghai
    ports:
      - 3306:3306
    volumes:
      - /srv/mysql/master/my.cnf:/etc/mysql/my.cnf
      - /srv/mysql/master/data:/var/lib/mysql
      - /srv/mysql/master/mysql-files:/var/lib/mysql-files
      - /srv/mysql/master/conf.d:/etc/mysql/conf.d
      - /srv/mysql/master/sql:/sql
      - /srv/mysql/master/error.log:/var/log/mysql/error.log
      # ro只读模式
      - /etc/localtime:/etc/localtime:ro

配置

# 进入mysql8-master容器
sudo docker exec -it mysql8-master
# 进入mysql
mysql -u root -p

# 创建用户repl
mysql> CREATE USER 'replymeee'@'%' IDENTIFIED WITH mysql_native_password BY 'replymeee';
# 授予用户repl从库相关权限
mysql> GRANT REPLICATION SLAVE ON *.* TO 'replymeee'@'%';
# 刷新权限
mysql> flush privileges;
# 获取主库二进制日志文件(binary log)文件名(File)和位置(Position)
mysql> SHOW MASTER STATUS;

docker-compose mysql8.0 主从同步_第2张图片

从库

my.cnf

# 创建目录
sudo mkdir -p /srv/mysql/slave
# 创建文件
sudo vim /srv/mysql/slave/my.cnf

my.cnf

[mysql]
# mysql默认字符集
default-character-set=utf8mb4

[mysqld]
# mysqld默认字符集
character-set-server=utf8mb4
# 新建表默认存储引擎
default-storage-engine=INNODB
# 认证方式
default_authentication_plugin=mysql_native_password
# 禁止域名解析,只能使用ip,可以提高性能
# skip-name-resolve
# !mysql的数据存放目录
datadir=/var/lib/mysql
# 表名不区分大小写
lower_case_table_names=1
# 最大允许数据包大小
max_allowed_packet=128M

# !设置唯一库ID
server-id=2
# !开启二进制日志并指定日志名前缀
log-bin=/var/lib/mysql/mysql-bin
# 二进制日志格式
## STATEMENT(默认):基于SQL语句的模式,binlog小,可能出错
## MIXED:混合模式,binlog大
## ROW:基于行的模式,记录行的变化,binlog最大,不出错
# binlog_format=ROW
# 最大二进制日志文件大小
max_binlog_size=100M
# 清除过期日志的时间(7天,单位s)
binlog_expire_logs_seconds=604800

mysql-slave-compose.yaml

# 创建目录
sudo mkdir -p /srv/compose-file /srv/mysql/slave/data /srv/mysql/slave/mysql-files /srv/mysql/slave/sql
# 创建文件mysql-slave-compose.yaml,把mysql-slave-compose.yaml中的内容放入
sudo vim /srv/compose-file/mysql-slave-compose.yaml
# 运行文件mysql-slave-compose.yaml
sudo docker-compose -f /srv/compose-file/mysql-slave-compose.yaml up -d
# 检查
sudo docker logs -f mysql8-slave

mysql-slave-compose.yaml

version: '3'
services:
  mysql8:
    image: mysql:8.0
    container_name: mysql8-slave
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: xcrj_pwd
      TZ: Asia/Shanghai
    ports:
      - 3306:3306
    volumes:
      - /srv/mysql/slave/my.cnf:/etc/mysql/my.cnf
      - /srv/mysql/slave/data:/var/lib/mysql
      - /srv/mysql/slave/mysql-files:/var/lib/mysql-files
      - /srv/mysql/slave/conf.d:/etc/mysql/conf.d
      - /srv/mysql/slave/sql:/sql
      - /srv/mysql/slave/error.log:/var/log/mysql/error.log
      # ro只读模式
      - /etc/localtime:/etc/localtime:ro

配置

# 登录mysql
mysql -u root -p

# 设置主库参数,根据主库SHOW MASTER STATUS;修改
mysql> CHANGE MASTER TO
 MASTER_HOST='xxx.xxx.xxx.xxx',
 MASTER_USER='replymeee',
 MASTER_PASSWORD='replymeee',
 MASTER_LOG_FILE='mysql-bin.000003',
 MASTER_LOG_POS=836;

# 开启主从同步
mysql> start slave;

# 查看同步状态
mysql> show slave status\G;

docker-compose mysql8.0 主从同步_第3张图片

你可能感兴趣的:(docker,mysql,数据库)