【NoSQL】抛弃VIP,使用consul和sentinel构建redis的高可用系统
- 背景:
传统redis高可用方案只加了sentinel,在主库故障后,虽然可以选主,然后切换只读参数,但是,对
应用来说却需要更改连接的IP或者在hosts中更改解析。算得上是半自动。
利用consul系统的服务注册与服务健康检查功能可以实现全自动的故障切换与地址解析。 - 架构:
- 搭建:
1.建立consul集群,在redis节点上布置consul agent
2.建立sentinel集群
3.注册服务(重点)
首先在redis2222实例上新建redis主从检测脚本
cat >/root/check/redis_role.sh<<EOF<br/>#!/bin/bash<br/>PORT=$1<br/>ROLE=$2<br/>a=$(redis-cli -p $PORT info Replication|grep role:|awk -F ':' '{print $2}'|awk -F '\r' '{print $1}' )<br/>if [ $a = $ROLE ]; then<br/>exit 0<br/>else<br/>exit 2<br/>fi<br/>EOF
注:脚本使用方式:/root/check/redis_role.sh 2222 master
第一个参数2222代表端口
第二个参数master代表主,也可使用slave
原理:摘出info命令中replication段的role属性,然后和第二个变量相对比,相同,则输出0
(shell脚本正常运行的返回值),否则返回2(shell脚本执行异常的返回值)
其次:创建consul的redis服务配置文件
cat >/etc/consu/redis_2222.json<<EOF<br/>{<br/>"services":[<br/>{<br/>"id":"2222master",<br/>"name":"redis-master",<br/>"tags":["master"],<br/>"address":"192.168.1.131",<br/>"port":2222,<br/>"check":[<br/>{<br/>"args":["/root/check/redis_role.sh","2222","master"],<br/>"interval":"3s"<br/>}<br/>]<br/>},<br/>{<br/>"id":"2222slave",<br/>"name":"2222slave"<br/>"tags":["slave"]<br/>"address":"192.168.1.131"<br/>"port":2222<br/>"checks":[<br/>{<br/>"args":["/root/check/redis_role.sh","2222","slave"],<br/>"interval":"3s"<br/>}<br/>]<br/>}<br/>]<br/>}<br/>EOF
在redis3333实例所在的主机上同样操作。
解释:在2222实例上我们注册两个服务,一个为redis-master,一个为redis-slave。
在3333实例上也注册了同样的两个服务,在consul系统中,将json配置文件中name属性相同的
服务视为同一个服务。因为consul本身是具备健康检查的功能,一个服务中如果两个节点都OK
服务域名解析是将会轮询到两个节点中,但健康检查失败后,域名解析时会自动踢出fail节点。
情况1:redis2222为主实例,redis3333为从实例通过在脚本对redis的主从属性进行检查, "args":["/root/check/redis_role.sh","2222","master"],在脚本中,我们设置了读取传入的两个参数并进行使用,在consul配置文件中,对传入参数需要使用“,”分割,并且无论数字或者字符串都需要加上双引号。2222的实例中role为master,3333的实例role为 slave。分别满足了redis-master和redis-slave的健康检查,consul在解析redis-master.service.consul和redis-slave.service.consul时分别指向了redis2222的主机和redis3333的地址。此时: ping redis-master.service.consul 》192.168.1.131ping redis-slave.service.consul 》192.168.1.104APP可以通过redis-master.service.consul:2222对redis进行写入,通过redis-master.service.consul:3333对redis进行分散读请求consul web页面如图
情况2:redis2222节点故障,sentinel自动提升redis3333节点为主节点,2222重新上线后,被sentinel集群配置为指向3333的从节点。此时: ping redis-master.service.consul 》192.168.1.104ping redis-slave.service.consul 》192.168.1.131APP可以通过redis-master.service.consul:3333对redis进行写入,通过redis-master.service.consul:2222对redis进行分散读请求consul web页面如图
后记: 1.本文中为了显著区分两个redis实例,对端口进行了区分,实际应用推荐使用相同端口(如2222)这样每次访问redis-master.service.consul:2222都能访问到主实例每次访问redis-master.service.consul:2222都能访问到从实例2. consul定期执行健康检测脚本并接收返回值0作为服务处于正常的标志,返回值1作为服务处于警告状态,除此之外任何其他返回值都被认为服务处于故障状态。实际使用时根据自身情况设置健康检测脚本执行的频率3.这种切换架构的便利性建立在数据库端可以自洽的完成主从选举与切换的特性上,同理,这种思路还可以用在consul+MongoDB副本集,consul+PXC集群上。4.官方文档地址:`https://www.consul.io/docs/index.html`相关配置文件已放置在GitHub:`https://github.com/naughtyGitCat/HA_DB/tree/master/Consul`
【NoSQL】抛弃VIP,使用consul和sentinel构建redis的高可用系统相关推荐
- 如何构建一套高可用的 APP 消息推送平台
转载自 如何构建一套高可用的 APP 消息推送平台 消息推送作为移动 APP 运营中的一项关键技术,已经被越来越广泛的运用.本文追溯了推送技术的发展历史,剖析了其核心原理,并对推送服务的关键技术进行 ...
- Redis Sentinel安装与部署,实现redis的高可用
Redis Sentinel安装与部署,实现redis的高可用 原文:Redis Sentinel安装与部署,实现redis的高可用 前言 对于生产环境,高可用是避免不了要面对的问题,无论什么环境.服 ...
- 基于Sentinel的Redis3.2高可用方案
默认情况下,Redis node和sentinel的protected-mode都是yes,在搭建集群时,若想从远程连接redis集群,需要将redis.conf和sentinel.conf的prot ...
- Redis Sentinel 源码:Redis的高可用模型分析
摘要:本文通过对Redis Sentinel源码的理解,详细说明Sentinel的代码实现方式. Redis Sentinel 是Redis提供的高可用模型解决方案.Sentinel可以自动监测一个或 ...
- 拒绝空谈 AI 设想!手把手教你构建实时、高可用的 AI 调度平台
当前人工智能飞速发展,机器学习的精度和性能也在不断提高,由机器学习引导的技术正在默默改变着大家的生活,并创造出很多新的商业机会和价值. 人工智能目前最直接的出发点就是让计算机能将人眼看到的.人耳听到的 ...
- 如何构建一套高可用的移动消息推送平台?
消息推送作为移动 APP 运营中的一项关键技术,已经被越来越广泛的运用.本文追溯了推送技术的发展历史,剖析了其核心原理,并对推送服务的关键技术进行深入剖析,围绕消息推送时产生的服务不稳定性,消息丢失. ...
- 构建企业级业务高可用的延时消息中台
来自:架构之美 1.业务场景剖析 公司业务系统(比如:电商系统)中有大量涉及定时任务的业务场景,例如:实现买卖双方在线沟通的IM系统,为了确保接收方能够收到消息,服务端一般都会有重试策略,即服务端在消 ...
- 【Linux】【Services】【SaaS】Docker+kubernetes(11. 构建复杂的高可用网络)
1. 简介 flannel在实战阶段貌似不能胜任在灾难恢复时候异地的网络,打算用openvswith试试 转载于:https://www.cnblogs.com/demonzk/p/8404103.h ...
- Redis|Sentinel 高可用架构
一 前言 Redis-Sentinel是Redis官方推荐的高可用性(HA)解决方案,当用Redis做Master-slave的高可用方案时,假如master宕机了,Redis本身(包括它的很多客户端 ...
最新文章
- Go 学习笔记(49)— Go 标准库之 io/ioutil(读写文件、获取目录下的文件和子目录、创建临时目录和文件)
- 英特尔新CEO的「第一把火」:火速返聘退休3年的“酷睿i7之父”
- Go 开发关键技术指南 | 敢问路在何方?(内含超全知识大图)
- How to run a estimaton
- 数据结构与算法 / 概念
- LINQ是死是活?——很奇怪为什么会有这样的话题?
- Android学习之路十三:BroadCast
- 《Spring1之 第一次站立会议(重发)》
- 由树莓派折腾中联想到的一个需求---基于Wiki的分布式协同编辑百科学习笔记本
- SQL:postgresql中判断一个点是否落在指定区域
- 基于springboot+vue的(高考)志愿录取系统(前后端分离)
- linux读usb转ttl串口数据,ubuntu16.04使用USB转TTL(ch340)串口转usb调试过程
- 又一暴强的截图工具 ShareX
- arch-yaourt安装
- 寒假的一点笔记《123速通》
- 【JPA】记录JPA批量处理的优化
- 外部接口调用失败重试
- 九、系统的软中断导致CPU使用率升高,我该怎么办?
- 360安全卫士直达 卸载软件的位置
- 酒店管理系统功能结构图