用docker-compose构建mysql主从结构

利用docker-compose构建mysql主从结构

前几天试着学习网上教程利用docker-compose搭建了一套简单的主从mysql,以学习为目的,接下来纯干货一步一步在下文演示.卷起来!!!

首先介绍笔者使用的基础环境和使用的软件.

  • Centos 7.6

  • Windows 10

  • Docker version 20.10.12

  • Docker Compose version v2.2.2

  • Navicat Premium 15

docker-compose.yml 配置及说明

笔者是在/home/docker目录下构建的文件,首先在/home/docker新建一个docker-compose.yml 执行配置文件

#docker-compse对应版本docker版本
version: '3'
services:
  # mysql配置(主)
  mysql-master:
    # 使用mysql5.7版本镜像 
    image: mysql:5.7
    # 设置自启
    restart: always
    # 容器名
    container_name: mysql-master
    # mysql root用户密码配置
    environment:
      MYSQL_ROOT_PASSWORD: 123456
    # mysql主库配置,详情看下文
    command:
      --default-authentication-plugin=mysql_native_password
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --explicit_defaults_for_timestamp=true
      --lower_case_table_names=1
      --server-id=1
      --log-bin=mysql-bin
      --binlog-do-db=数据库名
      --innodb_flush_log_at_trx_commit=2
      --sync_binlog=1
      --max_allowed_packet=128M;
    # 端口绑定
    ports:
      - 3306:3306
    # 数据卷(需要在宿主机新建对应空文件)
    volumes:
      - "/home/docker/mysql/master/my.cnf:/etc/mysql/my.cnf"
      - "/home/docker/mysql/master/conf:/etc/mysql/conf.d"
      - "/home/docker/mysql/master/data:/var/lib/mysql"
      - "/home/docker/mysql/master/error.log:/var/log/mysql/error.log"
  # mysql配置(从)
  mysql-slave-3307:
    # 使用mysql5.7版本镜像 
    image: mysql:5.7
    # 设置自启
    restart: always
    # 容器名
    container_name: mysql-slave-3307
    # mysql root用户密码配置
    environment:
      MYSQL_ROOT_PASSWORD: 123456
    # mysql主库配置,详情看/home/docker/mysql/master/my.cnf
    command:
      --default-authentication-plugin=mysql_native_password
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --explicit_defaults_for_timestamp=true
      --lower_case_table_names=1
      --server-id=428
      --max_allowed_packet=128M;

# 配置说明

这里只介绍涉及到主从配置的参数

  • server-id 设置服务 的ID (id可以自己随便设置但是要保证和slave的id不一样,从库只需配置这个)

  • log-bin=mysql-bin 启用二进制日志文件(主从的核心,不了解作用的建议去了解一下主从数据库的执行流程,笔者这里不做介绍)

  • binlog-do-db=数据库名 这个表示只同步某个库 (如果没有此项,表示同步所有的库)

  • innodb_flush_log_at_trx_commit=2

    0:事务提交时,不将重做日志缓冲写入磁盘,而是依靠 InnoDB 的主线程每秒执行一次刷新到磁盘。因此如果 MySQL 发生宕机,那么就有可能丢失一部分事务。
    ​
    1:事务提交时,会将重做日志缓冲写入磁盘,并且立即刷新(fsync())。注意,因为操作系统的“延迟写”特性,此时的刷入只是写到了操作系统的缓冲区中,因此执行同步操作才能保证一定持久化到了硬盘中。
    ​
    2:事务提交时,会将重做日志缓冲写入磁盘,但是不会立即进行刷新操作,因此只是写到了操作系统的缓冲区。此时若操作系统发生宕机而没有即时的同步,也可能会丢失一部分数据。
    ​
    可以看到,只有1才能真正地保证事务的持久性,但是由于刷新操作 fsync() 是阻塞的,直到完成后才返回,我们知道写磁盘的速度是很慢的,因此 MySQL 的性能会明显地下降。如果不在乎事务丢失,,0和2能获得更高的性能。
    ​
    在效率上:
    数据量:4w  
    临时改:set global innodb_flush_log_at_trx_commit=2;重启数据库后失效
    查询语句:SHOW GLOBAL VARIABLES LIKE 'innodb_flush_log%';
    ​
    设置0的时间:1分钟左右
    默认1的时间:20分钟左右
    设置2的时间:   8分钟左右
    ————————————————
    参考博客文档链接:https://blog.csdn.net/qq_31984879/article/details/103952183

  • sync_binlog=1 开启binlog 志同步功能

至此,准备工作完成,在该目录下使用'docker-compose up --build -d'命令将docker容器运行起来.

此处为了方便,笔者使用Navicat Premium 15接下来搭建主从mysql工作,

首先,连接上两个mysql服务.

主数据库上

# 查询log_bin状态,log_bin为ON则docker初始化构建成功
show variables like '%log_bin%';
# 准备创建主库用户并赋予权限(此处为笔者用Navicat Premium 15图形化新建账号的sql语句)
CREATE USER `用户名`@`%` IDENTIFIED WITH mysql_native_password BY '123456';
GRANT Alter, Alter Routine, Create, Create Routine, Create Temporary Tables, Create View, Delete, Drop, Event, Execute, Grant Option, Index, Insert, Lock Tables, References, Select, Show View, Trigger, Update ON `主从数据库名`.* TO `用户名`@`%`;
# 授权主库账号
GRANT REPLICATION SLAVE ON *.* TO '用户名'@'%';
# 查询主库状态,此处的File列和Position列后面从库需要用上
SHOW MASTER STATUS;

从库数据库上

# 创建主库连接
change master to
    master_host=''  ,#主库host
    master_user=''  ,#授权主库账号账号
    master_port=    ,#主库端口
    master_password=''  ,#授权主库账号账号密码
    master_log_file=''  ,#查询主库状态File列(创建主库连接前查一遍)
    master_log_pos=     ;#查询主库状态Position列(创建主库连接前查一遍,取最新值)
# 启动从库服务
start slave;
# 查看从状态
show slave status;
# 若Slave_IO_Running和Slave_SQL_Running都为Yes时,则主从Mysql搭建成功

至此主从Mysql搭建成功,此时改动主库,从库也会同步改动.

# 注意点:

  • 注意,不要改动从库,否则Slave_IO_Running将会变为No,得重新配置主从mysql

  • 建议从库使用新建一个只有读权限的账号使用,此时可以做读写分离

# 异常解决方案

# 异常解决方案
# mysql主从复制Slave_SQL_Running: No的解决办法
stop slave;
set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
start slave;
show slave status;
# mysql主从复制Slave_IO_Running: No 的解决办法启动不成功,
# 先用把数据库使用工具栏的数据传输同步,然后重新来一遍主从搭建sql
# 启动从库服务启动不成功时使用,重置从状态
reset slave;

此次教程到此为止啦,有什么不对的,不好的,值得优化的地方,欢迎各位指教~俺是小卢,喜欢钻研互联网技术,一起卷起来~

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