前面的文章有提到过利用consul+mha实现mysql的高可用,以及利用consul+sentinel实现redis的高可用,具体的请查看:http://www.cnblogs.com/gomysql/p/8010552.html。本次给大家带来mysql高可用的新玩法,利用mysql 5.7的mgr+consul实现,至于mgr是什么,有什么优势,如何搭建这里就不说了,大家自己google,我这里就是介绍利用mgr+consul实现高可用及故障自动切换。至于consul是什么可以参考前面的文章。

环境:mgr至少需要3个节点。数据库版本:mysql 5.7.19

我这里使用单主模式。

192.168.100.78
192.168.100.75
192.168.100.74

mgr搭建完成以后查看状态:

[root@localhost][performance_schema]> select * from performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-----------------+-------------+--------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-----------------+-------------+--------------+
| group_replication_applier | 8e4d93b8-4dd1-11e8-8306-6c92bf7e18e2 | ym_DB_16_100075 | 3306 | ONLINE |
| group_replication_applier | 9062a0ef-4dd1-11e8-8822-6c92bf744dd6 | ym_DB_15_100074 | 3306 | ONLINE |
| group_replication_applier | 9a7e7cd5-4dd1-11e8-b28c-6c92bf7e0d2e | ym_DB_19_100078 | 3306 | ONLINE |
+---------------------------+--------------------------------------+-----------------+-------------+--------------+

查看主节点是哪个(我的环境是单主,官方也是推荐使用单主)

[root@localhost][performance_schema]> select * from  performance_schema.replication_group_members where member_id =(select variable_value from performance_schema.global_status WHERE VARIABLE_NAME= 'group_replication_primary_member');
+---------------------------+--------------------------------------+-----------------+-------------+--------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-----------------+-------------+--------------+
| group_replication_applier | 8e4d93b8-4dd1-11e8-8306-6c92bf7e18e2 | ym_DB_16_100075 | 3306 | ONLINE |
+---------------------------+--------------------------------------+-----------------+-------------+--------------+
1 row in set (0.00 sec)

可以看见我目前的主节点是100.75。到此mgr环境ok。下面到部署consul,前面的文章提到过,需要服务发现的机器都需要安装consul客户端,也就是3台服务器都需要安装。其中涉及到2个检查脚本(脚本不够完善,比如复制延时是否进行注册)。
主节点检查脚本:

#!/bin/bash
port=$
user="root"
passwod="" 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
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
fi # 判断是不是主节点
if [[ $server_uuid == $primary_member ]]
then
echo "MySQL $port Instance is master ........"
exit
else
echo "MySQL $port Instance is slave ........"
exit
fi

从节点检查脚本:

#!/bin/bash
port=$
user="root"
passwod="" 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
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
fi # 判断是不是主节点
if [[ $server_uuid != $primary_member ]]
then
echo "MySQL $port Instance is slave ........"
exit
else
node_num=`$comm -Nse "select count(*) from performance_schema.replication_group_members"`
# 判断如果没有任何从节点,主节点也注册从角色服务。
if [ $node_num -eq ]
then
echo "MySQL $port Instance is slave ........"
exit
else
echo "MySQL $port Instance is master ........"
exit
fi
fi

其中一台服务器的consul配置文件,有master和slave,如下:

[root@ym_DB_16_100075 conf]# cat payment--mydb-ser.json
{
"services": [
{
"name": "payment-3306-mydb-ser",
"tags": [
"充值-3306"
],
"address": "192.168.100.75",
"port": ,
"checks": [
{
"script": "/usr/local/consul/shell/check_mysql_mgr_master.sh 3306",
"interval": "15s"
}
]
}
]
}
[root@ym_DB_16_100075 conf]# cat r-payment--mydb-ser.json
{
"services": [
{
"name": "r-payment-3306-mydb-ser",
"tags": [
"充值-3306"
],
"address": "192.168.100.75",
"port": ,
"checks": [
{
"script": "/usr/local/consul/shell/check_mysql_mgr_slave.sh 3306",
"interval": "15s"
}
]
}
]
}

其他两台服务器配置文件一样,只是"address"改成对应服务器的地址就完事。启动consul。ping其中一个域名,比如:payment-3306-mydb-ser.service.consul,那么返回的是主节点的ip,因为这个域名是写的。如果ping r-payment-3306-mydb-ser.service.consul,那么返回的是另外两个从节点的ip。

从上面可以看到写的域名解析到的主节点,读的域名解析到了2个从节点,从节点可以实现负载均衡的效果。

故障测试:

1. 把主节点停掉,查看写的域名payment-3306-mydb-ser.service.consul会解析到哪里。

[root@localhost][(none)]> select * from  performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-----------------+-------------+--------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-----------------+-------------+--------------+
| group_replication_applier | 9062a0ef-4dd1-11e8-8822-6c92bf744dd6 | ym_DB_15_100074 | 3306 | ONLINE |
| group_replication_applier | 9a7e7cd5-4dd1-11e8-b28c-6c92bf7e0d2e | ym_DB_19_100078 | 3306 | ONLINE |
+---------------------------+--------------------------------------+-----------------+-------------+--------------+
2 rows in set (0.00 sec)

停掉以后发现之前的100.75主节点已经被移除,已经自动选出新的节点:

