121. MySQL MGR+Consul高可用架构部署

MySQL MGR+ Consul之数据库高可用方案实战部署

1、背景说明:

基于目前存在很多MySQL数据库单点故障,传统的MHA,PXC等方案用VIP或者DNS切换的方式可以实现、基于数据库的数据强一致性考虑,采用MGR集群,采用consul服务注册发现实现应用端通过动态DNS 访问MGR集群,实现数据库高可用,自动化切换的方案

2、MGR简介

MySQL Group Replication(MGR)是MySQL官方在5.7.17版本引进的一个数据库高可用与高扩展的解决方案,以插件形式提供,实现了分布式下数据的最终一致性,总结MGR特点如下:

  • 高一致性:基于分布式paxos协议实现组复制,保证数据一致性;
  • 高容错性:自动检测机制,只要不是大多数节点都宕机就可以继续工作,内置防脑裂保护机制;
  • 高扩展性:节点的增加与移除会自动更新组成员信息,新节点加入后,自动从其他节点同步增量数据,直到与其他节点数据一致;
  • 高灵活性:提供单主模式和多主模式,单主模式在主库宕机后能够自动选主,所有写入都在主节点进行,多主模式支持多节点写入。

3、MGR原理说明:

组复制是一种可用于实现容错系统的技术。 复制组是一个通过消息传递相互交互的 server 集群。通信层提供了原子消息(atomic message)和完全有序信息交互等保障机制
实现了基于复制协议的多主更新
复制组由多个 server成员构成,并且组中的每个 server 成员可以独立地执行事务。但所有读写(RW)事务只有在冲突检测成功后才会提交。只读(RO)事务不需要在冲突检测,可以立即提交。句话说,对于任何 RW 事务,提交操作并不是由始发 server 单向决定的,而是由组来决定是否提交。准确地说,在始发 server 上,当事务准备好提交时,该 server 会广播写入值(已改变的行)和对应的写入集(已更新的行的唯一标识符)。然后会为该事务建立一个全局的顺序。最终,这意味着所有 server 成员以相同的顺序接收同一组事务。因此,所有 server 成员以相同的顺序应用相同的更改,以确保组内一致。组复制是一种 share-nothing 复制方案,其中每个 server 成员都有自己的完整数据副本。

4、MGR的局限性:

仅支持InnodDB存储引擎的表,并且每个表必须有主键ID, 用做wirte set的冲突检测
必须启用GTID特性,binlog日志格式必须为row模式
目前一个MGR集群最多支持9个节点
不支持外健的save point特性,无法做全局间的约束检测和部分回滚
二进制日志不支持binlog event checksum

5、Consul简介

微服务架构中非常重的一个模块,提供服务注册、服务发现等,常用的服务发现模块有,zookeeper、enreka、etcd、cunsul等。
在这里插入图片描述

cousul是分布式、高可用、可横向发展的中间键,其特性如下:
1、service discovery:通过dns或者http接口提供服务注册和发现
2、health checking:自带健康检查,可提供服务故障时的转移
3、key/value storage:可存储动态配置的系统,提供http接口,
4、multi-datacenter:可以支持多数据中心

6、MGR集群环境搭建

6.1 环境准备:
10.0.0.50 consul server CentOS7.6 1c2g
10.0.0.51 db01 CentOS7.6 1c2g
10.0.0.52 db02 CentOS7.6 1c2g
10.0.0.53 db03 CentOS7.6 1c2g
6.2 db01加入集群操作:
1.配置my.cnf
[root@db01 ~]# cat /etc/my.cnf
[mysqld]
user=mysql
datadir=/data/mysql/data
basedir=/usr/local/mysql57
port=3306
socket=/tmp/mysql.sock
server_id=1
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
transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="22d56f7c-dfe5-4eb1-a21a-cf9c27e8d625"
loose-group_replication_start_on_boot=off
loose-group_replication_local_address="10.0.0.51:33061"
loose-group_replication_group_seeds="10.0.0.51:33061,10.0.0.52:33062,10.0.0.53:33063"
loose-group_replication_bootstrap_group=off
loose-group_replication_single_primary_mode=FALSE
loose-group_replication_enforce_update_everywhere_checks= TRUE

2.初始化数据库
[root@db01 ~]# mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql57 --datadir=/data/mysql/data
2020-01-02T14:20:35.705275Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2020-01-02T14:20:36.128653Z 0 [Warning] InnoDB: New log files created, LSN=45790
2020-01-02T14:20:36.161416Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2020-01-02T14:20:36.215835Z 0 [Warning] unknown variable 'loose-group_replication_group_name=22d56f7c-dfe5-4eb1-a21a-cf9c27e8d625'
2020-01-02T14:20:36.215852Z 0 [Warning] unknown variable 'loose-group_replication_start_on_boot=off'
2020-01-02T14:20:36.215855Z 0 [Warning] unknown variable 'loose-group_replication_local_address=10.0.0.51:33061'
2020-01-02T14:20:36.215858Z 0 [Warning] unknown variable 'loose-group_replication_group_seeds=10.0.0.51:33061,10.0.0.52:33062,10.0.0.53:33063'
2020-01-02T14:20:36.215861Z 0 [Warning] unknown variable 'loose-group_replication_bootstrap_group=off'
2020-01-02T14:20:36.215863Z 0 [Warning] unknown variable 'loose-group_replication_single_primary_mode=FALSE'
2020-01-02T14:20:36.215865Z 0 [Warning] unknown variable 'loose-group_replication_enforce_update_everywhere_checks=TRUE'
2020-01-02T14:20:36.218210Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: 0b471d87-2d6b-11ea-bbb1-000c292aecb1.
2020-01-02T14:20:36.219052Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
2020-01-02T14:20:36.221330Z 1 [Warning] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option.

