mgr集群特点
MGR(Mysql Group Replication)是5.7版本新加的特性,是一个MySQL插件。
MGR 是一个新的高可用与高扩展的方案,集群中的任何节点数据都是一样的,可以实现任何节点都可以写入,实现了真正意义上的多主。
主要包含以下几部分:
API层:负责完成和MySQL Server的交互,得到Server状态,完成事务的管理。
组件层:主要包括3个特定组件,Capture负责收集事务执行的相关信息,Applier负责应用集群事务到本地,Recovery负责节点的数据恢复。
复制层:负责冲突验证,接收和应用集群事务。
集群通信层:基于Paxos协议的集群通信引擎,以及和上层组件的交互接口。
MGR组复制:
基于传统异步复制和半同步复制的缺陷——数据的一致性问题无法保证,MySQL官方在5.7.17版本正式推出组复制(MySQL Group Replication,简称MGR)。
由若干个节点共同组成一个复制组,一个事务的提交,必须经过组内大多数节点(N / 2 + 1)决议并通过,才能得以提交。如上图所示,由3个节点组成一个复制组,Consensus层为一致性协议层,在事务提交过程中,发生组间通讯,由2个节点决议(certify)通过这个事务,事务才能够最终得以提交并响应。
引入组复制,主要是为了解决传统异步复制和半同步复制可能产生数据不一致的问题。组复制依靠分布式一致性协议(Paxos协议的变体),实现了分布式下数据的最终一致性,提供了真正的数据高可用方案(是否真正高可用还有待商榷)。其提供的多写方案,给我们实现多活方案带来了希望。
MGR是实现分布式数据库架构,底层的分布式基础是Paxos协议。通过Paxos来保证分布式数据库系统中事务的提交顺序。虽然MGR会使用Slave的通道,但只是使用这个通道的执行线程(Applier Thread)来执行远程发送过来的Binlog Event,并没有使用这个通道来传输Binlog Event。MGR没有使用异步复制的Binlog Event传输机制,也不使用MySQL的服务端口来进行通信。MGR创建了一个独立的TCP端口来进行通信,各个MySQL服务器上的Group Replication插件通过这个端口连接在一起,两两之间可以直接通信。
Binlog Event的传输并不像异步复制那样是简单的点到点之间的传输。MGR在传输数据时,使用了Paxos协议。Paxos协议保证了数据传输的一致性和原子性。MGR基于Paxos协议构建了一个分布式的状态机复制机制,这是实现多主复制的核心技术。
三个主要优点:
1. 避免脑裂:MGR中不会出现脑裂的现象(但要注意可能出现网络分区的情况,MGR根据参数group_replication_unreachable_majority_timeout=0/N设置的不同,行为稍有不同)。
2. 数据一致性保障:MGR的冗余能力很好,能够保证Binlog Event至少被复制到超过一半的成员上,只要同时宕机的成员不超过半数便不会导致数据丢失。MGR还保证只要Binlog Event没有被传输到半数以上的成员,本地成员不会将事务的Binlog Event写入Binlog文件和提交事务,从而保证宕机的服务器上不会有组内在线成员上不存在的数据。因此,宕机的服务器重启后,不再需要特殊的处理就可以加入组。
3. 多节点写入支持:多写模式下支持集群中的所有节点都可以写入。
以一个三节点的MGR集群为例。在单主模式下,当一个事务发起提交,它会通过原子广播协议将事务伴随着Binlog Event广播到其他Secondary节点上。在获得集群大多数节点同意之后,它会进行一个提交。如果通过冲突认证检测,那么该事务最终会在集群当中提交。 如果在Secondary节点上面没有通过冲突认证检测,那么Secondary节点丢弃该事务对应的Binlog,Primary节点回滚该事务
mgr集群安装
安装环境
3台服务器搭建3节点MGR集群,MySQL版本8.0.11,操作系统版本CentOS 7.3。
角色 |
IP |
版本 |
mysql-1 |
192.168.31.71 |
mysql5.8 |
mysql-2 |
192.168.31.72 |
mysql5.8 |
mysql-3 |
192.168.31.73 |
mysql5.8 |
mysql5.8安装三台操做一样
查询在centos7中是否安装了mysql;安装过则直接卸载在安装, 没有安装过则直接开始安装。
命令:rpm -qa | grep mysql
卸载:使用如下命令进行移除安装的包。
yum remove XXX
查看是否安装了mariadb;
rpm -pa | grep mariadb
如果有安装的话使用如下命令移除:
rpm -e XXX
xxx //强制删除
安装
centos的yum 源中默认是没有mysql的,所以我们需要先去官网下载mysql的repo源并安装;
地址:https://dev.mysql.com/downloads/mysql/
准备工作
修改主机名不同主机修改不同的主机名称
[root@mysql-1 ~]#hostname mysql-1
[root@mysql-1 ~]bash
添加/etc/hosts解析
[root@mysql-1 ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.31.71 mysql-1
192.168.31.72 mysql-2
192.168.31.73 mysql-3
创建用户然后将下载的 tar包上传至linux然后解压缩修改权限
[root@mysql-1 ~]#useradd mysql
[root@mysql-1 ~]# tar vxf mysql-8.0.31-linux-glibc2.12-x86_64.tar_.xz
[root@mysql-1 ~]# mv mysql-8.0.31-linux-glibc2.12-x86_64 /usr/local/mysql8.0
[root@mysql-2 local]# chown mysql:mysql -R mysql8.0/
配置环境变量
[root@mysql-1 ~]# vi /etc/profile
export MYSQL_HOME=/usr/local/mysql8.0
export PATH=${PATH}:${MYSQL_HOME}/bin
刷新环境变量
[root@mysql-1 ~]# source /etc/profile
创建目录
[root@mysql-1 local]# chown mysql:mysql -R /usr/local/mysql8.0/
[root@mysql-1 local]# mkdir -p /data/mysql/mysql8/{data,log,conf,run}/3306
[root@mysql-1 local]# mkdir -p /data/mysql/mysql8/log/3306/{redo,undo,relay}
[root@mysql-1 local]# chown -R mysql:mysql /data/mysql
[root@mysql-1 local]# chmod 750 -R /data/mysql/mysql8/{data,log,conf,run}
编写配置文件
[root@mysql-1 ~]# cat /data/mysql/mysql8/conf/3306/my.cnf
[mysqld]
##basic settings###
server-id=1
port = 3306
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
skip-name-resolve
max_connections=1000
max_user_connections=800
max_allowed_packet=512M
max_connect_errors=100000
datadir = /data/mysql/mysql8/data/3306
socket = /data/mysql/mysql8/run/3306/mysql.sock
pid_file = /data/mysql/mysql8/run/3306/mysql.pid
transaction_isolation = READ-COMMITTED
lower_case_table_names=1
default_time_zone =+8:00
open_files_limit=65535
log_timestamps=system
wait_timeout=900
interactive_timeout=900
socket = /data/mysql/mysql8/run/3306/mysql.sock
##innodb setting##
innodb_buffer_pool_size = 256M
innodb_buffer_pool_instances = 1
innodb_io_capacity=2000
innodb_flush_method=O_DIRECT
innodb_log_group_home_dir = /data/mysql/mysql8/log/3306/redo
innodb_log_file_size = 128M
innodb_log_files_in_group=4
innodb_log_buffer_size = 32M
innodb_undo_directory = /data/mysql/mysql8/log/3306/undo
innodb_undo_tablespaces = 4
innodb_undo_log_truncate=1
innodb_max_undo_log_size=1G
innodb_flush_neighbors=0
innodb_flush_log_at_trx_commit = 1
innodb_print_all_deadlocks = 1
innodb_online_alter_log_max_size=128M
innodb_lock_wait_timeout=10
innodb_file_per_table=ON
innodb_doublewrite=ON
##log settings##
log-error = /data/mysql/mysql8/log/3306/error.log
log-bin = /data/mysql/mysql8/log/3306/mysql_bin.log
slow_query_log = 1
slow_query_log_file = /data/mysql/mysql8/log/3306/mysql_slow_query.log
long_query_time = 10
##replication settings##
gtid-mode=on
enforce-gtid-consistency=true
master-info-repository=TABLE
relay-log-info-repository=TABLE
sync-master-info=1000
relay_log_recovery = 1
relay-log=/data/mysql/mysql8/log/3306/relay/mysql-relay-bin
#binlog
log_bin=/data/mysql/mysql8/log/3306/binlog
expire_logs_days=10
max_binlog_cache_size=1024M
sync_binlog=1
##MGR settings
binlog_checksum = NONE
log_slave_updates = ON
binlog_format=row
#transaction_write_set_extraction ='XXHASH64'
#loose-group_replication_group_name = '38f34157-cbe8-4623-a7bd-054cc5c2de0b'
#loose-group_replication_start_on_boot = off
#loose-group_replication_local_address = '192.168.31.71:33061'
#loose-group_replication_group_seeds ='192.168.31.71:33061,192.168.31.72:33061,192.168.31.73:33061'
#loose-group_replication_bootstrap_group = off
#loose-group_replication_ip_whitelist = '192.168.31.71/24,192.168.31.72/24,192.168.31.73/24'
[client]
port = 3306
socket = /data/mysql/mysql8/run/3306/mysql.sock
在这里需要注意的是地方,由于MGR的插件,mysql默认是没有安装的,所以在这里关于MGR的配置参数,都注释掉了,等数据库实例启动之后,再开启。每个节点的server-id需要设置成不一样
初始化数据库
[root@mysql-1 ~]# /usr/local/mysql8.0/bin/mysqld --defaults-file=/data/mysql/mysql8/conf/3306/my.cnf --initialize --basedir=/usr/local/mysql8.0/ --datadir=/data/mysql/mysql8/data/3306 --user=mysql --initialize-insecure --ssl --explicit_defaults_for_timestamp
启动数据库,安装mgr插件,设置复制账号(所有节点执行)
启动数据库
[root@mysql-1 ~]# /usr/local/mysql8.0/bin/mysqld_safe --defaults-file=/data/mysql/mysql8/conf/3306/my.cnf &
关闭数据库
[root@mysql-1 ~]# /usr/local/mysql8.0/bin/mysqladmin -uroot --socket=/data/mysql/mysql8/run/3306/mysql.sock shutdown &
登录数据库测试
[root@mysql-1 ~]# mysql -uroot --socket=/data/mysql/mysql8/run/3306/mysql.sock
如果登录失败请自行查看日志
[root@mysql-1 ~]# cat /data/mysql/mysql8/log/3306/error.log
MGR单主模式集群部署
安装mgr插件三台一样执行
mysql> install plugin group_replication soname 'group_replication.so';
安装好插件之后,将MGR的参数注释去掉,重启mysql实例。编辑配置文件 /home/mysql/etc/my_mgr_8.0.cnf,三个
节点除了server_id、loose-group_replication_local_address、report_host 三个参数不一样外,其他保持一致
在所有节点上执行以下命令,创建复制用户
mysql> set sql_log_bin=0;
mysql> create user 'repl'@'%' identified with mysql_native_password by 'repl';
mysql> grant replication slave,replication client on *.* to 'repl'@'%';
mysql> flush privileges;
mysql> set sql_log_bin=1;
在192.168.31.71服务上设置主节点
mysql> set global group_replication_single_primary_mode=on;
mysql> set global group_replication_bootstrap_group=ON;
mysql> CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='repl' FOR CHANNEL 'group_replication_recovery';
mysql> start group_replication;
mysql> set global group_replication_bootstrap_group=OFF;
设置好主之后,就开始设置剩下2个从节点了,执行命令都是一样的。
mysql> CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='repl' FOR CHANNEL 'group_replication_recovery';
mysql> start group_replication;
查看集群状态
mysql> select * from performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION | MEMBER_COMMUNICATION_STACK |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+
| group_replication_applier | 17b2bd06-81c2-11ed-ac3e-000c29bcc462 | mysql-3 | 3306 | ONLINE | SECONDARY | 8.0.31 | XCom |
| group_replication_applier | 387fad18-81c1-11ed-8a01-000c29a3687c | mysql-2 | 3306 | ONLINE | SECONDARY | 8.0.31 | XCom |
| group_replication_applier | 52286078-81a2-11ed-a00f-000c298e2321 | mysql-1 | 3306 | ONLINE | PRIMARY | 8.0.31 | XCom |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+
3 rows in set (0.02 sec)
可以看到,3个节点状态为online,并且主节点为192.168.31.71,只有主节点可以写入,其他节点只读,MGR单主模式搭建成功。
单主切换到多主模式
MGR切换模式需要重新启动组复制,因些需要在所有节点上先关闭组复制,设置 group_replication_single_primary_mode=OFF 等参数,再启动组复制。
所有节点执行
mysql> stop group_replication;
mysql> set global group_replication_single_primary_mode=OFF;
mysql> set global group_replication_enforce_update_everywhere_checks=ON;
选择任意节点执行
mysql> SET GLOBAL group_replication_bootstrap_group=ON;
mysql> START GROUP_REPLICATION;
mysql> SET GLOBAL group_replication_bootstrap_group=OFF;
剩余节点执行
mysql> START GROUP_REPLICATION;
查看集群状态
mysql> select * from performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION | MEMBER_COMMUNICATION_STACK |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+
| group_replication_applier | 17b2bd06-81c2-11ed-ac3e-000c29bcc462 | mysql-3 | 3306 | ONLINE | PRIMARY | 8.0.31 | XCom |
| group_replication_applier | 387fad18-81c1-11ed-8a01-000c29a3687c | mysql-2 | 3306 | ONLINE | PRIMARY | 8.0.31 | XCom |
| group_replication_applier | 52286078-81a2-11ed-a00f-000c298e2321 | mysql-1 | 3306 | ONLINE | PRIMARY | 8.0.31 | XCom |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+
3 rows in set (0.00 sec)
多主切换到多单模式
在所有节点执行
mysql> stop group_replication;
mysql> set global group_replication_enforce_update_everywhere_checks=off;
选择主节点数据库执行
mysql> set global group_replication_single_primary_mode=on;
mysql> set global group_replication_bootstrap_group=ON;
mysql> start group_replication;
mysql> set global group_replication_bootstrap_group=OFF;
剩余节点执行
mysql> set global group_replication_single_primary_mode=on;
mysql> START GROUP_REPLICATION;
查看集群状态
mysql> select * from performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION | MEMBER_COMMUNICATION_STACK |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+
| group_replication_applier | 17b2bd06-81c2-11ed-ac3e-000c29bcc462 | mysql-3 | 3306 | ONLINE | SECONDARY | 8.0.31 | XCom |
| group_replication_applier | 387fad18-81c1-11ed-8a01-000c29a3687c | mysql-2 | 3306 | ONLINE | SECONDARY | 8.0.31 | XCom |
| group_replication_applier | 52286078-81a2-11ed-a00f-000c298e2321 | mysql-1 | 3306 | ONLINE | PRIMARY | 8.0.31 | XCom |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+
3 rows in set (0.02 sec)