MySQL 5.7 组复制(MGR)配置实践

MySQL 5.7 推出了Group Replication, 即我们俗称的组复制.

组复制有两种模式:

  1. 在单主模式(single primary)下,组复制具有自动选主功能,每次只有一个 server成员接受更新,而其他的节点为只读,在primary成员发生故障时,将会有其他成员顶替成primary, 类似于切换到 fail-over 机器.

  2. 在多主模式(multi-primary)下,所有的 server 成员都可以同时接受更新(都可以写).

在本文中, 执行的是 Multi-Primary 模式.

安装

方法1: 安装 Mysql 5.7 可以通过 MySQL 官网的方式, 下载 rpm 文件, 然后yum local install 来安装, 但是因为与国外服务器的网络问题, 速度经常惨不忍睹.

方法2: 本文采用的本方法, 下载源文件自己编译. 本文用到的是 LNMP 一键安装脚本, 可以选择只安装 MySQL. 执行 shell 命令:

wget -c http://soft.vpser.net/lnmp/lnmp1.4.tar.gz && tar zxf lnmp1.4.tar.gz && cd lnmp1.4 && ./install.sh db

在两台机器都安装好. 安装完运行的时候可能会遇到一些问题.pid 未更新啊, 启动失败什么的. 无非就这些.

  1. 首先在配置文件(一般是/etc/my.cnf) 修改好错误日志路径, 比如
log_error = /var/log/mysql/error.log

保证这个目录存在且权限足够写

  1. MySQL 的目录(可能是 /var/lib/mysql), 保证用户 owner 是 mysql, 哪怕是777了也不行, 必须是在 mysql 用户组下的用户 mysql 拥有这个目录才可以;

  2. 如果上面的还不行, 去 mysql 安装目录执行:
mysqld --initialize
或者
mysqld --initialize-insecure

然后重启 mysql, 第一个命令会生成一个临时密码在日志里可以查到, 第二个命令没有密码生成, 直接登录进去改密码.

配置 Group Replication

将下面配置写入到 MySQL 配置文件 (/etc/my.cnf), 注意是要写到 [mysqld] 标签后面, 写到别的后面会无效的

server_id = 1
master_info_repository = TABLE
relay_log_info_repository = TABLE
binlog_checksum = NONE
binlog-format = ROW
gtid-mode = ON
enforce-gtid-consistency = ON
transaction_write_set_extraction ='XXHASH64'
log_slave_updates = ON
loose-group_replication_group_name = 'a376f994-6a61-4484-96a9-85f6230adxxx'
loose-group_replication_ip_whitelist = '127.0.0.1/8,xxx.xxx.xxx.xxx'
loose-group_replication_local_address = '221.111.117.118:4709'
loose-group_replication_group_seeds = '221.111.117.118:4709,221.111.117.119:4709'
loose-group_replication_single_primary_mode = OFF
loose-group_replication_enforce_update_everywhere_checks = ON
group_replication_allow_local_disjoint_gtids_join = ON

几点说明:

  • server_id: 不同机器不同, 随便设一个
  • loose-group_replication_group_name: 这个是集群号, 所有机器都要保持一致, 可以在shell 下执行 uuidgen生成;
  • group_replication_group_seeds: 所有集群内机器的 ip 和组复制端口号, 注意!这里的端口号不同于MySQL 的端口, 这个是Group Replication的通讯端口, 也就是说每个机器要给 MySQL 开放两个端口, iptables 也要做相关配置
  • group_replication_local_address: 本机的 ip 地址和通讯端口
  • 上面的 IP 和端口是我的示例随便写的, 请根据自己情况填写

上述配置完成后 重启 MySQL.

配置复制账号 (每一台机器都执行)

mysql > SET SQL_LOG_BIN=0;
mysql > CREATE USER 'repl'@'%' IDENTIFIED BY 'password';
mysql > GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
mysql > FLUSH PRIVILEGES;
mysql > SET SQL_LOG_BIN=1;
mysql > CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='password' FOR CHANNEL 'group_replication_recovery';

安装 Group Replication 插件

mysql > INSTALL PLUGIN group_replication SONAME 'group_replication.so';

启动

在其中一台机器MySQL 下执行:

SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;

在余下机器执行:

START GROUP_REPLICATION;

验证

任意台主机查询节点状态:

SELECT * FROM performance_schema.replication_group_members;

正常情况各节点都是出于 ONLINE 状态.

自己建个表验证下, 插入数据, 检查各节点同步情况;

完.