3.以安全模式启动数据库服务
[root@db01 ~]# mysqld_safe --defaults-file=/etc/my.cnf &
[1] 1853
[root@db01 ~]# Logging to '/data/mysql/data/db01.err'.
2020-01-02T14:21:04.196112Z mysqld_safe Starting mysqld daemon with databases from /data/mysql/data

-----------------------------------------------------------------------------------------------------3306节点加入GR》

4.以socket方式登录数据库服务器
[root@db01 ~]# mysql -S /tmp/mysql.sock
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.26-log MySQL Community Server (GPL)

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

5.创建复制用户
mysql> set sql_log_bin=0;
Query OK, 0 rows affected (0.00 sec)

mysql> grant replication slave,replication client on *.* to repl@'localhost' identified by '123';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql>  grant replication slave,replication client on *.* to repl@'127.0.0.1' identified by '123';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql>  grant replication slave,replication client on *.* to repl@'10.0.0.%' identified by '123';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> set sql_log_bin=1;
Query OK, 0 rows affected (0.00 sec)

6.开启分布式复制
mysql> change master to master_user='repl',master_password='123' for channel 'group_replication_recovery';
Query OK, 0 rows affected, 2 warnings (0.01 sec)

7.加载GR插件
mysql> install plugin group_replication soname 'group_replication.so';
Query OK, 0 rows affected (0.05 sec)

mysql> show plugins;
+----------------------------+----------+--------------------+----------------------+---------+
| Name                       | Status   | Type               | Library              | License |
+----------------------------+----------+--------------------+----------------------+---------+
| binlog                     | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| mysql_native_password      | ACTIVE   | AUTHENTICATION     | NULL                 | GPL     |
| sha256_password            | ACTIVE   | AUTHENTICATION     | NULL                 | GPL     |
| CSV                        | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| MyISAM                     | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| MRG_MYISAM                 | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| PERFORMANCE_SCHEMA         | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| MEMORY                     | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| InnoDB                     | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| INNODB_TRX                 | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_LOCKS               | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_LOCK_WAITS          | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_CMP                 | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_CMP_RESET           | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_CMPMEM              | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_CMPMEM_RESET        | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_CMP_PER_INDEX       | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_CMP_PER_INDEX_RESET | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_BUFFER_PAGE         | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_BUFFER_PAGE_LRU     | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_BUFFER_POOL_STATS   | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_TEMP_TABLE_INFO     | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_METRICS             | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_FT_DEFAULT_STOPWORD | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_FT_DELETED          | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_FT_BEING_DELETED    | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_FT_CONFIG           | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_FT_INDEX_CACHE      | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_FT_INDEX_TABLE      | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_SYS_TABLES          | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_SYS_TABLESTATS      | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_SYS_INDEXES         | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_SYS_COLUMNS         | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_SYS_FIELDS          | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_SYS_FOREIGN         | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_SYS_FOREIGN_COLS    | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_SYS_TABLESPACES     | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_SYS_DATAFILES       | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_SYS_VIRTUAL         | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| partition                  | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| ARCHIVE                    | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| FEDERATED                  | DISABLED | STORAGE ENGINE     | NULL                 | GPL     |
| BLACKHOLE                  | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| ngram                      | ACTIVE   | FTPARSER           | NULL                 | GPL     |
| group_replication          | ACTIVE   | GROUP REPLICATION  | group_replication.so | GPL     |
+----------------------------+----------+--------------------+----------------------+---------+
45 rows in set (0.00 sec)

8.启动复制程序
mysql> set global group_replication_bootstrap_group=ON;
Query OK, 0 rows affected (0.00 sec)

mysql> start group_replication;
Query OK, 0 rows affected (2.15 sec)

mysql> set global group_replication_bootstrap_group=OFF;
Query OK, 0 rows affected (0.00 sec)

9.检测组是否创建并已加入新成员
mysql> select * from performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | 0b471d87-2d6b-11ea-bbb1-000c292aecb1 | db01        |        3306 | ONLINE       |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
1 row in set (0.00 sec)
6.3 db02加入集群操作:
1.配置my.cnf文件
[root@db02 ~]# cat /etc/my.cnf
[mysqld]
user=mysql
datadir=/data/mysql/data
basedir=/usr/local/mysql57
port=3306
socket=/tmp/mysql.sock
server_id=2
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
transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="22d56f7c-dfe5-4eb1-a21a-cf9c27e8d625"
loose-group_replication_start_on_boot=off
loose-group_replication_local_address="10.0.0.52:33062"
loose-group_replication_group_seeds="10.0.0.51:33061,10.0.0.52:33062,10.0.0.53:33063"
loose-group_replication_bootstrap_group=off
loose-group_replication_single_primary_mode=FALSE
loose-group_replication_enforce_update_everywhere_checks= TRUE

