之前在《打造扛的住的MySQL》和《高性能MySQL架构设计》两门实战课程中,已经为大家讲解了很多种MySQL高可用架构的设计和实现方法,包括MHA,MMM以及keepalived等方式来实现MySQL的高可用,现在MySQL5.7.17版本中Group Replicate 功能终于GA了,这使我们又多了一种高可用的架构方式,说起 Group replicate 可能大家并不是很熟悉,但是如果要说Percona 的PXC集群或是MySQL Galera 集群可能大家就比较熟悉了,其实Replicate Group的功能和PXC类似,都是一种多写集群。所不同的是,Group Replicate实现各节点的数据一致性还是基于MySQL的复制功能,而PXC则是同时在多个节点写入数据并不是基于MySQL的复制。下面我们就来看看Relicate Group 集群是如何实现的。
一、编译MySQL-5.7.17
1)下载mysql
wget http://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.17.tar.gz
2)编译MySQL
cmake . \
-DCMAKE_BUILD_TYPE:STRING=Release \
-DSYSCONFDIR:PATH=/home/mysql5717 \
-DCMAKE_INSTALL_PREFIX:PATH=/home/mysql5717 \
-DENABLED_PROFILING:BOOL=ON \
-DENABLE_DEBUG_SYNC:BOOL=OFF \
-DMYSQL_MAINTAINER_MODE:BOOL=OFF \
-DWITH_PERFSCHEMA_STORAGE_ENGINE=ON \
-DWITH_EXTRA_CHARSETS:STRING=all \
-DWITH_BIG_TABLES:BOOL=ON \
-DWITH_FAST_MUTEXES:BOOL=ON \
-DENABLE-PROFILING:BOOL=ON \
-DWITH_SSL:STRING=bundled \
-DWITH_UNIT_TESTS:BOOL=OFF \
-DWITH_ZLIB:STRING=bundled \
-DWITH_PARTITION_STORAGE_ENGINE:BOOL=ON \
-DWITH_PLUGINS=heap,csv,partition,innodb,myisam,archive \
-DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=ALL \
-DENABLED_ASSEMBLER:BOOL=ON \
-DENABLED_LOCAL_INFILE:BOOL=ON \
-DENABLED_THREAD_SAFE_CLIENT:BOOL=ON \
-DENABLED_EMBEDDED_SERVER:BOOL=OFF \
-DWITH_CLIENT_LDFLAGS:STRING=all-static \
-DINSTALL_LAYOUT:STRING=STANDALONE \
-DWITH_INNODB_MEMCACHED=0 \
-DENABLE_MEMCACHED_SASL=0 \
-DENABLE_MEMCACHED_SASL_PWDB=0 \
-DWITH_BOOST=/home/boost/ \
-DCOMMUNITY_BUILD:BOOL=ON
make && make install
3)初始化MySQL数据库
bin/mysqld --initialize --user=mysql \
--basedir=/home/mysql \
--datadir=/home/mysql/data
4)查询MySQL用户初始密码
grep -i "password" /home/mysql/sql_log/mysql-error.log
二、Group Replicate 部署环境
node1:192.168.0.205
node2:192.168.0.204
node3:192.168.0.203
Group Replicate要正确的运行至少需要三台服务器,当前版本中GroupReplicate最多可以支持9台服务器,如果在组中我们允许有F台服务器出现故障,而不会影响Group Replicate组正常对外提供服务,则我们至少需要2F+1台服务器。对于组中服务器数量和能够正确运行而支持的可出故障的服务器的数量可以通过以下表格获知。由此可见要形成一个Group Replicate架构至少需要三台服务器
把以上编译好的mysql部署到以上三个节点中,并启动mysql服务
#######################################################
node1,node2,node3
#######################################################
修改配置文件,以下是必须的
server_id=1 #每台服务器不同node1为1, node2为2,node3为3
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW
Group Replicate
transaction_write_set_extraction=XXHASH64
安装group replicate插件
mysql>INSTALL PLUGIN group_replication SONAME 'group_replication.so';
建立数据库复制账号
SET SQL_LOG_BIN=0;
CREATE USER dba_repl@'192.168.0.%';
GRANT REPLICATION SLAVE ON . TO dba_repl@'192.168.0.%' IDENTIFIED BY '123456';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;
#####################################################
[node1]
#####################################################
mysql > set global group_replication_group_name='aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa';
group_replication_group_name 所建立的group replicateion 组的名称,为一个UUID值。
mysql > set global group_replication_local_address='192.168.0.205:33061';
group_replication_local_address 指定本机在Group Replicate组内通讯端口,这个端口不能被任何应用使用,只能用户group replication组内的通讯。
mysql > set global group_replication_bootstrap_group=on;
group_replication_bootstrap_group这个变量仅用于初始化group replication组,在启动第一个成员后要把这个变量设置为off.
mysql > start group_replication;
启动group replication
mysql > SET GLOBAL group_replication_bootstrap_group=OFF;
关闭group_replication_bootstrap_group
##################################################################
[node2]
##################################################################
mysql > set global group_replication_group_name='aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa';
mysql > set global group_replication_local_address='192.168.0.204:33061';
mysql> set global group_replication_group_seeds='192.168.0.205:33061';
指定group replication的种子成员,可以为一个或多个已经在线的组成员IP端口为group replicate的内部通讯端口
mysql> change master to master_user='dba_repl',master_password='123456' for channel 'group_replication_recovery';
启动组内恢复链路,注意Channel名称为:group_replication_recovery
mysql> start group_replication;
##################################################################
[node3]
##################################################################
[node3模拟在复制组已经运行了一段时间后,新加节点的情况]
1)在node1备份数据库并在node3恢复(同新增slave的过程)
mysql > set global group_replication_group_name='aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa';
mysql > set global group_replication_local_address='192.168.0.203:33061';
mysql> set global group_replication_group_seeds='192.168.0.205:33061';
指定group replication的种子成员,可以为一个或多个已经在线的组成员IP端口为group replicate的内部通讯端口
mysql> change master to master_user='dba_repl',master_password='123456' for channel 'group_replication_recovery';
启动组内恢复链路,注意Channel名称为:group_replication_recovery
mysql> start group_replication;
#####################################################
[配置完成后,要在配置文件中加入以下内容,否则重启会丢失group replicate的配置]
######################################################
#
Group Replication configuration
#
loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
loose-group_replication_start_on_boot=off
loose-group_replication_local_address= "192.168.0.205:33061"
loose-group_replication_group_seeds= "192.168.0.205.33061,192.168.0.204.33061,192.168.0.203.33061"
loose-group_replication_bootstrap_group= off
loose-group_replication_single_primary_mode = off
group_replication_single_primary_mode决定group replication是否工作在单主模式下,这个参数只能在group replication关闭的情况下修改。
loose-前缀表示如果没有加载group replication插件,mysql在启动时也不会报错。
三、检查Group Replication状态
mysql> select * from replication_group_member_stats\G
1. row
CHANNEL_NAME: group_replication_applier
VIEW_ID: 14817017397923050:5
MEMBER_ID: 76dc98a1-c1d0-11e6-ae5b-080027b69f2c
COUNT_TRANSACTIONS_IN_QUEUE: 0
COUNT_TRANSACTIONS_CHECKED: 0
COUNT_CONFLICTS_DETECTED: 0
COUNT_TRANSACTIONS_ROWS_VALIDATING: 0
TRANSACTIONS_COMMITTED_ALL_MEMBERS:
LAST_CONFLICT_FREE_TRANSACTION:
1 row in set (0.00 sec)
mysql> select * from replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | 76dc98a1-c1d0-11e6-ae5b-080027b69f2c | node-3 | 3306 | ONLINE |
| group_replication_applier | 8765029f-c1d0-11e6-9ae6-0800278f75f1 | node-2 | 3306 | ONLINE |
| group_replication_applier | fe92dbfc-c1a7-11e6-a094-000c29683904 | node-1 | 3306 | ONLINE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
3 rows in set (0.00 sec)
member_state可有如下几种状态
ONLINE:成员可以正常对外提供服务
RECOVERYING:当前成员正在进行数据恢复
OFFLINE:当前mysql不是任何group replicaion组的成员
UNREACHABLE:本地失败,造成服务器不可达
ERROR:本地节点,在数据恢复或是应用日志时出现错误
mysql> select * from replication_applier_status;
+----------------------------+---------------+-----------------+----------------------------+
| CHANNEL_NAME | SERVICE_STATE | REMAINING_DELAY | COUNT_TRANSACTIONS_RETRIES |
+----------------------------+---------------+-----------------+----------------------------+
| group_replication_recovery | OFF | NULL | 0 |
| group_replication_applier | ON | NULL | 0 |
+----------------------------+---------------+-----------------+----------------------------+
group replication有两复制链路
group_replication_recovery:这个链路用于对组成员进行数据恢复。
group_replication_applier:这个链路用于组成员增量修改数据。也就是用于应用从其它组成员中转过来的日志。