介绍
MySQL是⽬前最流⾏的开源关系型数据库,国内⾦融⾏业也开始全⾯使⽤,其中MySQL5.7.17提出的 MGR(MySQL Group Replication)既可以很好的保证数据⼀致性⼜可以⾃动切换,具备故障检测功能、 ⽀持多节点写⼊,MGR是⼀项被普遍看好的技术。 MGR(MySQL Group Replication)是MVSQL⾃带的⼀个插件,可以灵活部署。MySQLMGR集群是多个 MySQL Server节点共同组成的分布式集群,每个Server都有完整的副本,它是基于ROW格式的⼆进制 ⽇志⽂件和GTID特性。
MySQLMGR优点
- 强⼀致性,基于原⽣复制及paxos协议的组复制技术,并以插件的⽅式提供,提供⼀致数据安全保证;
- ⾼容错性,只要不是⼤多数节点坏掉就可以继续⼯作,有⾃动检测机制,当不同节点产⽣资源争⽤ 冲突时,不会出现错误,按照先到者优先原则进⾏处理,并且内置了⾃动化脑裂防护机制;
- 高扩展性,节点的新增和移除都是⾃动的,新节点加⼊后,会⾃动从其他节点上同步状态,直到新节点和其他节点保持⼀致,如果某节点被移除了,其他节点⾃动更新组信息,⾃动维护新的组信息;
- 高灵活性,有单主模式和多主模式,单主模式下,会⾃动选主,所有更新操作都在主上进⾏;多主模 式下,所有server都可以同时处理更新操作。
MGR的约束
- 仅⽀持InnoDB表,并且每张表⼀定要有⼀个主键,⽤于做writeset的冲突检测;
- 必须打开GTID特性,⼆进制⽇志格式必须设置为ROW,⽤于选主与writeset;主从状态信息存于表中
(-master-info-repository=TABLE、–relay-log-info-repository=TABLE),–og-slave-updates
打开 - MGR不⽀持⼤事务,事务⼤⼩最好不超过143MB,当事务过⼤,⽆法在5秒的时间内通过⽹络在组
成员之间复制消息,则可能会怀疑成员失败了,然后将其驱逐出局 - ⽬前⼀个MGR集群最多⽀持9个节点
- 不⽀持外键于save point特性,⽆法做全局间的约束检测与部分事务回滚
- ⼆进制⽇志不⽀持Binlog Event Checksum
MGR适用场景
- ⾦融交易、重要数据存储、对主从⼀致性要求⾼的场景
- 核心数据总量未过亿
- 读多写少的应⽤场景,如互联⽹电商
MGR的搭建
主MySQL虚拟机
下载安装包
mkdir /usr/local/mysql
mkdir /usr/local/mysql/data
cd /usr/local/mysql
wget https://cdn.mysql.com/archives/mysql-8.0/mysql-8.0.18-el7-x86_64.tar.gz
tar -xzvf mysql-8.0.18-el7-x86_64.tar.g
解决依赖和用户权限
yum -y install wget cmake gcc gcc-c++ ncurses ncurses-devel libaio-devel openssl openssl-devel
groupadd mysql
useradd -r -g mysql -s /bin/false mysql
chown -R mysql:mysql ./
mv mysql-8.0.18-el7-x86_64 mysql8
配置文件
vim /etc/my.cnf
my.cnf编辑:
[mysqld]
port=3306
basedir=/usr/local/mysql/mysql8
datadir=/usr/local/mysql/data
character-set-server=utf8mb4
default-storage-engine=INNODB
default_authentication_plugin=mysql_native_password
lower_case_table_names=1
plugin_dir=/usr/local/mysql/mysql8/lib/plugin
server_id=1
gtid_mode=ON
enforce_gtid_consistency=ON
binlog_checksum=NONE
transaction_write_set_extraction=XXHASH64
loose-group_replication_recovery_use_ssl=ON
loose-group_replication_group_name="bbbbbbbb-bbbb-cccc-dddd-eeeeeeeeeeee"
loose-group_replication_start_on_boot=OFF
loose-group_replication_local_address="192.168.88.129:24901"
loose-group_replication_group_seeds="192.168.88.129:24901,192.168.88.130:24901,192.168.88.131:24901"
loose-group_replication_bootstrap_group=OFF
初始化
cd /usr/local/mysql/mysql8/bin
./mysqld --initialize --user=mysql --datadir=/usr/local/mysql/data/
启动MySQL服务
./mysqld_safe --user=mysql &
登录MySQL服务,设置用户权限
./mysql -uroot -p
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'ape
Source123456!';
CREATE USER 'rpl_user'@'%' IDENTIFIED BY 'apeSource123456!';
#赋予主从同步权限
GRANT REPLICATION SLAVE ON *.* TO 'rpl_user'@'%';
#让刚才的修改⽣效
FLUSH PRIVILEGES;
#删除已产⽣的Binlog
reset master;
如果已经有root@%该⽤户:
ALTER USER 'rpl_user'@'%' IDENTIFIED WITH mysql_native_password BY 'apeSource123456!';
安装MGR插件并查询结果:
install plugin group_replication soname 'group_replication.so';
在主服务器上要运⾏的指令
开启主服务器在启动的时候完成组复制
set global group_replication_bootstrap_group=ON;
start group_replication;
set global group_replication_bootstrap_group=OFF;
从1服务器
下载安装包
mkdir /usr/local/mysql
mkdir /usr/local/mysql/data
cd /usr/local/mysql
wget https://cdn.mysql.com/archives/mysql-8.0/mysql-8.0.18-el7-x86_64.tar.gz
tar -xzvf mysql-8.0.18-el7-x86_64.tar.gz
解决依赖和用户权限
yum -y install wget cmake gcc gcc-c++ ncurses ncurses-devel libaio-devel openssl openssl-devel
groupadd mysql
useradd -r -g mysql -s /bin/false mysql
chown -R mysql:mysql ./
mv mysql-8.0.18-el7-x86_64 mysql8
配置文件
vim /etc/my.cnf
从1服务器文件配置
[mysqld]
port=3306
basedir=/usr/local/mysql/mysql8
datadir=/usr/local/mysql/data
character-set-server=utf8mb4
default-storage-engine=INNODB
default_authentication_plugin=mysql_native_password
lower_case_table_names=1
plugin_dir=/usr/local/mysql/mysql8/lib/plugin
server_id=2
gtid_mode=ON
enforce_gtid_consistency=ON
binlog_checksum=NONE
loose-group_replication_recovery_get_public_key=ON
loose-group_replication_recovery_use_ssl=ON
loose-group_replication_group_name="bbbbbbbb-bbbb-cccc-dddd-eeeeeeeeeeee"
loose-group_replication_start_on_boot=OFF
loose-group_replication_local_address="192.168.88.130:24901"
loose-group_replication_group_seeds="192.168.88.129:24901,192.168.88.130:24901,192.168.88.131:24901"
loose-group_replication_bootstrap_group=OFF
cd /usr/local/mysql/mysql8/bin
./mysqld --initialize --user=mysql --datadir=/usr/local/mysql/data/
./mysqld_safe --user=mysql &
./mysql --uroot -p
#修改root密码为apeSource123456!
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'apeSource123456!';
#创建rpl_user账户,此账户⽤于实现主从数据同步
CREATE USER 'rpl_user'@'%' IDENTIFIED BY 'apeSource123456!';
#赋予主从同步权限
GRANT REPLICATION SLAVE ON *.* TO 'rpl_user'@'%';
#让刚才的修改⽣效
FLUSH PRIVILEGES;
#删除已产⽣的Binlog
reset master;
#安装同步插件
install plugin group_replication soname 'group_replication.so';
# 查询状态
SELECT * FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME='group_replication' \G;
#从服务器设置同步账号和开启复制
change master to master_user="rpl_user", master_password="apeSource123456!" for channel 'group_replication_recovery';
start group_replication;
检查是否成功
#在主服务器上执⾏查看
select * from performance_schema.replication_group_members;
以上就是MGR的设置,多台服务器同样的写法