2.初始化数据库
[root@db02 ~]# mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql57 --datadir=/data/mysql/data
2020-01-02T14:22:26.647190Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2020-01-02T14:22:26.874073Z 0 [Warning] InnoDB: New log files created, LSN=45790
2020-01-02T14:22:26.906137Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2020-01-02T14:22:26.960025Z 0 [Warning] unknown variable 'loose-group_replication_group_name=22d56f7c-dfe5-4eb1-a21a-cf9c27e8d625'
2020-01-02T14:22:26.960043Z 0 [Warning] unknown variable 'loose-group_replication_start_on_boot=off'
2020-01-02T14:22:26.960046Z 0 [Warning] unknown variable 'loose-group_replication_local_address=10.0.0.52:33062'
2020-01-02T14:22:26.960049Z 0 [Warning] unknown variable 'loose-group_replication_group_seeds=10.0.0.51:33061,10.0.0.52:33062,10.0.0.53:33063'
2020-01-02T14:22:26.960052Z 0 [Warning] unknown variable 'loose-group_replication_bootstrap_group=off'
2020-01-02T14:22:26.960055Z 0 [Warning] unknown variable 'loose-group_replication_single_primary_mode=FALSE'
2020-01-02T14:22:26.960057Z 0 [Warning] unknown variable 'loose-group_replication_enforce_update_everywhere_checks=TRUE'
2020-01-02T14:22:26.961993Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: 4d49465f-2d6b-11ea-bf8e-000c29180ccf.
2020-01-02T14:22:26.962561Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
2020-01-02T14:22:26.963302Z 1 [Warning] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option.

3.以安全模式启动数据库服务
[root@db02 ~]# mysqld_safe --defaults-file=/etc/my.cnf &
[1] 1896
[root@db02 ~]# Logging to '/data/mysql/data/db02.err'.
2020-01-02T14:22:37.055341Z mysqld_safe Starting mysqld daemon with databases from /data/mysql/data

-----------------------------------------------------------------------------3307节点加入GR》

4.以socket方式登录数据库
[root@db02 ~]# mysql -S /tmp/mysql.sock
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.26-log MySQL Community Server (GPL)

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

5.创建复制用户
mysql> set sql_log_bin=0;
Query OK, 0 rows affected (0.00 sec)

mysql> grant replication slave,replication client on *.* to repl@'localhost' identified by '123';
ntified by '123';Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql>  grant replication slave,replication client on *.* to repl@'127.0.0.1' identified by '123';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql>  grant replication slave,replication client on *.* to repl@'10.0.0.%' identified by '123';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> set sql_log_bin=1;
Query OK, 0 rows affected (0.00 sec)

6.开启分布式复制
mysql>  change master to master_user='repl',master_password='123' for channel 'group_replication_recovery';
Query OK, 0 rows affected, 2 warnings (0.01 sec)

7.加载GR插件
mysql> install plugin group_replication soname 'group_replication.so';
Query OK, 0 rows affected (0.02 sec)

mysql> show plugins;
+----------------------------+----------+--------------------+----------------------+---------+
| Name                       | Status   | Type               | Library              | License |
+----------------------------+----------+--------------------+----------------------+---------+
| binlog                     | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| mysql_native_password      | ACTIVE   | AUTHENTICATION     | NULL                 | GPL     |
| sha256_password            | ACTIVE   | AUTHENTICATION     | NULL                 | GPL     |
| CSV                        | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| MyISAM                     | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| MRG_MYISAM                 | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| PERFORMANCE_SCHEMA         | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| MEMORY                     | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| InnoDB                     | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| INNODB_TRX                 | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_LOCKS               | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_LOCK_WAITS          | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_CMP                 | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_CMP_RESET           | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_CMPMEM              | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_CMPMEM_RESET        | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_CMP_PER_INDEX       | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_CMP_PER_INDEX_RESET | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_BUFFER_PAGE         | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_BUFFER_PAGE_LRU     | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_BUFFER_POOL_STATS   | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_TEMP_TABLE_INFO     | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_METRICS             | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_FT_DEFAULT_STOPWORD | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_FT_DELETED          | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_FT_BEING_DELETED    | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_FT_CONFIG           | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_FT_INDEX_CACHE      | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_FT_INDEX_TABLE      | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_SYS_TABLES          | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_SYS_TABLESTATS      | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_SYS_INDEXES         | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_SYS_COLUMNS         | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_SYS_FIELDS          | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_SYS_FOREIGN         | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_SYS_FOREIGN_COLS    | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_SYS_TABLESPACES     | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_SYS_DATAFILES       | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_SYS_VIRTUAL         | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| partition                  | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| ARCHIVE                    | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| FEDERATED                  | DISABLED | STORAGE ENGINE     | NULL                 | GPL     |
| BLACKHOLE                  | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| ngram                      | ACTIVE   | FTPARSER           | NULL                 | GPL     |
| group_replication          | ACTIVE   | GROUP REPLICATION  | group_replication.so | GPL     |
+----------------------------+----------+--------------------+----------------------+---------+
45 rows in set (0.00 sec)

