Redis系列

第1篇

Redis是目前使用最广泛的缓存程序之一,也被应用于多种场景,例如数据缓存、分布式锁等,Redis官方提供了多种部署架构,以满足不同应用场景下对于高可用和扩展性的要求。

01

单节点(single)

单节点的部署是最简单的,只要启动一个redis进程就可以了,但是不具备高可用性,一般生产环境不建议使用,其主要有以下问题:

单节点,一旦出问题,服务将会不可用【1】单节点读能力有限,无法扩展【2】单节点写能力有限,无法扩展【3】单节点的存储能力受到单机的限制【4】

02

主从复制(master-slave)

由于单节点服务不可用问题【1】,Redis提供了主从复制的功能,使用主从复制模式,一旦主节点服务不可用,则可以启用从节点,尽量保证数据量不丢失(Redis主从复制提供的是最终一致性)。另外一方面从节点可以扩展主节点的读能力,分担大并发量的读操作【2】。

redis主从复制每从节点只能有一个主节点,而主节点可以同时具备多个从节点,复制流量只能是单向的,只能从主节点流向从节点。配置Master-Slave有三种方式:

在redis配置文件中增加配置:slaveof {masterHost} {masterPort}

在启动redis-server的命令行后添加:--slaveof {masterHost} {masterPort}

启动redis-server以后登陆redis-server终端输入命令:slaveof {masterHost} {masterPort}

注意:如果主节点配置了requirepass,则需要从节点配masterauth参数。

如何查看节点是否已经成功配置了Master-Slave配置呢?可以在节点上执行命令info replication,这个命令在master节点和slave节点上展示的内容不一样,可以看到各自的角色信息master/role,主节点或者从节点IP和端口信息。

主节点127.0.0.1:6379>info replication

127.0.0.1:6379>info replication# Replicationrole:masterconnected_slaves:1slave0:ip=127.0.0.1,port=6380,state=online,......

从节点127.0.0.1:6380>info replication

127.0.0.1:6380>info replication# Replicationrole:slavemaster_host:127.0.0.1master_port:6379master_link_status:upmaster_last_io_seconds_ago:5master_sync_in_progress:0...

一个节点可以使用slaveof {masterHost} {masterPort}变成一个从节点,也可以使用slaveof no one断开复制,重新变成一个主节点。

另外,从节点还可以实现切换主节点的功能,将当前从接待你对主节点的复制切换到对另外一个新的主节点的复制,只需要操作命令:slaveof {newMasterHost} {newMasterPort}

切换主节点涉及流程如下:

  1. 断开与当前主节点的复制关系
  2. 与新的主节点建立复制关系
  3. 删除从节点当前的所有数据(特别注意,一旦操作失误,原来的数据将会被全部清空)
  4. 从新的主节点复制数据

Redis主从复制解决了单节点的第【1】【2】问题,但是【3】【4】问题仍然无法解决,并且引入了新的问题:

主节点服务不可用,需要手工介入启用从节点升级为主节点,并且需要通知应用方修改主节点的地址,需要人工介入【5】

03

哨兵模式(redis sentinel)

为了解决第【5】个问题,Redis官方提供了哨兵sentinel模式,保证主从复制模式下从节点升级为主节点的过程全部自动化,sentinel有完善的不可达检测机制,主节点选举机制,以及主节点更换通知机制,从而实现了真正的高可用。

Redis sentinel有若干个sentinel节点和数据节点组成,sentinel节点定期会对所有节点的状态进行监控。当sentinel集群判断某个节点不可达时,会选择其中一个sentinel节点执行故障转移任务,并通知到调用的客户端。以一主两从三哨兵为例:

故障转移过程如下:

主节点故障,两个从节点与主节点失去连接,主从复制失败sentinel节点通过监控发现主节点的故障,多个sentinel达成一致以后,选择了其中一个sentinel节点作为leader sentinel

leader sentinel选择其中一个slave,发送slaveof no one命令给这个从节点,使其成为新的主节点。

sentinel通知应用端新的主节点信息sentinel发送命令给另外的slave,让其去复制新的master节点等旧的主节点恢复以后让其以slave的身份去复制新的master节点

注意事项

sentinel模式本质上还是主从模式,但是具备了故障的自动转移的功能。sentinel节点本身也会有单点的问题,至少两个节点才能解决单节点问题,但还是建议至少三个节点,多个节点可以有效防止误判。sentinel集群可以配置同时监控多个主节点,也即监控多个主从集群,每个集群只能有一个master,但是slave可以有多个。

