MySQL5.7 多主一从

使用场景

  • 读写分离<独立出一个专门用于查的库>
  • 数据汇总<也就是数据统计那一块的东东>

基础环境

  • CentOS 7
    1
    cat /etc/os-release  
  • Docker ( Docker version 18.06.1-ce )
    1
    docker --version   
  • 数据库版本 ( MySQL 5.7 )
    • 主库1: 端口 3311
    • 主库2: 端口 3312
    • 从库1: 端口 3411

安装数据库

Docker方式 安装

如果要将 配置文件 和 数据库文档存储文件 从宿主机挂载到容器内,需要以下操作:
  • 先把容器跑一个,把样板给搞到宿主机。
1
2
3
4
5
6
7
8
docker run --rm --name temp -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
mkdir -p /home/docker/mysql/3311
docker cp temp:/var/lib/mysql /home/docker/mysql/3311/data
docker cp temp:/etc/mysql /home/docker/mysql/3311/conf
rm -rf /home/docker/mysql/3311/conf/my.cnf
cp /home/docker/mysql/3311/conf/mysql.cnf /home/docker/mysql/3311/conf/my.cnf
cp -r /home/docker/mysql/3311 /home/docker/mysql/3312
cp -r /home/docker/mysql/3311 /home/docker/mysql/3411
  • 由于每台 mysql 容器的 server-uuid 必须不同才能组成主备,所以得修改一下
1
2
3
vi /home/docker/mysql/3311/data/auto.cnf
vi /home/docker/mysql/3312/data/auto.cnf
vi /home/docker/mysql/3411/data/auto.cnf
  • 主库 1: 端口为 3311,容器名为 mysql3311

    • 在 /home/docker/mysql/3311/conf/mysql.conf.d/mysqld.cnf -- [mysqld] 增加如下内容
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      ##########################  
      ## log bin
      ##########################
      server-id = 3311 # 必须唯一
      log_bin = mysql-bin # 开启及设置二进制日志文件名称
      binlog_format = MIXED
      sync_binlog = 1
      expire_logs_days = 7 # 二进制日志文件自动删除(也就是过期)天数。不设置则默认 0,意味着不会删除

      ## 需要同步的数据库
      binlog-do_db = test3311
      ## 不需要同步的数据库
      binlog-ignore_db = mysql
      binlog-ignore_db = information_schema
      binlog-ignore_db = performation_schema
      binlog-ignore_db = sys
    • 新建容器
      1
      docker run --name mysql3311 -p 3311:3306 -v /home/docker/mysql/3311/conf:/etc/mysql -v /home/docker/mysql/3311/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
  • 主库 2: 端口为 3312,容器名为 mysql3312

    • 在 /home/docker/mysql/3312/conf/mysql.conf.d/mysqld.cnf -- [mysqld] 增加如下内容
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      ##########################  
      ## log bin
      ##########################
      server-id = 3312       # 必须唯一
      log_bin = mysql-bin # 开启及设置二进制日志文件名称
      binlog_format = MIXED
      sync_binlog = 1
      expire_logs_days = 7 # 二进制日志文件自动删除(也就是过期)天数。不设置则默认 0,意味着不会删除

      ## 需要同步的数据库
      binlog-do_db = test3312
      ## 不需要同步的数据库
      binlog-ignore_db = mysql
      binlog-ignore_db = information_schema
      binlog-ignore_db = performation_schema
      binlog-ignore_db = sys
    • 新建容器
      1
      docker run --name mysql3312 -p 3312:3306 -v /home/docker/mysql/3312/conf:/etc/mysql -v /home/docker/mysql/3312/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
  • 从库 1 的安装:注:端口为 3411,容器名为 mysql3411,做为从库 1

    • 在 /home/docker/mysql/3411/conf/mysql.conf.d/mysqld.cnf -- [mysqld] 增加如下内容
      1
      2
      3
      4
      5
      6
      ##########################  
      ## log bin
      ##########################
      server-id = 3411 # 必须唯一
      master_info_repository = table
      relay_log_info_repository = table
    • 新建容器
      1
      docker run --name mysql3411 -p 3411:3306 -v /home/docker/mysql/3411/conf:/etc/mysql -v /home/docker/mysql/3411/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

传统方式 安装 <网上百度一下,这里就不写这个了>

配置走一波(本章使用 Navicat)

  • 连接 3311,执行命令
    1
    2
    3
    GRANT REPLICATION SLAVE on *.* to 'slave'@'%' IDENTIFIED BY '123456';  
    SHOW VARIABLES LIKE 'log_bin';
    SHOW MASTER STATUS;
    结果: 如果执行 SHOW VARIABLES LIKE 'log_bin'; 回复的 Value 为 ON 则成功。
    需要的信息:抄下 show master status 结果中的 File 和 Position。
  • 连接 3312,执行命令
    1
    2
    3
    GRANT REPLICATION SLAVE on *.* to 'slave'@'%' IDENTIFIED BY '123456';  
    SHOW VARIABLES LIKE 'log_bin';
    SHOW MASTER STATUS;
    结果: 如果执行 SHOW VARIABLES LIKE 'log_bin'; 回复的 Value 为 ON 则成功。
    需要的信息:抄下 show master status 结果中的 File 和 Position。
  • 连接 3411,执行命令
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    STOP SLAVE;  

    CHANGE MASTER TO
    MASTER_HOST = '192.168.1.122', -- 连接主库的IP
    MASTER_PORT = 3311, -- 连接主库的端口
    MASTER_USER = 'slave', -- 登陆用户
    MASTER_PASSWORD = '123456', -- 登陆密码
    MASTER_LOG_FILE = 'mysql-bin.000001', -- 对应 SHOW MASTER STATUS 中的 File
    MASTER_LOG_POS = 820 -- 对应 SHOW MASTER STATUS 中的 Position
    for channel '3311'; -- 通道名,自己定义,需要唯一

    CHANGE MASTER TO
    MASTER_HOST = '192.168.1.122', -- 连接主库的IP
    MASTER_PORT = 3312, -- 连接主库的端口
    MASTER_USER = 'slave', -- 登陆用户
    MASTER_PASSWORD = '123456', -- 登陆密码
    MASTER_LOG_FILE = 'mysql-bin.000001', -- 对应 SHOW MASTER STATUS 中的 File
    MASTER_LOG_POS = 660 -- 对应 SHOW MASTER STATUS 中的 Position
    for channel '3312'; -- 通道名,自己定义,需要唯一

    START SLAVE;
  • 查看从库状态
    执行 SHOW SLAVE STATUS; 如果 Slave_IO_Running 和 Slave_SQL_Running 为 Yes 则成功