8.启动复制程序
mysql> start group_replication;
Query OK, 0 rows affected (5.70 sec)

9.检测组是否创建并已加入新成员
mysql> select * from performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | 0b471d87-2d6b-11ea-bbb1-000c292aecb1 | db01        |        3306 | ONLINE       |
| group_replication_applier | 4d49465f-2d6b-11ea-bf8e-000c29180ccf | db02        |        3306 | ONLINE       |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
2 rows in set (0.00 sec)
6.4 db03加入集群操作:
1.配置my.cnf文件
[root@db03 ~]# cat /etc/my.cnf
[mysqld]
user=mysql
datadir=/data/mysql/data
basedir=/usr/local/mysql57
port=3306
socket=/tmp/mysql.sock
server_id=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
transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="22d56f7c-dfe5-4eb1-a21a-cf9c27e8d625"
loose-group_replication_start_on_boot=off
loose-group_replication_local_address="10.0.0.53:33063"
loose-group_replication_group_seeds="10.0.0.51:33061,10.0.0.52:33062,10.0.0.53:33063"
loose-group_replication_bootstrap_group=off
loose-group_replication_single_primary_mode=FALSE
loose-group_replication_enforce_update_everywhere_checks= TRUE

2.初始化数据库
[root@db03 ~]# mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql57 --datadir=/data/mysql/data
2020-01-02T14:23:17.897721Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2020-01-02T14:23:18.114373Z 0 [Warning] InnoDB: New log files created, LSN=45790
2020-01-02T14:23:18.148565Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2020-01-02T14:23:18.202951Z 0 [Warning] unknown variable 'loose-group_replication_group_name=22d56f7c-dfe5-4eb1-a21a-cf9c27e8d625'
2020-01-02T14:23:18.202968Z 0 [Warning] unknown variable 'loose-group_replication_start_on_boot=off'
2020-01-02T14:23:18.202972Z 0 [Warning] unknown variable 'loose-group_replication_local_address=10.0.0.53:33063'
2020-01-02T14:23:18.202975Z 0 [Warning] unknown variable 'loose-group_replication_group_seeds=10.0.0.51:33061,10.0.0.52:33062,10.0.0.53:33063'
2020-01-02T14:23:18.202977Z 0 [Warning] unknown variable 'loose-group_replication_bootstrap_group=off'
2020-01-02T14:23:18.202980Z 0 [Warning] unknown variable 'loose-group_replication_single_primary_mode=FALSE'
2020-01-02T14:23:18.202982Z 0 [Warning] unknown variable 'loose-group_replication_enforce_update_everywhere_checks=TRUE'
2020-01-02T14:23:18.205288Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: 6bd461a3-2d6b-11ea-bb92-000c290001e7.
2020-01-02T14:23:18.207983Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
2020-01-02T14:23:18.209073Z 1 [Warning] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option.

3.以安全模式启动
[root@db03 ~]# mysqld_safe --defaults-file=/etc/my.cnf &
[1] 1806
[root@db03 ~]# Logging to '/data/mysql/data/db03.err'.
2020-01-02T14:23:31.273117Z mysqld_safe Starting mysqld daemon with databases from /data/mysql/data3308加入集群》
4.以socket方式登录数据库
[root@db03 ~]# mysql -S /tmp/mysql.sock
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.26-log MySQL Community Server (GPL)

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

5.创建复制用户
mysql> set sql_log_bin=0;
Query OK, 0 rows affected (0.00 sec)

mysql> grant replication slave,replication client on *.* to repl@'localhost' identified by '123';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql>  grant replication slave,replication client on *.* to repl@'127.0.0.1' identified by '123';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql>  grant replication slave,replication client on *.* to repl@'10.0.0.%' identified by '123';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> set sql_log_bin=1;
Query OK, 0 rows affected (0.00 sec)

6.开启分布式复制
mysql> change master to master_user='repl',master_password='123' for channel 'group_replication_recovery';
Query OK, 0 rows affected, 2 warnings (0.00 sec)

7.加载GR插件
mysql> install plugin group_replication soname 'group_replication.so';
Query OK, 0 rows affected (0.03 sec)

