Redis高可用方案对比:哨兵与集群架构解析
redis哨兵和集群区别是什么?
redis哨兵和集群的区别如下。
监控:Sentinel持续监控您的主从服务器是否正常运行。
通知:当受监控的Redis服务器出现问题时,Sentinel可以通过管理员API或其他应用程序提醒服务器发送通知。
即使集群使用Sentinel,每个Redis实例存储的是全量,每个Redis存储的内容都是完整的数据,浪费内存,并且有木桶效应。
为了最大限度地提高内存使用率,您可以使用集群,即分布式存储。
即每个Redis存储的内容不同,总共16384个slot。
每个redis都被分配了一些槽位。
hash_slot=crc16(key)mod16384找到对应slot的key为可用key。
如果有{},则取{}中的为可用键,否则整个键为可用键。
主从、哨兵、集群架构优缺点对比
优点:·架构简单,易于实现。
高性价比:使用缓存时无需备份节点(通过supervisor或crontab即可保证单实例可用性)。
当然,为了满足公司的高可用,也可以牺牲一个备份节点,但同时只有一个实例对外提供服务,这意味着高性能。
缺点:·无法保证数据的可靠性。
使用缓存并重新启动进程后,数据就会丢失。
即使有备份节点解决高可用,仍然无法解决缓存发热问题,因此不适合数据可靠性要求较高的企业。
高性能受限于单核CPU的处理能力(Redis是单线程机制),CPU是主要瓶颈,所以适合操作命令简单、操作简单的场景减少排序和计算。
您还可以考虑使用Memcached。
玩转Redis的高可用(主从、哨兵、集群)
所谓高可用性,也称为HA(HighAvailability),是分布式系统架构设计时必须考虑的因素之一。
是保证系统SLA的重要指标。
Redis高可用主要有三种模式:主从模式、看门狗模式和组模式。
Redis提供了复制功能,当一个redis数据库中的数据发生变化时,这个变化会自动同步到其他redis机器上。
当Redis部署在多台机器上时,这些机器节点会被分为两类,一类是主节点(masternode),一类是从节点(slavenode)。
一般来说,主节点既可以进行读操作,也可以进行写操作,而从节点只能进行读操作。
一个主节点可以有多个从节点,但一个从节点只能有一个主节点,即所谓的多从一主结构。
因此,在Master-Slave同步过程中,客户端仍然可以提交查询或者修改请求;
·Slave也以非阻塞的方式完成数据同步。
同步过程中,如果客户端提交查询请求,Redis会返回同步前的数据。
·Redis没有自动容错和恢复功能,手动更改前端IP即可恢复;
。
问题,降低系统可用性;
·Redis很难支持在线扩容,当集群容量达到上限时,在线扩容会变得非常复杂;
·Redis的主节点和从节点上的数据是相同的,降低了内存可用性
在当前的生产中,我们优先考虑哨兵模式。
在此模式下,如果主设备发生故障,看门狗将自动选择主设备并将其他从设备指向新的主设备。
在主从模式下,redis还提供了sentinel命令redis-sentinel。
作为一个进程,它将独立运行。
其原理是sentinel进程向所有redisbot发送命令并等待Redis服务器响应,从而监控多个正在运行的Redis实例。
一般情况下,监护人的数量为奇数,以方便决策和选择。
多个守护者组成一个守护者群,守护者之间会直接沟通,检查守护者是否正常工作,同时会发现主人和守护者做出选择新主人的决定。
哨兵模式的作用:
·通过发送命令,让Redis服务器返回监控其运行状态,包括主服务器和从服务器;
·但是,当哨兵进程监控Redis服务器时也会出现问题。因此,我们可以使用多个守卫来进行监控。
每个守卫也会受到监控,从而形成多种守卫模式。
·看门狗模式基于主从模式,看门狗模式具有主从模式的所有优点。
·主从自动切换,使系统更加健壮、可用。
·具有主从模式的缺点,每台机器上的数据相同,内存可用性较低。
·Redis难以支持在线扩容当集群容量达到上限时,在线扩容将变得非常复杂。
Redis集群模式本身并没有使用稳定的哈希算法,而是使用了槽。
在每个Redis节点上,都有两件事。
其取值范围为三个master中这16383个槽位的0-16383。
另外一个是cluster,可以理解为集群管理插件,类似于sentinel。
当我们的访问key到来时,Redis会根据crc16算法计算出一个结果,然后计算该结果与16384的余数,这样每个key对应一个数字在0-16383之间的哈希槽通过这个值找到对应槽位对应的节点,然后自动直接跳转到对应节点进行访问操作。
为了保证高可用性,redis-cluster引入了主从模式,一个主节点对应一个或多个从节点。
当其他主节点ping主节点master1时,如果超过半数的主节点与master1通信一定时间,则认为master1宕机,master1的从节点slave1将被激活,slave1将成为主节点继续。
提供服务。
redis-cluster采用了去中心化的思想。
客户端不需要直接连接Redis节点集群中的所有节点,可以连接集群中的任意节点。
redis集群扩容是向集群中添加机器,缩容是从集群中删除机器并将16383槽位重新分配给集群中的节点(数据迁移)。
扩容时,首先使用redis-tri.rbadd-node将新机器添加到集群中。
e.只有使用redis-tri.rbreshard重新分片(迁移数据)并将旧节点上的空间分配给新节点后,新节点才能生效。
缩容时,先使用redis-tri.rbreshard移除机器上的socket,然后使用redis-tri.rbadd-del移除机器。
采用去中心化的思想,数据按照时隙跨多个节点存储和分布,节点之间数据共享,数据分布可动态调整;
扩展:线性扩展至1000多个节点,可动态添加或删除节点;
高可用:当部分节点不可用时可用,该套件仍然可用。
通过添加一个Slave作为待处理数据的副本,可以通过gossip协议实现节点之间的自动状态故障转移,并利用投票机制完成从Slave到Master的角色晋升;
降低运维成本,提高系统可靠性和可用性。
1RedisCluster是一种没有中心节点的集群架构。
它依靠Goss(八卦传播)协议来协作自动修复群组状态。
但GosSIp存在消息延迟和消息冗余的问题,当集群节点较多时,节点之间必须持续进行PING/PANG通信,不必要的流量占用大量网络资源。
虽然Reds4.0对此进行了优化,但是这个问题仍然存在存在。
2数据迁移问题
RedisCluster可以动态扩容和缩容节点。
当扩容或缩容时,需要进行数据迁移。
为了保证迁移的一致性,所有的Redis迁移操作都是同步操作,两端的Redis会进入不同长度的死锁状态,但是如果Key内存占用太大,严重时会导致集群内部故障,造成不必要的切换。
主从模式:主节点关闭后,必须手动指定新的主节点。
可用性不高,基本不用。
Sentinel模式:master节点关闭后,sentinel进程会主动选举新的master,可用性高,但每个节点上存储的数据是相同的,浪费内存空间。
数据量不大,batchsize也不太大。
当需要自动容错和灾难恢复时使用。