Mysql5.7.17提出的MGR(Mysql Group Replication)既可以很好的保证数据一致性又可以自动切换,具备故障监测功能、支持多节点写入,MGR是一项普遍被看好的技术。MGR是Mysql自带的一个插件,可以灵活部署。Mysql MGR集群是多个Mysql Server节点共同组成的分布式集群,每个server都有完整的副本,它是基于ROW格式的二进制日志文件和GTID特性。
单主模式下,会自动选主,所有更新操作都在主上进行;多主模式下,所有server都可以同时处理更新操作。此为前提,因为后面主从同步使用的通信用户是通过域名访问的,如果配置集群loose-group_replication_group_seeds直接用ip,启动插件group_replication会报Access denied for user 'rpl_user'@'localhost'
sudo cat > /etc/hosts <<-'EOF'
192.168.1.128 n3
192.168.1.163 n1
192.168.1.123 n2
EOF
hostnamectl set-hostname n1
主库在my.cnf中添加配置
# 在my.cnf中追加MGR配置
sudo cat >> /etc/my.cnf <<- 'EOF'
# 设置mysql插件所在目录,因为MGR基于插件,所以必须设置插件路径
plugin_dir=/usr/local/mysql/lib/plugin
# 服务器编号,集群中唯一
server_id=1
# 开启binlog的GTID模式
gtid_mode=ON
# 开启后mysql只允许能够保障事务安全,并且能够被日志记录的SQL语句被执行
enforce_gtid_consistency=ON
# 关闭binlog校验
binlog_checksum=NONE
# 定义用于事务期间哈希写入提取的算法,组复制模式下必须设置为XXHASH64
transaction_write_set_extraction=XXHASH64
# 确定组复制时是否应该应用SSL,通常设置为“开”,默认为“关”
loose-group_replication_recovery_use_ssl=ON
# 该服务器的实例所在复制组的名称,必须是有效的UUID,所有节点必须相同
loose-group_replication_group_name="8d814d56-5b91-94d7-ce5c-66a5d8243293";
# 确定服务器是否应该在服务器启动期间启动组复制
loose-group_replicaiton_start_on_boot_OFF
# 为复制组中其他成员提供的网络地址,指定为"主机:端口"MGR需要开启新端口24901作为同步数据,n1为域名
loose-group_replication_local_address="n1:24901";
# 用于建立新成员到组的连接组成员列表
# 这个列表指定为有逗号分割的ip和端口组成
loose-group_replication_group_seeds="n1:24901,n2:24901,n3:24901"
# 配置此服务器为引导组,这个选项必须只在一个节点上设置
# 并且仅当第一次启动组或者重新启动整个组时,成功引导组启动后,将此选项设置为关闭
loose-group_replication_bootstrap_group=OFF
EOF
# 重启服务
service mysql restart
从库中的修改
sudo cat >> /etc/my.cnf <<- 'EOF'
plugin_dir=/usr/local/mysql/lib/plugin
# 服务器编号,集群中唯一
server_id=2
gtid_mode=ON
enforce_gtid_consistency=ON
binlog_checksum=NONE
# 此参数决定primary节点到secondary的请求是否是基于RSA秘钥对的密码交换所需的公钥
loose-group_replication_recovery_get_public_key=ON
loose-group_replication_recovery_use_ssl=ON
loose-group_replication_group_name="8d814d56-5b91-94d7-ce5c-66a5d8243293";
loose-group_replicaiton_start_on_boot=OFF
# 为复制组中其他成员提供的网络地址,指定为"主机:端口"MGR需要开启新端口24901作为同步数据
loose-group_replication_local_address="本机ip:24901";
loose-group_replication_group_seeds="ip:port,ip:port,..."
loose-group_replication_bootstrap_group=OFF
EOF
# 重启服务
service mysql restart
主从都要设置
# 创建rpl_user账号,此账号用于实现主从数据同步
CREATE USER rpl_user@'%' IDENTIFIED BY '123456';
# 赋予主从同步权限
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
CHANGE MASTER TO MASTER_USER="rpl_user",MASTER_PASSWORD="123456" FOR channel 'group_replication_recovery';
# 修改生效
FLUSH PRIVILEGES;
# 删除已产品的binlog,因为刚才binlog包含创建用户这种高权限操作,用于主从同步的账号没有权限执行的
reset master;
安装MGR
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
安装完成后可以通过SELECT * FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME='group_replication' \G; 查看安装结果, PLUGIN_STATUS: ACTIVE为这个则安装成功
组网同步需要主从运行不同的脚本
我们在my.cnf配置文件中把group_replication_bootstrap_group参数设置成OFF,在primary服务器启动时不会直接启动复制组,通过下面的命令动态的开启复制组使我们的集群更安全
主库执行,每次重启主库都要执行此步骤
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;
在单主模下,组制具有自动选主功能,每次只有一个server成员接受更新,单写模式group内有一合节点可读可写,其节点只可以读,对group的部署,需要先起primary节点,然后再起其他的节点,并把这节点加进group,其他的节点就会自动同步primary节点上面的变化,然后将自己没置为读式,当primary节点意外宕机或者下线,在满是大多数节点存活的情况下,group内部发起进举,选出下一可用的读节点,提升为primary节点。primary选举根据group内剩下存活节点的UUID按字典序升序来选择,然后选择排在最前的节点作为新的primary节点。在多主模式下,所有的 server 成员都可以同时接受更新。group内的所有机器都是primary节点,同时可以进行读与写操作,并且数据是最终一致的
第一步,n0~n2节点停止组复制,并开启多主模式
stop group_replication;
#是否启用单主模式,默认ON,OFF代表多主
set global group_replication_single_primary_mode=OFF;
#是否开启条件检查,因为多主的约束更为严格,不符合要求的直接拒绝
#不支持外键的级联操作
#不支持“串行化Serializable”
set global group_replication_enforce_update_everywhere_checks=ON;
第二步,n0节点引导启用组复制
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;
第三步,n1、n2启用组复制,加入MGR集群
START GROUP_REPLICATION;
第一步,n0~n2节点停止组复制,切回单主模式
STOP GROUP_REPLICATION;
#是否启用单主模式,默认ON,OFF代表多主
set global group_replication_single_primary_mode=ON;
set global group_replication_enforce_update_everywhere_checks=OFF;
关闭主数据,模拟故障
主库出现故障后的选举策略
Plugin group_replication reported: 'This member has more executed transactions than those present in the group,提示此成员的已执行事务多于组中存在的事务,在此成员上执行reset master即可proxySQL只是作为一个中间件将对应的操作转发到主库或者从库,并且轮询各个节点的状态,如果主库挂掉,会查询新的主库,并把对应的操作转发到新的主库
ProxySQL组成
服务脚本:/etc/init.d/proxysql
配置文件:/etc/proxysql.cnf
主程序:/usr/bin/proxysql
基于SQLITE的数据库文件:/var/lib/proxysql/
启动ProxySQL:service proxysql start启动后会监听两个默认端口
6032:ProxySQL的管理端口
6033:ProxySQL对外提供服务的端口