【重要】redis分布式缓存知识点总结

自总结知识点:

一、什么是分布式系统?与集群系统的区别

答:分布式和集群是不得不联系在一起的两个概念,如果多台服务器共同处理一件事情,叫集群;如果多台服务器各自处理不同的事情,彼此之间协调合作,共同完成整个系统的工作,就叫做分布式系统。

 

二、Redis-Cloud是集群,还是分布式缓存系统?

答:既是集群,也是分布式系统。这要看从哪个角度来看。

      假如从存储数据是否相同来看,Redis-Cloud中每个结点存储的数据是不一样的,它共有16384个槽(0~16383),假如Redis-Cloud中有3个结点,那么这16384个槽是根据各个节点的性能分布在不同结点上的。第一个结点负责0~5000个槽,第二个结点负责5001~10000个槽,第三个结点负责10001~16383个槽,三个结点分别负责不同范围的数据存储,最终完整对整个数据范围的存储,很显然,这是一个分布式系统。

       但如果从Redis-Cloud中所提供的缓存功能来看,每个结点都是用来做缓存的,各个节点提供的功能都是一样的,当内存不够用时,还可以不断横向添加结点来扩大内存容量,很显然,这是一个集群。

        所以,我们会说,Redis集群是一个分布式集群系统。

 

三、Redis-Cloud分布式缓存如何维持数据的完整性?

答:Redis-Cloud分布式缓存原理:

 ①集群中有那么多个结点,结点中保存的数据不一样,所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽,客户端想要连接集群,只需要连接到集群中的任意一个节点即可,客户端与节点直连,不需要中间proxy

 ②每一个节点都有一个备份机猜测:1每个节点最少一个备份,可有多个?2主节点不能作为其他节点的备份节点,如果这个结点挂了,必须要有备份结点顶上来,来保证集群可以继续提供服务。

③集群中最少有几个结点呢?3个!3个结点就可以搭建起一个Redis集群,在实际开发中,因为还要保证每个结点都有一个备份机,所以,最小的集群会搭建6个结点

 

四、Redis-Cloud高可用性原理?故障转移机制

答:

①判断节点故障的机制

Redis集群中有一个投票:容错机制,我们前面说集群中一般都会有一个集群管理工具,但在Redis集群中并没有,那么,我们怎么才能知道集群中哪一个结点挂了呢?Redis集群中有一个投票机制。大家都知道,在选举的时候,是少数服从多数的原则,要判断Redis集群中的某个结点是否挂掉了,需要我们集群中超过半数的节点进行投票,半数以上的节点认为它挂了,它就挂了。假如集群中有5个结点,有三个认为某个结点已经挂了,那么集群就认为这个结点真挂了。这个时候就要看有没有备份结点,如果没有备份结点顶上来,那么集群就会宕机。如果有备份结点,备份结点顶上来,继续维持整个集群的工作,然后管理人员就需要赶快把那个挂掉的节点修理好。

领着选举过程是集群中所有master参与,如果半数以上master节点与故障节点通信超过(cluster-node-timeout),认为该节点故障,自动触发故障转移操作.

②确定节点故障后的处理

如果有备份节点,则故障转移机制启动,备份节点顶上,且等待报警等待管理人员修理;

如果没有备份节点,则宕机。

什么时候整个集群不可用(cluster_state:fail)? 

    a:如果集群任意master挂掉,且当前master没有slave.集群进入fail状态,也可以理解成集群的slot映射[0-16383]不完成时进入fail状态. ps : redis-3.0.0.rc1加入cluster-require-full-coverage参数,默认关闭,打开集群兼容部分失败.

    b:如果集群超过半数以上master挂掉,无论是否有slave集群进入fail状态.

 

===================================================================

参考文章一:

什么是分布式系统?

答:分布式和集群是不得不联系在一起的两个概念,如果多台服务器共同处理一件事情,叫集群;如果多台服务器各自处理不同的事情,彼此之间协调合作,共同完成整个系统的工作,就叫做分布式系统。

 

Redis-Cloud是集群,还是分布式缓存系统?

答:既是集群,也是分布式系统。这要看从哪个角度来看。

      假如从存储数据是否相同来看,Redis-Cloud中每个结点存储的数据是不一样的,它共有16384个槽(0~16383),假如Redis-Cloud中有3个结点,那么这16384个槽是根据各个节点的性能分布在不同结点上的。第一个结点负责0~5000个槽,第二个结点负责5001~10000个槽,第三个结点负责10001~16383个槽,三个结点分别负责不同范围的数据存储,最终完整对整个数据范围的存储,很显然,这是一个分布式系统。

       但如果从Redis-Cloud中所提供的缓存功能来看,每个结点都是用来做缓存的,各个节点提供的功能都是一样的,当内存不够用时,还可以不断横向添加结点来扩大内存容量,很显然,这是一个集群。

        所以,我们会说,Redis集群是一个分布式集群系统。

   

(面试题)你知道哪些分布式缓存,如果要你设计一个分布式缓存,你会怎么去设计?

答:主要有MemcachedRedis。我使用Redis来做分布式缓存。

刚开始对Redis的操作都是单机版,虽然Redis的速度很快,但是在特别高的并发下,Redis也有性能瓶颈。Redis中的数据都放在内存里面,内存能有多大呢?64G,已经很大了,64G都放满了呢?还能放吗?可以,内存放满了会放在硬盘中的虚拟内存中,一旦用到虚拟内存了,性能就很低了,所以我们尽可能的不要超出内存的容量。如果存不下了,但是数据还是很多,还需要往缓存中放,那怎么办呢?通过搭Redis集群来扩展内存空间。官方给出的Redis集群名称为Redis-Cluster

