暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL 5.7 MGR+consul实现高可用架构

小黑学习营 2021-07-22
526

一、什么是MGR

  MySQL Group Replication (简称MGR)是MySQL官方推出的高扩展与高可用的解决方案。MGR提供了高可用、高扩展、高可靠的MySQL集群服务。

二、MGR的特点

· 高一致性,基于原生复制及paxos协议的组复制技术,并以插件的方式提供,提供一致数据安全保证;

· 高容错性,只要不是大多数节点坏掉就可以继续工作,有自动检测机制,当不同节点产生资源争用冲突时,不会出现错误,按照先到者优先原则进行处理,并且内置了自动化脑裂防护机制;

· 高扩展性,节点的新增和移除都是自动的,新节点加入后,会自动从其他节点上同步状态,直到新节点和其他节点保持一致,如果某节点被移除了,其他节点自动更新组信息,自动维护新的组信息;

· 高灵活性,有单主模式和多主模式,单主模式下,会自动选主,所有更新操作都在主上进行;多主模式下,所有server都可以同时处理更新操作。

三、MGR基础结构要求

引擎必须为innodb,因为需事务支持在commit时对各节点进行冲突检查

每个表必须有主键,在进行事务冲突检测时需要利用主键值对比

必须开启binlog且为row格式

开启GTID,且主从状态信息存于表中(--master-info-repository=TABLE 、--relay-log-info-repository=TABLE),--log-slave-updates打开

一致性检测设置--transaction-write-set-extraction=XXHASH64

四、MGR使用限制

RP和普通复制binlog校验不能共存,需设置--binlog-checksum=none

不支持gap lock(间隙锁),隔离级别需设置为read_committed

不支持对表进行锁操作(lock /unlock table),不会发送到其他节点执行 ,影响需要对表进行加锁操作的情况,列入mysqldump全表备份恢复操作

不支持serializable(序列化)隔离级别

DDL语句不支持原子性,不能检测冲突,执行后需自行校验是否一致

不支持外键:多主不支持,单主模式不存在此问题

最多支持9个节点:超过9台server无法加入组

五、基础环境准备

 5.1 数据库服务器规划

 

序号
IP地址
主机名
数据库
端口号
操作系统
ID
1
192.168.1.1
master
5.7
3306
centos7
1
2
192.168.1.2
slave1
5.7
3306
centos7
2
3
192.168.1.3
slave2
5.7
3306
centos7
3

 5.2 搭建MySQL数据库-----略

 5.3 配置my.cnf文件 - 添加以下内容(master节点)

server_id = 1  #服务ID
gtid_mode = ON #全局事务
enforce_gtid_consistency = ON #强制GTID的一致性
master_info_repository = TABLE #将master.info元数据保存在系统表中
relay_log_info_repository = TABLE #将relay.info元数据保存在系统表中
binlog_checksum = NONE #禁用二进制日志事件校验
log_slave_updates = ON #级联复制
log_bin = binlog #开启二进制日志记录
binlog_format= ROW #以行的格式记录


transaction_write_set_extraction = XXHASH64 #使用哈希算法将其编码为散列
loose-group_replication_group_name = 'ce9be252-2b71-11e6-b8f4-00212844f856' #加入的组名
loose-group_replication_start_on_boot = off #不自动启用组复制集群
loose-group_replication_local_address = 'master:33061' #以本机端口33061接受来自组中成员的传入连接
loose-group_replication_group_seeds ='master:33061, slave1:33062, slave2:33063' #组中成员访问表
loose-group_replication_bootstrap_group = off #不启用引导组


### 重启mysql服务

  5.4 master节点上建立复制账号

mysql> set SQL_LOG_BIN=0;   #停掉日志记录

mysql> grant replication slave on *.* to repl@'10.10.10.%' identified by '123456';

mysql> flush privileges;

mysql> set SQL_LOG_BIN=1;  #开启日志记录

mysql> change master to master_user='repl',master_password='123456'  for channel 'group_replication_recovery';  #构建group replication集群

   5.5 在master节点的mysql上安装group replication插件

-- 安装插件

mysql> install PLUGIN group_replication SONAME 'group_replication.so';

-- 查看group replication组件

mysql> show plugins;

   5.6 启动master节点上的插件

-- 设置group_replication_bootstrap_group为ON是为了表示以后加入集群的服务器以这台服务器为基准,以后加入的就不需要设置。

mysql> set global group_replication_bootstrap_group=ON;

-- 作为首个节点启动mgr集群

mysql> start group_replication;

mysql> set global group_replication_bootstrap_group=OFF;

查看mgr的状态

-- 查询表performance_schema.replication_group_members

mysql> select * from performance_schema.replication_group_members;


六、复制组添加slave节点

   6.1 修改my.cnf 配置文件

server_id = 2  #注意服务ID不一样

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 = 'ce9be252-2b71-11e6-b8f4-00212844f856'

loose-group_replication_start_on_boot = off

loose-group_replication_local_address = 'slave1:33062'