mysql> show plugins;
+----------------------------+----------+--------------------+----------------------+---------+
| Name                       | Status   | Type               | Library              | License |
+----------------------------+----------+--------------------+----------------------+---------+
| binlog                     | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| mysql_native_password      | ACTIVE   | AUTHENTICATION     | NULL                 | GPL     |
| sha256_password            | ACTIVE   | AUTHENTICATION     | NULL                 | GPL     |
| CSV                        | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| MyISAM                     | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| MRG_MYISAM                 | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| PERFORMANCE_SCHEMA         | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| MEMORY                     | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| InnoDB                     | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| INNODB_TRX                 | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_LOCKS               | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_LOCK_WAITS          | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_CMP                 | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_CMP_RESET           | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_CMPMEM              | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_CMPMEM_RESET        | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_CMP_PER_INDEX       | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_CMP_PER_INDEX_RESET | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_BUFFER_PAGE         | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_BUFFER_PAGE_LRU     | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_BUFFER_POOL_STATS   | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_TEMP_TABLE_INFO     | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_METRICS             | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_FT_DEFAULT_STOPWORD | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_FT_DELETED          | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_FT_BEING_DELETED    | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_FT_CONFIG           | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_FT_INDEX_CACHE      | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_FT_INDEX_TABLE      | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_SYS_TABLES          | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_SYS_TABLESTATS      | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_SYS_INDEXES         | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_SYS_COLUMNS         | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_SYS_FIELDS          | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_SYS_FOREIGN         | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_SYS_FOREIGN_COLS    | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_SYS_TABLESPACES     | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_SYS_DATAFILES       | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_SYS_VIRTUAL         | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| partition                  | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| ARCHIVE                    | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| FEDERATED                  | DISABLED | STORAGE ENGINE     | NULL                 | GPL     |
| BLACKHOLE                  | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| ngram                      | ACTIVE   | FTPARSER           | NULL                 | GPL     |
| group_replication          | ACTIVE   | GROUP REPLICATION  | group_replication.so | GPL     |
+----------------------------+----------+--------------------+----------------------+---------+
45 rows in set (0.00 sec)

8.启动复制程序
mysql> start group_replication;
Query OK, 0 rows affected (3.35 sec)

9.检测组是否创建并已加入新成员
mysql> select * from performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | 0b471d87-2d6b-11ea-bbb1-000c292aecb1 | db01        |        3306 | ONLINE       |
| group_replication_applier | 4d49465f-2d6b-11ea-bf8e-000c29180ccf | db02        |        3306 | ONLINE       |
| group_replication_applier | 6bd461a3-2d6b-11ea-bb92-000c290001e7 | db03        |        3306 | ONLINE       |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
3 rows in set (0.00 sec)

=======================================================================================
组复制部分,配置文件介绍:
group_replication变量使用的loose-前缀是指示Server启用时尚未加载复制插件也将继续启动
transaction_write_set_extraction = XXHASH64
##指示Server必须为每个事务收集写集合,并使用XXHASH64哈希算法将其编码为散列
loose-group_replication_group_name="01e5fb97-be64-41f7-bafd-3afc7a6ab555"
##表示将加入或者创建的复制组命名为01e5fb97-be64-41f7-bafd-3afc7a6ab555
##可自定义(通过cat /proc/sys/kernel/random/uuid)
loose-group_replication_start_on_boot=off 
##设置为Server启动时不自动启动组复制
loose-group_replication_local_address="192.168.29.128:33061" 
##绑定本地的192.168.29.128及33061端口接受其他组成员的连接,IP地址必须为其他组成员可正常访问
loose-group_replication_group_seeds="192.168.29.128:33061,192.168.29.128:33062,192.168.29.128:33063"
##本行为告诉服务器当服务器加入组时,应当连接到192.168.29.128:33061,192.168.29.128:33062,192.168.29.128:33063
##这些种子服务器进行配置。本设置可以不是全部的组成员服务地址。
loose-group_replication_bootstrap_group = off 
##配置是否自动引导组
loose-group_replication_ip_whitelist=10.30.0.0/16,10.31.0..0/16,10.27.0.0/16##配置白名单,默认情况下只允许192.168.29.128连接到复制组,如果是其他IP则需要配置。


到此为止MGR集群已经搭建完毕、在启动集群的同时可以同时观察其成员的加入的整个过程
说几点注意事项:
1、保证集群的端口互通
2、保证performance_schema = 1 否则库里查不动成员
Check MGR集群
在primary上,创建库、表、以及增删改查信息,其集群内其它的节点都会有相应的操作,确认其集群可以正常提供服务

7.搭建consul 使其mysql-primary和mysql-slave 注册到服务发现上

7.1 在官网:https://www.consul.io/downloads.html下载对应的版本,解压后copy consul 到/usr/local/bin/下即可

分别在4台机器上安装然后运行
mkdir -pv /etc/consul.d/ && mkdir -pv /data/consul/
mkdir -pv /data/consul/shell

7.2 在consul server 编写配置文件

[root@consul ~]# cat /etc/consul.d/server.json 
{
  "data_dir": "/data/consul",
  "datacenter": "dc1",
  "log_level": "INFO",
  "server": true,    
  "node_name": "Server",
  "bootstrap_expect": 1,
  "bind_addr": "10.0.0.50",
  "client_addr": "10.0.0.50",
  "ui":true
}

7.3在consul client db01、db02、db03上编写配置文件,三台服务器的上bind_addr 修改为响应IP即可

1、db01配置文件
[root@db01 ~]# cat /etc/consul.d/client.json 
{
  "data_dir": "/data/consul",
  "enable_script_checks": true,
  "bind_addr": "10.0.0.51",
  "retry_join": ["10.0.0.50"],
  "retry_interval": "30s",
  "rejoin_after_leave": true,
  "start_join": ["10.0.0.50"] ,
  "node_name": "db01"
}

