什么是分布式系统?
答:分布式和集群是不得不联系在一起的两个概念,如果多台服务器共同处理一件事情,叫集群;如果多台服务器各自处理不同的事情,彼此之间协调合作,共同完成整个系统的工作,就叫做分布式系统。
Redis-Cloud是集群,还是分布式缓存系统?
答:既是集群,也是分布式系统。这要看从哪个角度来看。
假如从存储数据是否相同来看,Redis-Cloud中每个结点存储的数据是不一样的,它共有16384个槽(0~16383),假如Redis-Cloud中有3个结点,那么这16384个槽是根据各个节点的性能分布在不同结点上的。第一个结点负责0~5000个槽,第二个结点负责5001~10000个槽,第三个结点负责10001~16383个槽,三个结点分别负责不同范围的数据存储,最终完整对整个数据范围的存储,很显然,这是一个分布式系统。
但如果从Redis-Cloud中所提供的缓存功能来看,每个结点都是用来做缓存的,各个节点提供的功能都是一样的,当内存不够用时,还可以不断横向添加结点来扩大内存容量,很显然,这是一个集群。
所以,我们会说,Redis集群是一个分布式集群系统。
(面试题)你知道哪些分布式缓存,如果要你设计一个分布式缓存,你会怎么去设计?
答:主要有Memcached和Redis。我使用Redis来做分布式缓存。
刚开始对Redis的操作都是单机版,虽然Redis的速度很快,但是在特别高的并发下,Redis也有性能瓶颈。Redis中的数据都放在内存里面,内存能有多大呢?64个G,已经很大了,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结点上就可以了。
在此我向大家推荐一个架构学习交流群。交流学习群号:575745314 里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多
槽如何进行分配呢?
要看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 会根据节点数量大致均等的将哈希槽映射到不同的节点