集群的理解
事实上非常多地方都有可能接触到集群的概念。为什么会有集群呢?简单的讲就是人多好办事,本来是一个人须要非常费劲才干完毕的事,如今分给十个人做,十个人都能够非常轻松的完毕,在海量数据,信息爆炸的今天,假设想要处理存储很多其它的数据,可是却没有强大到爆的大型计算机支持的话。集群是个不错的选择。
Redis中也支持集群,Redis中的集群是通过【分片】来进行数据共享的(事实上数据库中凡是涉及到集群的。一般都会有分片或者是分区这个概念伴随着出现)。
我们简要来说一下。学习Redis集群,须要学习什么东西,就像是大学上课时的课前概要。第一。既然是集群。那么肯定是要涉及到集群中的组成部分——【节点】,我们须要了解节点是什么?和普通的Redisserver有什么差别?第二。前面说过的分片,什么是分片?把什么给分了,分给谁,既然分了,那么取的时候怎么办?第三,集群是非常多台计算机server构成的,假设当中的一台宕掉了,怎么办?难道整个集群就瘫痪了吗?怎样预防和处理这样的集群中节点宕机的情况?这里就涉及到了复制和故障转移
须要说明的几个概念
节点
说集群肯定是要说节点的,节点构成的集群嘛,没有节点哪里有什么集群。非常清楚的就能够理解到什么是节点了,【节点就是在集群模式下执行的Redisserver】 。集群中的节点和普通的Redisserver相比,区别在哪里,事实上也不难猜測出。普通Redisserver仅仅是单机的server,老老实实的处理client发过来的命令,然后老老实实的返回处理结果。节点不同,除了这些之外,节点还是集群中的一部分。须要顾及到集群中用到的数据,比方,集群中其它节点的信息,和其它节点握手,推断其它节点是否下线,等等。
集群模式
集群模式事实上在节点中已经引出来,说的直白点,就是server执行一种状态,更直白点事实上就是一个配置文件里的一个标志位,redis.conf中有个配置项。【cluster-enabled yes】在启动Redisserver的时候。推断这个配置项的值是否是yes,假设是yes那么就开启server的集群模式。使server成为集群模式中的一个节点,【这里须要说明一下。成为集群模式中的一个节点,并不能成为一个集群。一个一个点,最后还是点,没法成为一个网的,须要连接。这里须要用到一个redis命令。cluster meet ip port,将两个节点连接起来。构成集群】
分片和槽
分片的概念事实上不难理解,能够想象一个芝麻烧饼。太大了。不优点理,将它切开,上面的芝麻就会被分布到不同的部分上,分片是一个动词,是分开烧饼的那个动作,【分片(sharding)是指将数据拆分,将其分散到不同的机器上的过程,有时也用分区这个概念】,以上的概念是在一本MongoDb的书中找的,认为在Redis这里也能适用。只是,有点不同,【须要注意,Redis分片事实上是将一个大烧饼分成了非常多小烧饼,然后往烧饼上撒芝麻。至于那个芝麻该到哪块小烧饼上去。这个是须要计算的,通过芝麻的特性】专业点就是,集群中的整个数据库看成一个大烧饼,被分成了16384块小烧饼【槽】,数据库中的键(也就是样例中的芝麻)都属于这些槽,至于这一块一块的小烧饼【槽】该归哪个小馋猫【节点】呢?我们能够通过命令分配【这里叫槽指派。cluster addslots slots】slots是从0到16383,但所有的槽所有分配给节点之后。这个集群数据库才算是真正上线。能够接受client发来的处理键的命令了。这里有一步。是各个节点传播各自的槽指派信息。也就是说哪个节点处理哪些槽,大家都是心知肚明的。
集群中命令是怎么被运行的
槽分好了,集群数据库上线了,那么怎么处理client发来的命令呢?这么多节点。发来的操作键的命令由哪个节点来做呢?
比方。我想节点A发送了一个[ set data “zhangsan” ]命令通过计算,data这个键是由368号槽来存,节点A就会查看自己是否管理368号槽,假设不归节点A管,那么归哪个节点管,然后在将这条命令Redirected给管理368号槽的节点。
[ get data]命令也是一样。先计算data键是哪个槽,然后把命令redirected到那个节点运行。
又一次分片
又一次分片就是改变槽的分派,把已经分派给某个节点的槽改为分派给还有一个节点。Redis集群的又一次分片操作由redis-trib管理软件负责运行。在又一次分片的过程中。不须要集群下线。而且源节点和目标节点能够继续处理命令请求。
详细实现原理,请查阅Redis帮助文档。
复制和故障转移
不可缺少的部分。也是最重要的部分
Redis集群中的节点分为主节点和从节点(这个是不是有点熟悉。Redis哨兵系统中也是主server和从server。这里能够參照Redis哨兵一起加深理解) 在正常的时候。主节点负责处理命令请求,从节点仅仅是复制主节点的内容,可是假设主节点进入下线状态,那么其它的正在执行的主节点会从下线了节点的从节点中选出一个作为新的主节点,(这个和哨兵是一样的)
那么怎么推断一个节点是否是下线呢?(哨兵是通过Sentinel系统监视每一个server。假设下线超过了设置的时长,就会採取故障转移操作),这里检測一个节点是否下线。是採取了节点间的互相检測,每一个节点会定期的向其它节点发送ping命令。假设在规定的时间内收了pong。那么就是正常在线,否则就会被发送ping命令的这个节点标为疑似下线,假设半数的节点将一个节点标为了疑似下线,那么就将这个疑似下线节点标为下线,採取故障转移操作。