2、db02配置文件
[root@db02 ~]# cat /etc/consul.d/client.json 
{
  "data_dir": "/data/consul",
  "enable_script_checks": true,
  "bind_addr": "10.0.0.52",
  "retry_join": ["10.0.0.50"],
  "retry_interval": "30s",
  "rejoin_after_leave": true,
  "start_join": ["10.0.0.50"] ,
  "node_name": "db02"
}

3、db03配置文件
[root@db03 ~]# cat /etc/consul.d/client.json 
{
  "data_dir": "/data/consul",
  "enable_script_checks": true,
  "bind_addr": "10.0.0.53",
  "retry_join": ["10.0.0.50"],
  "retry_interval": "30s",
  "rejoin_after_leave": true,
  "start_join": ["10.0.0.50"] ,
  "node_name": "db03"
}

7.4 在consul client db01、db02、db03 编写检测primay 脚本 和检测slave 脚本

1、db01检测脚本【master】
[root@db01 ~]# cat /data/consul/shell/check_mysql_mgr_master.sh 
#!/bin/bash
port=3306
user="root"
passwod=""
comm="/usr/local/mysql/bin/mysql -u$user -hlocalhost -P $port -p$passwod"
value=`$comm -Nse "select 1"`
primary_member=`$comm -Nse "select variable_value from performance_schema.global_status WHERE VARIABLE_NAME= 'group_replication_primary_member'"`
server_uuid=`$comm -Nse "select variable_value from performance_schema.global_variables where VARIABLE_NAME='server_uuid';"`
# 判断MySQL是否存活
if [ -z $value ]
then
   echo "mysql $port is down....."
   exit 2
fi
# 判断节点状态,是否存活
node_state=`$comm -Nse "select MEMBER_STATE from performance_schema.replication_group_members where MEMBER_ID='$server_uuid'"`
if [ $node_state != "ONLINE" ]
then
   echo "MySQL $port state is not online...."
   exit 2
fi
# 判断是不是主节点
if [[ $server_uuid == $primary_member ]]
then
   echo "MySQL $port Instance is master ........"
   exit 0
else
   echo "MySQL $port Instance is slave ........"
   exit 2
fi

1.1 db01检测脚本【slave】
[root@db01 ~]# cat /data/consul/shell/check_mysql_mgr_slave.sh 
#!/bin/bash
port=3306
user="root"
passwod=""
comm="/usr/local/mysql/bin/mysql -u$user -hlocalhost -P $port -p$passwod"
value=`$comm -Nse "select 1"`
primary_member=`$comm -Nse "select variable_value from performance_schema.global_status WHERE VARIABLE_NAME= 'group_replication_primary_member'"`
server_uuid=`$comm -Nse "select variable_value from performance_schema.global_variables where VARIABLE_NAME='server_uuid';"`
# 判断mysql是否存活
if [ -z $value ]
then
   echo "mysql $port is down....."
   exit 2
fi
# 判断节点状态
node_state=`$comm -Nse "select MEMBER_STATE from performance_schema.replication_group_members where MEMBER_ID='$server_uuid'"`
if [ $node_state != "ONLINE" ]
then
   echo "MySQL $port state is not online...."
   exit 2
fi
# 判断是不是主节点
if [[ $server_uuid != $primary_member ]]
then
   echo "MySQL $port Instance is slave ........"
   exit 0
else
   node_num=`$comm -Nse "select count(*) from performance_schema.replication_group_members"`
# 判断如果没有任何从节点,主节点也注册从角色服务。
   if [ $node_num -eq 1 ]
   then
       echo "MySQL $port Instance is slave ........"
       exit 0
   else
       echo "MySQL $port Instance is master ........"
       exit 2
   fi
fi


2、db02检测脚本【master】
[root@db02 ~]# cat /data/consul/shell/check_mysql_mgr_master.sh 
#!/bin/bash
port=3306
user="root"
passwod=""
comm="/usr/local/mysql/bin/mysql -u$user -hlocalhost -P $port -p$passwod"
value=`$comm -Nse "select 1"`
primary_member=`$comm -Nse "select variable_value from performance_schema.global_status WHERE VARIABLE_NAME= 'group_replication_primary_member'"`
server_uuid=`$comm -Nse "select variable_value from performance_schema.global_variables where VARIABLE_NAME='server_uuid';"`
# 判断MySQL是否存活
if [ -z $value ]
then
   echo "mysql $port is down....."
   exit 2
fi
# 判断节点状态,是否存活
node_state=`$comm -Nse "select MEMBER_STATE from performance_schema.replication_group_members where MEMBER_ID='$server_uuid'"`
if [ $node_state != "ONLINE" ]
then
   echo "MySQL $port state is not online...."
   exit 2
fi
# 判断是不是主节点
if [[ $server_uuid == $primary_member ]]
then
   echo "MySQL $port Instance is master ........"
   exit 0
else
   echo "MySQL $port Instance is slave ........"
   exit 2
fi

2.2 db02检测脚本【slave】
[root@db02 ~]# cat /data/consul/shell/check_mysql_mgr_slave.sh 
#!/bin/bash
port=3306
user="root"
passwod=""
comm="/usr/local/mysql/bin/mysql -u$user -hlocalhost -P $port -p$passwod"
value=`$comm -Nse "select 1"`
primary_member=`$comm -Nse "select variable_value from performance_schema.global_status WHERE VARIABLE_NAME= 'group_replication_primary_member'"`
server_uuid=`$comm -Nse "select variable_value from performance_schema.global_variables where VARIABLE_NAME='server_uuid';"`
# 判断mysql是否存活
if [ -z $value ]
then
   echo "mysql $port is down....."
   exit 2