[root@localhost][(none)]> select * from  performance_schema.replication_group_members where member_id =(select variable_value from performance_schema.global_status WHERE VARIABLE_NAME= 'group_replication_primary_member');
+---------------------------+--------------------------------------+-----------------+-------------+--------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-----------------+-------------+--------------+
| group_replication_applier | 9062a0ef-4dd1-11e8-8822-6c92bf744dd6 | ym_DB_15_100074 | 3306 | ONLINE |
+---------------------------+--------------------------------------+-----------------+-------------+--------------+

可以看到现在的主节点已经是100.74,那么我们看看域名payment-3306-mydb-ser.service.consul解析到哪里:

可以看到没有问题,正常。再看看读域名:r-payment-3306-mydb-ser.service.consul

可以看到一切正常。后续检查脚本可以判断是否延时,如果延时就不注册服务。

MySQL高可用新玩法之MGR+Consul的更多相关文章

  1. 032:基于Consul和MGR的MySQL高可用架构

    目录 一.Consul 1.Consul简介 2.准备环境 3.Consul 安装 4.Consul配置文件 5.Consul 服务检查脚本 6.Consul启动 二.MGR搭建 1.MGR配置 2. ...

  2. MySQL高可用架构之MySQL5.7组复制MGR

    MySQL高可用架构之MySQL5.7组复制MGR########################################################################### ...

  3. 【DB宝45】MySQL高可用之MGR+Consul架构部署

    目录 一.MGR+Consul架构简介 二.搭建MGR 2.1.申请3台MGR机器 2.2.3台主机安装MySQL环境 2.3.修改MySQL参数 2.4.重启MySQL环境 2.5.安装MGR插件( ...

  4. MySQL高可用复制管理工具 —— Orchestrator使用

    背景 在上一篇「MySQL高可用复制管理工具 —— Orchestrator介绍」中大致介绍了Orchestrator的功能.配置和部署,当然最详细的说明可以查阅官方文档.本文开始对Orchestra ...

  5. MySQL高可用复制管理工具 —— Orchestrator介绍

    背景 在MySQL高可用架构中,目前使用比较多的是Percona的PXC,Galera以及MySQL 5.7之后的MGR等,其他的还有的MHA,今天介绍另一个比较好用的MySQL高可用复制管理工具:O ...

  6. MYSQL高可用集群架构-MHA架构

    1  MHA简介:MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公司 ...

  7. (5.1)mysql高可用系列——高可用架构方案概述

    关键词:mysql高可用概述,mysql高可用架构 常用高可用方案 20190918 现在业内常用的MySQL高可用方案有哪些?目前来说,用的比较多的开源方案分内置高可用与外部实现,内置高可用有如下: ...

  8. MySQL高可用方案-MySQL InnoDB Cluster

    MySQL InnoDB Cluster简介 MySQL InnoDB Cluster 是最新GA的MySQL高可用方案,利用MySQL Group Replication和MySQL Shell.M ...

  9. Mysql 高可用(MHA)-读写分离(Atlas)-分布式架构(Mycat)

    Mysql 高可用(MHA)-读写分离(Atlas) 1. 搭建主从复制(一主两从) 1.1 准备环境 1 主库:10.0.0.51/db01 2 从库:10.0.0.52/db02,10.0.0.5 ...

随机推荐

  1. beego笔记

    beego学习笔记一:创建第一个beego Web项目 Go语言beego框架快速搭建体验五分钟讲解01 beego框架图文简介五分钟讲解02 beego框架图文简介五分钟讲解03-go语言简单方式操 ...

  2. golang 快速排序及二分查找

    二分查找 func main() { arr := []int{0, 1, 2, 3, 4, 5, 6} fmt.Println(BinarySearch(arr, 5)) } func Binary ...

  3. OpenAL音频库例程

    Windows下C++可用的OpenAL demo. 基于alut工具库的OpenAL例程,涵盖了基本的OpenAL指令,对部分作出了注释,并且可以播放(当然得把对应的音频文件放到正确的路径下). # ...

  4. windows安装zookeeper

    ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服务的软件,提供的功 ...

  5. 20个Linux防火墙应用技巧

    转载 1.显示防火墙的状态 以root权限运行下面的命令: # iptables -L -n -v 参数说明: -L:列出规则. -v:显示详细信息.此选项会显示接口名称.规则选项和TOS掩码,以及封 ...

  6. entity framework 上下文对象跟踪相关

    entity framework 上下文对于对象的跟踪有2中方式进行控制,第一种从数据库查询但不加载到上下文. 这里可以用到.AsNoTracing()方法. 这里用到的是实体(entity)在上下文 ...

  7. ef core 相关

    1.为什么使用ef core? 市面上orm框架那么多,为何偏偏选择ef,dapper那么好用,性能碾压ef,为什么使用dapper? 对于这个问题我记得当初一个老师讲entityframework的 ...

  8. centos jdk 配置及版本切换

    一. 环境变量: /etc/profile JAVA_HOME=/usr/lib/jdk1.8.0_91JRE_HOME=/usr/lib/jdk1.8.0_91/jreCLASS_PATH=.:$J ...

  9. kaldi运行thchs30例子

    首先,thchs30有两种数据库,kaldi运行的数据库最好是 thchs30-openslr. 修改run.sh里面的语音库路径  thchs30=... 修改nj线程数 等于CPU的核心数 修改c ...

  10. 没执行过 rm -rf /* 的开发不是好运维

    阅读本文大概需要 1 分钟. 打开终端,获取 root 权限,执行以下命令:rm -rf /*,会发生什么呢?估计只要接触过 Linux 的人,肯定没少听过它的故事,清楚之后会发生什么可怕的事情. 科 ...