04

集群模式(redis cluster)

以上分析我们知道,即便使用了哨兵模式,但是还是存在【3】【4】问题,本质上是原来的架构写扩展能力受限,当遇到大并发、大流量、内存不足等情况,就会出现瓶颈。典型的解决方案有:

客户端分区 由客户端对数据进行分区处理,部署多套集群,不同的数据依据不同的逻辑转发到不同的集群,需要客户端自行处理数据路由,需要维护多套redis,成本较高。使用代理搭建redis客户端代理,简化客户端的访问,数据路由等由代理实现。但是这引入了新的组件,部署架构更加复杂,并且还涉及代理本身的高可用问题。

为了解决以上的不足,官方终于提供了分布式集群方案,这就是Redis Cluster。如下图所示,Redis Cluster至少要求6个节点才能组成一个高可用的集群,6个节点是三主三从。这有两个方面的原因,一方面要求至少3个主节点,是为了避免网络分区的情况导致的脑裂问题,所以判断节点是否可听过服务需要至少过半数的节点的同意才行。另外一方面,每个节点至少需要有一个slave节点,当master故障时可以提升为主节点继续提供服务。

要理解Redis Cluster架构,我们需要理解其数据分布原理、节点通信原理、请求路由、扩缩容的方案。

数据分布原理

由于集群中有多个master节点,所以用户的数据需要依据某种规则被存放在某个节点下,当查询的时候也要知道数据从哪个节点去取,这就是数据分布方案要解决的问题。

Redis-Cluster使用了虚拟槽分区的方案来完成数据映射。首先,定义了一个整数集合,命名为槽slot,其范围为0~16383,然后使用哈希函数slot=CRC16(key)&16383将数据映射到某个槽上,再将槽分配给不同的节点,每个节点负责一定数量的槽,这样子达到了将数据分配到节点的目的。槽是redis cluster数据管理和迁移的基本单位。

节点通信原理

分布式系统一般都会涉及保存集群元数据信息的功能,对应到redis集群则是例如数据槽分配给哪个节点,节点的IP和端口等信息是多少等信息。一般来说有两种方案:集中式和P2P方式。集中式一般会选出一个leader节点或者master节点,由此节点来进行元数据管理,P2P方式则是通过数据交换,最终使得集群的所有节点都获得集群的元数据信息,节点间的地位是平等的。redis cluster选择的是P2P的方式。

每个redis节点都会单独开辟一个TCP端口用于节点的通信,采用Gossip协议进行交互,以ping消息为例流程如下:

1、每个节点开启用于集群内通信的TCP端口,用于集群通信。

2、每个节点配置几个种子节点,发送ping消息。

3、接收到ping消息的节点回复pong消息响应每个节点可能知道集群的全部节点信息,也可能只知道一部分,但是当进行一段时间的ping/pong消息交互以后,最终会达成每个节点都获得集群全部状态的效果。

Gossip协议定义了多种消息格式:ping、pong、meet、fail等,作用各不相同。

请求路由

上面说到所有的master节点都是平等的,客户端连接时是不知道请求的数据是应该落在哪个节点上的,那么应该如何进行请求的路由呢?

这里可能会有疑问,为何不适用代理的方式呢,可以完全与redis节点解耦合。我的理解是增加了一层代理以后引入了新的组件,架构会更加复杂,且性能会有损耗,所以官方选择直连redis节点的方案。

redis任意节点都可以接收客户端的请求,收到请求以后会根据哈希函数计算出数据对应的槽,而槽分配在哪个节点经过节点通信以后是节点本身是清楚的,于是,如果发现槽分配的是自己,则进行请求处理,如果发现是在其他节点,则返回MOVED重定向,表示数据在其他的节点,由客户端重定向后去请求其他的节点。

官方提供了redis-trib.rb工具用于进行redis cluster的部署,后续文章将会详解集群搭建以及扩缩容等详细内容,欢迎关注。

微信公众号中文同名:饭团技术,欢迎关注交流