fi
# 判断节点状态
node_state=`$comm -Nse "select MEMBER_STATE from performance_schema.replication_group_members where MEMBER_ID='$server_uuid'"`
if [ $node_state != "ONLINE" ]
then
   echo "MySQL $port state is not online...."
   exit 2
fi
# 判断是不是主节点
if [[ $server_uuid != $primary_member ]]
then
   echo "MySQL $port Instance is slave ........"
   exit 0
else
   node_num=`$comm -Nse "select count(*) from performance_schema.replication_group_members"`
# 判断如果没有任何从节点,主节点也注册从角色服务。
   if [ $node_num -eq 1 ]
   then
       echo "MySQL $port Instance is slave ........"
       exit 0
   else
       echo "MySQL $port Instance is master ........"
       exit 2
   fi
fi


3、db03检测脚本【master】
[root@db03 ~]# cat /data/consul/shell/check_mysql_mgr_master.sh 
#!/bin/bash
port=3306
user="root"
passwod=""
comm="/usr/local/mysql/bin/mysql -u$user -hlocalhost -P $port -p$passwod"
value=`$comm -Nse "select 1"`
primary_member=`$comm -Nse "select variable_value from performance_schema.global_status WHERE VARIABLE_NAME= 'group_replication_primary_member'"`
server_uuid=`$comm -Nse "select variable_value from performance_schema.global_variables where VARIABLE_NAME='server_uuid';"`
# 判断MySQL是否存活
if [ -z $value ]
then
   echo "mysql $port is down....."
   exit 2
fi
# 判断节点状态,是否存活
node_state=`$comm -Nse "select MEMBER_STATE from performance_schema.replication_group_members where MEMBER_ID='$server_uuid'"`
if [ $node_state != "ONLINE" ]
then
   echo "MySQL $port state is not online...."
   exit 2
fi
# 判断是不是主节点
if [[ $server_uuid == $primary_member ]]
then
   echo "MySQL $port Instance is master ........"
   exit 0
else
   echo "MySQL $port Instance is slave ........"
   exit 2
fi

3.3 db03检测脚本【slave】
[root@db03 ~]# cat /data/consul/shell/check_mysql_mgr_slave.sh 
#!/bin/bash
port=3306
user="root"
passwod=""
comm="/usr/local/mysql/bin/mysql -u$user -hlocalhost -P $port -p$passwod"
value=`$comm -Nse "select 1"`
primary_member=`$comm -Nse "select variable_value from performance_schema.global_status WHERE VARIABLE_NAME= 'group_replication_primary_member'"`
server_uuid=`$comm -Nse "select variable_value from performance_schema.global_variables where VARIABLE_NAME='server_uuid';"`
# 判断mysql是否存活
if [ -z $value ]
then
   echo "mysql $port is down....."
   exit 2
fi
# 判断节点状态
node_state=`$comm -Nse "select MEMBER_STATE from performance_schema.replication_group_members where MEMBER_ID='$server_uuid'"`
if [ $node_state != "ONLINE" ]
then
   echo "MySQL $port state is not online...."
   exit 2
fi
# 判断是不是主节点
if [[ $server_uuid != $primary_member ]]
then
   echo "MySQL $port Instance is slave ........"
   exit 0
else
   node_num=`$comm -Nse "select count(*) from performance_schema.replication_group_members"`
# 判断如果没有任何从节点,主节点也注册从角色服务。
   if [ $node_num -eq 1 ]
   then
       echo "MySQL $port Instance is slave ........"
       exit 0
   else
       echo "MySQL $port Instance is master ........"
       exit 2
   fi
fi

7.5 启动consul server

[root@consul ~]# nohup consul agent --config-dir=/etc/consul.d >/data/consul/consul.log &
[1] 2835
[root@consul ~]# nohup: ignoring input and redirecting stderr to stdout
.......

7.6 启动consul client

[root@db01 ~]# nohup consul agent --config-dir=/etc/consul.d >/data/consul/consul.log &
[2] 3981
[root@db01 ~]# nohup: ignoring input and redirecting stderr to stdout
......

[root@db02 ~]# nohup consul agent --config-dir=/etc/consul.d >/data/consul/consul.log &
[1] 3129
[root@db02 ~]# nohup: ignoring input and redirecting stderr to stdout
......

[root@db03 ~]# nohup consul agent --config-dir=/etc/consul.d >/data/consul/consul.log &
[2] 3366
[root@db03 ~]# nohup: ignoring input and redirecting stderr to stdout

7.7 观察consul server的log日志;并查看consul成员

[root@consul ~]# consul members -http-addr='10.0.0.50:8500'
Node    Address         Status  Type    Build  Protocol  DC   Segment
Server  10.0.0.50:8301  alive   server  1.6.2  2         dc1  <all>
db01    10.0.0.51:8301  alive   client  1.6.2  2         dc1  <default>
db02    10.0.0.52:8301  alive   client  1.6.2  2         dc1  <default>
db03    10.0.0.53:8301  alive   client  1.6.2  2         dc1  <default>