Redis-Cluster架构图如下:

 

集群一般都会有一个入口,有一个集群管理工具,但Redis集群没有入口,即没有代理层,集群中的节点都是相互连接的,通过PING-PONG机制来实现各个节点之间的通信,以及判断各个节点的状态,客户端想要连接集群,只需要连接到集群中的任意一个节点即可。

集群中有那么多个结点,结点中保存的数据一样吗?不一样。如果是一样的,那叫主备。既然是集群,就应该是可以扩容的,如果存储空间不足了,可以加结点,加一个服务器进行,存储空间就会变大。所有结点的内存容量加起来才是整个集群内存的总容量,如果每个结点存储的数据都一样,那总容量就只是一个Redis的内存容量了。

Redis集群中,每个结点保存的数据是不一样的。如果不一样,那么当一个结点挂了,那整个集群就不完整了,不完整了就不能用了,所以,要想保证Redis集群的高可用(长时间可使用,而不会宕机),每一个节点都需要加一个备份机,如果这个结点挂了,必须要有备份结点顶上来,来保证集群可以继续提供服务。

Redis集群中有一个投票:容错机制,我们前面说集群中一般都会有一个集群管理工具,但在Redis集群中并没有,那么,我们怎么才能知道集群中哪一个结点挂了呢?Redis集群中有一个投票机制。大家都知道,在选举的时候,是少数服从多数的原则,要判断Redis集群中的某个结点是否挂掉了,需要我们集群中超过半数的节点进行投票,半数以上的节点认为它挂了,它就挂了。假如集群中有5个结点,有三个认为某个结点已经挂了,那么集群就认为这个结点真挂了。这个时候就要看有没有备份结点,如果没有备份结点顶上来,那么集群就会宕机。如果有备份结点,备份结点顶上来,继续维持整个集群的工作,然后管理人员就需要赶快把那个挂掉的节点修理好。那么,集群中最少有几个结点呢?3个!3个结点就可以搭建起一个Redis集群,在实际开发中,因为还要保证每个结点都有一个备份机,所以,最小的集群会搭建6个结点

只需要连接上Redis集群中的任意一个结点,就能连接上整个集群。

Redis集群中,每个结点保存的数据是不一样的,那就会有一个问题,如何把数据分散到不同的节点进行存储呢?为解决这个问题,Redis集群中引入了一个概念,叫slot(槽,哈希槽)。Redis集群中一共有16384个槽(0~16383),这是固定的。这些槽有什么作用呢?

当要在Redis集群中放置一个key-value对时,先要对key使用crc16算法得出一个数,然后再用这个数对16384求余数,肯定会得到一个0~16383之间的数,这样每一个key值都会对应一个0~16383之间的哈希槽,然后将key-value键值对放在这个槽对应的Redis结点上就可以了。

槽如何进行分配呢?

要看Redis集群中有几个结点,还要看每个结点的性能怎么样。假如有3个结点,每个结点的性能都是完全一样的,那么我们就可以把这16384个槽平均分到3个结点上。

0~5000个槽分到第一个结点上

5001~10000个槽分到第二个结点上

10001~16383个槽分到第三个结点上(为了好计算,这样划分)

有个问题,Redis集群中最少有几个结点?Redis集群中最多有多少个结点?

答:最少有3个,最多有16384个结点。这里不考虑备份机的问题。

架构细节:

(1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.

(2)节点的fail是通过集群中超过半数的节点检测失效时才生效.

(3)客户端与redis节点直连,不需要中间proxy.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可

(4)redis-cluster把所有的物理节点映射到[0-16383]slot,cluster 负责维护node<->slot<->value

Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value 时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点


 

==========================================================================

参考文章二:

:关于redis cluster

1:redis cluster的现状

reids-cluster计划在redis3.0中推出,可以看作者antirez的声明:http://antirez.com/news/49 (ps:跳票了好久,今年貌似加快速度了),目前的最新版本见:https://raw.githubusercontent.com/antirez/redis/3.0/00-RELEASENOTES

作者的目标:Redis Cluster will support up to ~1000 nodes. ...

目前redis支持的cluster特性(已测试):

1):节点自动发现

2):slave->master 选举,集群容错

3):Hot resharding:在线分片

4):集群管理:cluster xxx

5):基于配置(nodes-port.conf)的集群管理

6):ASK 转向/MOVED 转向机制.

2:redis cluster 架构

1)redis-cluster架构图

 

架构细节:

(1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.

(2)节点的fail是通过集群中超过半数的master节点检测失效时才生效.

(3)客户端与redis节点直连,不需要中间proxy.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可

(4)redis-cluster把所有的物理节点映射到[0-16383]slot,cluster 负责维护node<->slot<->key

2) redis-cluster选举:容错

 

(1)领着选举过程是集群中所有master参与,如果半数以上master节点与故障节点通信超过(cluster-node-timeout),认为该节点故障,自动触发故障转移操作.

(2):什么时候整个集群不可用(cluster_state:fail)? 

    a:如果集群任意master挂掉,且当前master没有slave.集群进入fail状态,也可以理解成集群的slot映射[0-16383]不完成时进入fail状态. ps : redis-3.0.0.rc1加入cluster-require-full-coverage参数,默认关闭,打开集群兼容部分失败.

    b:如果集群超过半数以上master挂掉,无论是否有slave集群进入fail状态.

  ps:当集群不可用时,所有对集群的操作做都不可用,收到((error) CLUSTERDOWN The cluster is down)错误

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章