loose-group_replication_group_seeds = 'master:33061, slave1:33062, slave2:33063'

loose-group_replication_bootstrap_group = off

 

### 重启mysql


6.2 用户授权

mysql> set SQL_LOG_BIN=0;   #停掉日志记录

mysql> grant replication slave on *.* to repl@'10.10.10.%' identified by '123456';

mysql> flush privileges;

mysql> set SQL_LOG_BIN=1;  #开启日志记录

mysql> change master to master_user='repl',master_password='123456'  for channel 'group_replication_recovery';  #构建group replication集群

 

-- 安装group replication插件

mysql> install PLUGIN group_replication SONAME 'group_replication.so';

Query OK, 0 rows affected (0.00 sec)

6.3 把实例添回到之前的复制组

mysql> set global group_replication_allow_local_disjoint_gtids_join=ON;

Query OK, 0 rows affected (0.00 sec)

 

mysql> start group_replication;

Query OK, 0 rows affected (6.65 sec)

6.4 xuegod68.cn上查看复制组状态

mysql> select * from performance_schema.replication_group_members;


slave2以同样方式配置 注意server id的修改

七、consul的介绍

  什么是consul

  Consul
是HashiCorp公司推出的开源工具,Consul由Go语言开发,部署起来非常容易,只需要极少的可执行程序和配置文件,具有绿色、轻量级的特点。Consul
分布式
的、高可用
的、 可横向扩展
的用于实现分布式系统的服务发现与配置。

  consul具有哪些特点?    

       服务发现(Service Discovery):Consul提供了通过DNS或者HTTP接口的方式来注册服务和发现服务。一些外部的服务通过Consul很容易的找到它所依赖的服务。

       健康检查(Health Checking):Consul的Client可以提供任意数量的健康检查,既可以与给定的服务相关联(“webserver是否返回200 OK”),也可以与本地节点相关联(“内存利用率是否低于90%”)。操作员可以使用这些信息来监视集群的健康状况,服务发现组件可以使用这些信息将流量从不健康的主机路由出去。

     Key/Value存储:应用程序可以根据自己的需要使用Consul提供的Key/Value存储。Consul提供了简单易用的HTTP接口,结合其他工具可以实现动态配置、功能标记、领袖选举等等功能。

      安全服务通信:Consul可以为服务生成和分发TLS证书,以建立相互的TLS连接。意图可用于定义允许哪些服务通信。服务分割可以很容易地进行管理,其目的是可以实时更改的,而不是使用复杂的网络拓扑和静态防火墙规则。

       多数据中心:Consul支持开箱即用的多数据中心. 这意味着用户不需要担心需要建立额外的抽象层让业务扩展到多个区域。

八、二进制安装consul  (略)

九、添加server.json (server节点)

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

十、配置client.json (client节点)

[root@slave1 consul.d]# cat client.json 
{
"data_dir": "/data/consul",
"enable_script_checks": true,
"bind_addr": "192.168.44.20",
"retry_join": ["192.168.44.10"],
"retry_interval": "30s",
"rejoin_after_leave": true,
"start_join": ["192.168.44.10"]
}


十一、创建检测mysql状态的shell脚本 (是否为master库-所有节点都需创建)

[root@slave1 shell]# cat check_mysql_mgr_master.sh 
#!/bin/bash
port=3306
user="root"
passwod="123456"


comm="/usr/local/mysql/bin/mysql -u$user -h 127.0.0.1 -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

十二、创建检测mysql状态的shell脚本 (是否为slave库-所有节点都需创建)

[root@slave1 shell]# cat check_mysql_mgr_slave.sh 
#!/bin/bash
port=3306
user="root"
passwod="123456"


comm="/usr/local/mysql/bin/mysql -u$user -h 127.0.0.1 -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

十三、创建服务发现slave节点的json (所有节点)

[root@slave1 consul.d]# cat r-mysql-mgr-server-lhr.json 
{
"service": [
{
"name": "r-mysql-mgr-server-lhr",
"tags": ["MGR-Slave"],
"address": "192.168.44.20",
"port": 3306,
"check":
{
"args": ["/data/consul/shell/check_mysql_mgr_slave.sh"],
"interval": "5s"
}
}
]
}


十四、创建服务发现slave节点的json (所有节点)

[root@slave1 consul.d]# cat rw-mysql-mgr-server-lhr.json 
{
"service":
{
"name": "rw-mysql-mgr-server-lhr",
"tags": ["MGR-Master"],
"address": "192.168.44.20",
"port": 3306,
"check":
{
"args": ["/data/consul/shell/check_mysql_mgr_master.sh", "3306"],
"interval": "5s"
}
}
}

十五、启动consul

  nohup consul agent -config-dir=/etc/consul.d &

十六、使用build搭建DNS服务器

    搭建过后便可以使用域名进行访问 (服务宕机不需要手动切换配置)
    (类似于keepalive功能,在不能使用keepalive的情况下可以选择使用

consul的DNS功能)

文章转载自小黑学习营,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论