7.8 访问consulserver的web页面—>http://10.0.0.50:8500/ui/
在这里插入图片描述

8. MGR+Consul高可用实现

8.1 检测MGR集群状态

mysql> select * from performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | 0b471d87-2d6b-11ea-bbb1-000c292aecb1 | db01        |        3306 | ONLINE       |
| group_replication_applier | 4d49465f-2d6b-11ea-bf8e-000c29180ccf | db02        |        3306 | ONLINE       |
| group_replication_applier | 6bd461a3-2d6b-11ea-bb92-000c290001e7 | db03        |        3306 | ONLINE       |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
3 rows in set (0.00 sec)

基于不同consul版本配置可能不太一样,三台机器都需要相应的json脚本检测mysql是否为主或从,配置文件修改相应的IP即可使用

8.2 查看consul server ui界面即可看到三台mysql的mgr集群已经注册到consul服务上
在这里插入图片描述
注意:由于每台mysql server 上都有master、slave 检测脚本、而mysql server 只能是master 或者slave、所以存在失败的检测,master检测只有一个成功,slave检测只有一个失败
8.3 consul dns配置
查看dns信息

[root@consul ~]# dig @10.0.0.50 -p 8600 r-test-3306-mydb-ser.service.consul a

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-9.P2.el7 <<>> @10.0.0.50 -p 8600 r-test-3306-mydb-ser.service.consul a
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 29663
;; flags: qr aa rd; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;r-test-3306-mydb-ser.service.consul. IN	A

;; AUTHORITY SECTION:
consul.			0	IN	SOA	ns.consul. hostmaster.consul. 1577984605 3600 600 86400 0

;; Query time: 41 msec
;; SERVER: 10.0.0.50#8600(10.0.0.50)
;; WHEN: Fri Jan 03 01:03:25 CST 2020
;; MSG SIZE  rcvd: 114

App端配置域名服务器IP来解析consul后缀的域名,DNS解析及跳转, 有三个方案:

1. 原内网dns服务器,做域名转发,consul后缀的,都转到consul server上,目前采用的这种方式 
2. dns全部跳到consul DNS服务器上,非consul后缀的,使用 recursors 属性跳转到原DNS服务器上
3. dnsmaq 转: server=/consul/10.16.X.X#8600 解析consul后缀的 
我们内网dns是用的bind,对于bind的如何做域名转发consul官网也有例子:https://www.consul.io/docs/guides/forwarding.html

基于DNS(Consul)高可用教程
8.4 构建bind域名解析:

yum install bind -y<br>配置name服务做解析:<br><br>
[root@consul-server consul]# cat /etc/named.conf
//
// named.conf
//
// Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
// server as a caching only nameserver (as a localhost DNS resolver only).
//
// See /usr/share/doc/bind*/sample/ for example named configuration files.
//
// See the BIND Administrator's Reference Manual (ARM) for details about the
// configuration located in /usr/share/doc/bind-{version}/Bv9ARM.html
 
options {
    listen-on port 53 { 10.0.0.50; };
    listen-on-v6 port 53 { ::1; };
    directory   "/var/named";
    dump-file   "/var/named/data/cache_dump.db";
    statistics-file "/var/named/data/named_stats.txt";
    memstatistics-file "/var/named/data/named_mem_stats.txt";
    recursing-file  "/var/named/data/named.recursing";
    secroots-file   "/var/named/data/named.secroots";
    allow-query     { any; };
 
    /*
     - If you are building an AUTHORITATIVE DNS server, do NOT enable recursion.
     - If you are building a RECURSIVE (caching) DNS server, you need to enable
       recursion.
     - If your recursive DNS server has a public IP address, you MUST enable access
       control to limit queries to your legitimate users. Failing to do so will
       cause your server to become part of large scale DNS amplification
       attacks. Implementing BCP38 within your network would greatly
       reduce such attack surface
    */
    recursion yes;
 
    dnssec-enable no;
    dnssec-validation no;
 
    /* Path to ISC DLV key */
    bindkeys-file "/etc/named.iscdlv.key";
 
    managed-keys-directory "/var/named/dynamic";
 
    pid-file "/run/named/named.pid";
    session-keyfile "/run/named/session.key";
};
 
logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
};
 
zone "." IN {
    type hint;
    file "named.ca";
};
 
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
include "/etc/named/consul.conf";

[root@consul-server consul]# cat /etc/named/consul.conf
zone "consul" IN {
  type forward;
  forward only;
  forwarders { 10.0.0.50 port 8600; };
};

[root@consul-server consul]# cat /etc/resolv.conf
# Generated by NetworkManager
search localdomain
nameserver 10.0.0.50

[root@consul-server consul]# systemctl start named
[root@consul-server consul]# systemctl enable named

到此为止:mysql mgr集群+consul实现高可用集群方案已尽全部完成

发布了148 篇原创文章 · 获赞 65 · 访问量 7620

猜你喜欢

转载自blog.csdn.net/chengyinwu/article/details/103812401