Redis 集群

来源:互联网 发布:中国广电网络投诉电话 编辑:程序博客网 时间:2024/05/16 07:48

集群的理解

        其实很多地方都有可能接触到集群的概念。为什么会有集群呢?简单的讲就是人多好办事,本来是一个人需要很费劲才能完成的事,现在分给十个人做,十个人都可以很轻松的完成,在海量数据,信息爆炸的今天,如果想要处理存储更多的数据,但是却没有强大到爆的大型计算机支持的话,集群是个不错的选择。
        Redis中也支持集群,Redis中的集群是通过【分片】来进行数据共享的(其实数据库中凡是涉及到集群的,一般都会有分片或者是分区这个概念伴随着出现)。
        我们简要来说一下,学习Redis集群,需要学习什么东西,就像是大学上课时的课前概要。
        第一,既然是集群,那么肯定是要涉及到集群中的组成部分——【节点】,我们需要了解节点是什么?和普通的Redis服务器有什么区别?
        第二,前面说过的分片,什么是分片?把什么给分了,分给谁,既然分了,那么取的时候怎么办?
        第三,集群是很多台计算机服务器构成的,如果其中的一台宕掉了,怎么办?难道整个集群就瘫痪了吗?如何预防和处理这种集群中节点宕机的情况?这里就涉及到了复制和故障转移

需要说明的几个概念

节点

       说集群肯定是要说节点的,节点构成的集群嘛,没有节点哪里有什么集群,很清楚的就可以理解到什么是节点了,【节点就是在集群模式下运行的Redis服务器】 ,集群中的节点和普通的Redis服务器相比,差别在哪里,其实也不难推测出,普通Redis服务器只是单机的服务器,老老实实的处理客户端发过来的命令,然后老老实实的返回处理结果,节点不同,除了这些之外,节点还是集群中的一部分,需要顾及到集群中用到的数据,比如,集群中其他节点的信息,和其他节点握手,判断其他节点是否下线,等等。

集群模式

       集群模式其实在节点中已经引出来,说的直白点,就是服务器运行一种状态,更直白点其实就是一个配置文件中的一个标志位,redis.conf中有个配置项,【cluster-enabled yes】在启动Redis服务器的时候,判断这个配置项的值是否是yes,如果是yes那么就开启服务器的集群模式,使服务器成为集群模式中的一个节点,【这里需要说明一下,成为集群模式中的一个节点,并不能成为一个集群,一个一个点,最后还是点,没法成为一个网的,需要连接,这里需要用到一个redis命令,cluster meet ip port,将两个节点连接起来,构成集群】

分片和槽

       分片的概念其实不难理解,可以想象一个芝麻烧饼,太大了,不好处理,将它切开,上面的芝麻就会被分布到不同的部分上,分片是一个动词,是分开烧饼的那个动作,【分片(sharding)是指将数据拆分,将其分散到不同的机器上的过程,有时也用分区这个概念】,以上的概念是在一本MongoDb的书中找的,觉得在Redis这里也能适用,不过,有点不同,【需要注意,Redis分片其实是将一个大烧饼分成了很多小烧饼,然后往烧饼上撒芝麻,至于那个芝麻该到哪块小烧饼上去,这个是需要计算的,通过芝麻的特性】专业点就是,集群中的整个数据库看成一个大烧饼,被分成了16384块小烧饼【槽】,数据库中的键(也就是例子中的芝麻)都属于这些槽,至于这一块一块的小烧饼【槽】该归哪个小馋猫【节点】呢?我们可以通过命令分配【这里叫槽指派,cluster addslots slots】slots是从0到16383,但所有的槽全部分配给节点之后,这个集群数据库才算是真正上线,可以接受客户端发来的处理键的命令了。这里有一步,是各个节点传播各自的槽指派信息,也就是说哪个节点处理哪些槽,大家都是心知肚明的。

集群中命令是怎么被执行的

槽分好了,集群数据库上线了,那么怎么处理客户端发来的命令呢?这么多节点,发来的操作键的命令由哪个节点来做呢?
比如,我想节点A发送了一个[ set data “zhangsan” ]命令通过计算,data这个键是由368号槽来存,节点A就会查看自己是否管理368号槽,如果不归节点A管,那么归哪个节点管,然后在将这条命令Redirected给管理368号槽的节点。[ get data]命令也是一样,先计算data键是哪个槽,然后把命令redirected到那个节点执行。

重新分片

重新分片就是改变槽的分派,把已经分派给某个节点的槽改为分派给另一个节点,Redis集群的重新分片操作由redis-trib管理软件负责执行,在重新分片的过程中,不需要集群下线,并且源节点和目标节点可以继续处理命令请求。
具体实现原理,请查阅Redis帮助文档。

复制和故障转移

必不可少的部分,也是最重要的部分
Redis集群中的节点分为主节点和从节点(这个是不是有点熟悉,Redis哨兵系统中也是主服务器和从服务器,这里可以参照Redis哨兵一起加深理解) 在正常的时候,主节点负责处理命令请求,从节点只是复制主节点的内容,但是如果主节点进入下线状态,那么其他的正在运行的主节点会从下线了节点的从节点中选出一个作为新的主节点,(这个和哨兵是一样的)
那么怎么判断一个节点是否是下线呢?(哨兵是通过Sentinel系统监视每个服务器,如果下线超过了设置的时长,就会采取故障转移操作),这里检测一个节点是否下线,是采取了节点间的互相检测,每个节点会定期的向其他节点发送ping命令,如果在规定的时间内收了pong,那么就是正常在线,否则就会被发送ping命令的这个节点标为疑似下线,如果半数的节点将一个节点标为了疑似下线,那么就将这个疑似下线节点标为下线,采取故障转移操作。

2 0
原创粉丝点击