系统环境:
- centos 7.2.1511
- mysql 5.7.24-27
- proxysql 2.0.1
MGR(mysql group replication) 属于MySQL 官方的一个高可用架构。MGR安装不需要提前做主从复制。
ProxySQL是一种高性能,高可用性的协议感知代理,适用于MySQL和分支(如Percona Server和MariaDB)。
搭建部署MGR集群:
所有数据库节点需要绑定HOST主机:
cat >>/etc/hosts<<EOF
172.17.0.56 mysql-note-01
172.17.0.57 mysql-note-02
172.17.0.58 mysql-note-03
EOF
修改my.cnf配置文件:
- server_id 范围为:
1~9
添加相关MGR插件信息:
binlog_checksum=NONE
transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="3db33b36-0e51-409f-a61d-c99756e90155"
loose-group_replication_start_on_boot=off
#MGR本机IP地址
loose-group_replication_local_address= "172.17.0.56:23306"
#MGR白名单地址信息
loose-group_replication_ip_whitelist = "172.17.0.56,172.17.0.57,172.17.0.58"
#MGR集群所包含的节点信息
loose-group_replication_group_seeds= "172.17.0.56:23306,172.17.0.57:23306,172.17.0.58:23306"
loose-group_replication_bootstrap_group= off
以上配置信息是单主模式,如果想要使用多主模式需要额外添加以下信息即可
loose-group_replication_single_primary_mode=off
loose-group_replication_enforce_update_everywhere_checks=on
第一个节点配置:
SET SQL_LOG_BIN=0;
CREATE USER rpl_user@'%';
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'172.17.0.%' IDENTIFIED BY '123123';
SET SQL_LOG_BIN=1;
CHANGE MASTER TO MASTER_USER='rpl_user',
MASTER_PASSWORD='123123' FOR CHANNEL 'group_replication_recovery';
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
SET GLOBAL group_replication_bootstrap_group=ON;
start group_replication;
其它节点配置:
SET SQL_LOG_BIN=0;
CREATE USER rpl_user@'%';
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'172.17.0.%' IDENTIFIED BY '123123';
SET SQL_LOG_BIN=1;
CHANGE MASTER TO MASTER_USER='rpl_user',
MASTER_PASSWORD='123123' FOR CHANNEL 'group_replication_recovery';
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
reset master;
start group_replication;
- 查看是否MGR集群节点信息
SELECT * FROM performance_schema.replication_group_members;
配置ProxySQL读写分离:
在proxysql节点中添加主机:
INSERT INTO mysql_servers (hostgroup_id,hostname,port) values (2,'172.17.0.56',3306);
INSERT INTO mysql_servers (hostgroup_id,hostname,port) values (2,'172.17.0.57',3306);
INSERT INTO mysql_servers (hostgroup_id,hostname,port) values (2,'172.17.0.58',3306);
在proxysql配置mysql_group_replication_hostgroups表:
INSERT INTO mysql_group_replication_hostgroups (
writer_hostgroup,backup_writer_hostgroup,reader_hostgroup,
offline_hostgroup,active,max_writers,writer_is_also_reader,
max_transactions_behind) values (2,4,3,1,1,1,0,100);
mysql_group_replication_hostgroups说明:
字段名 | 描述 |
---|---|
writer_hostgroup | 包含作者的所有成员的主机组的id |
backup_writer_hostgroup | 在多主模式下运行有多个写入节点,如果这些节点的数量大于max_writers,则额外节点位于该备份写入组中 |
reader_hostgroup | 包含read_only中所有成员的主机组的id |
offline_hostgroup | 包含主机不在线或不属于该组的主机组的ID |
active | 启用后,ProxySQL将监视组并根据相应的主机组移动服务器 |
max_writers | 如果是多主模式下的组,则限制写入程序主机组中的节点数量 |
writer_is_also_reader | 布尔值,0或1,启用时,写入程序主机组中的节点也将属于读取器主机组 |
max_transactions_behind | 如果该值大于0,则它定义节点在应用组中的事务时可能滞后的程度 |
保存修改配置并生效:
SAVE MYSQL SERVERS TO DISK ;
LOAD MYSQL SERVERS TO RUNTIME ;
在MGR数据库节点中下载SQL脚本并导入:
wget https://down.niknk.com/MYSQL/addition_to_sys.sql
mysql -uroot -proot -S /data/mysql_3306_core/run/mysql_3306_core.sock < addition_to_sys.sql
在MGR数据库节点中创建监控账户:
GRANT SELECT on sys.* to 'monitor'@'172.17.0.%' identified by 'monitor';
FLUSH PRIVILEGES ;
查看导入的视图信息:
SELECT * FROM sys.gr_member_routing_candidate_status;
在proxysql节点中查看MGR中的节点信息状态:
SELECT hostgroup_id,hostname,status FROM runtime_mysql_servers ;
在proxysql节点中配置读写分离规则:
INSERT INTO mysql_query_rules(rule_id,active,match_digest,destination_hostgroup,apply)
VALUES (1,1,'^SELECT.*FOR UPDATE$',2,1),(2,1,'^SELECT',3,1);
保存添加的规则并生效:
LOAD MYSQL QUERY RULES TO RUNTIME;
SAVE MYSQL QUERY RULES TO DISK;
MGR查询相关:
查看MGR主节点所在位置:
SELECT VARIABLE_VALUE FROM performance_schema.global_status
WHERE VARIABLE_NAME= 'group_replication_primary_member';
查看MGR节点是否存活
SELECT member_state FROM performance_schema.replication_group_members
WHERE member_id=@@server_uuid ;
SELECT * FROM performance_schema.global_variables
WHERE variable_name in ('read_only','super_read_only');
查看主从延迟
SELECT RECEIVED_TRANSACTION_SET FROM performance_schema.replication_connection_status
WHERE Channel_name = 'group_replication_applier' ;
SELECT @@global.gtid_executed;