redis 高可用切换_Redis高可用架构演进相关推荐

  1. springboot redis 断线重连_Redis高可用方案实现

    redis中为了实现高可用(High Availability,简称HA),采用了如下两个方式: 主从复制数据. 采用哨兵监控数据节点的运行情况,一旦主节点出现问题由从节点顶上继续进行服务. 主从复制 ...

  2. gin redis 链接不上_Redis 高并发问题,及解决方案!

    (一)redis技术的使用: redis真的是一个很好的技术,它可以很好的在一定程度上解决网站一瞬间的并发量,例如商品抢购秒杀等活动... redis之所以能解决高并发的原因是它可以直接访问内存,而以 ...

  3. Redis进阶-Redis集群 【高可用切换】【cluster-require-full-coverage】集群是否完整才能对外提供服务

    文章目录 Pre 需求 :集群不完整仍然需要对外提供服务 验证 Redis Cluster 架构 高可用切换 Code访问测试 继续停掉8006 ,验证集群是否down掉 Pre Redis进阶-Re ...

  4. redis高并发数据错乱_redis总结:1T以上海量数据+10万以上QPS高并发+99.99%高可用...

    来源:https://blog.csdn.net/qq_34246646/article/details/104402510 redis作用 topic:高并发.亿级流量.高性能.海量数据的场景,电商 ...

  5. redis集群方式及高可用架构

    Redis集群模式 1.主从模式,单台服务器即可,无高可用,为1主2从方式 主节点可读写,从节点只读,数据会从主节点同步至从节点 2.cluster模式 3.0以上版本支持 Redis Cluster ...

  6. python redis 哨兵_Redis高可用哨兵机制及SpringBoot整合哨兵

    前言:在前面讲到了Redis分片机制可实现内存数据的扩容来提高执行速率---Redis分片机制,可是Redis分片依旧有一些问题,如果redis分片的节点如果有一个服务器宕机,则直接影响用户的使用.R ...

  7. 【带你重拾Redis】Redis 哨兵集群实现高可用

    Redis 哨兵集群实现高可用 哨兵的介绍 sentinel,中文名是哨兵.哨兵是 Redis 集群架构中非常重要的一个组件,主要有以下功能: 集群监控:负责监控 Redis master 和 sla ...

  8. redis 系列25 哨兵Sentinel (高可用演示 下)

    原文:redis 系列25 哨兵Sentinel (高可用演示 下) 一. Sentinel 高可用环境准备 1.1 Sentinel 集群环境 环境 说明 操作系统版本 CentOS  7.4.17 ...

  9. 亿级商品详情页架构演进技术解密 | 高可用架构系列

    亿级商品详情页架构演进技术解密 | 高可用架构系列 --http://mp.weixin.qq.com/s?__biz=MzAwMDU1MTE1OQ==&mid=210272034&i ...

最新文章

  1. 这些代码改变了科学界:从Fortran、arXiv到AlexNet
  2. 汪劲:生命系统中的非平衡物理学
  3. linux系统下如何github,Linux系统下如何安装和使用GitHub
  4. Confluence 6 可以自定义的元素
  5. 每日一皮:好像有个Bug... 你看到了吗?
  6. 腾讯的模板引擎---artTemplate
  7. 这安全测试的面试题目也太简单了吧,分分钟入职成功
  8. Serverless 选型:深度解读 Serverless 架构及平台选择
  9. window.navigator.userAgent用来区分设备和浏览器
  10. 与reCAPTCHA的Spring集成
  11. linux 4.14.2编译,vmware中linux内核2.6.14.4编译全过程_linux教程
  12. 梳子刻字刻什么好_校园石阶上被人刻了1700多个字?!这次网友却说好
  13. Java基础学习总结(161)——Java 重试机制
  14. jupyter notebook 多行输出
  15. 使用Supervisor让你的Swift Perfect服务器项目后台运行
  16. 生成swc库文件若干方法
  17. PHP-dede学习:common.ini.php文件
  18. python如何可视化编辑gui_python gui,python可视化窗口编程
  19. 我为什么弃用OpenStack转向CNware
  20. CSS盒模型的2个误区

热门文章

  1. 阿里云技术白皮书_2019年云计算发展白皮书发布 阿里云保持优势成亚太最大云服务商...
  2. c++除法保留小数_Golang中除法和取模运算与Python3的区别
  3. 图片复印如何去除黑底_如何用AE制作可爱漂亮闪烁霓虹灯效果?只需简单几步任何人都可以...
  4. 关于前段与后端数据库的连接
  5. zookeeper集群启动的时候有一个别没有启动成功,出现Error contacting service. It is probably not running解决方法
  6. Madagascar的宏定义函数--取最值、取整
  7. 【HTML+CSS网页设计与布局 从入门到精通】第14章-float/position/display属性
  8. Python项目实践:BMI 身体质量指数
  9. https open api_通过bilibili_api获取弹幕+绘制词云的方法
  10. Flink的ConGroup算子介绍