Redis Cluster(Redis 集群)详解

一、基础概念及原理说明:
    1.1、Redis常见几种集群简介
        Redis组建集群共有三种方式,每种方法都有自己的有缺点,下面对每种方法进行概述:
            第一种:Redis主从模式,搭建该集群有点就是非常简单并且每个数据保存在多个Redis中,这样保障Redis中的数据安全,缺点是当集群中的主服务器(Master)宕机后从服务器(Slave)不会自动接管主服务器的工作,需要人工干预
            第二种:Redis哨兵模式,Redis哨兵主要采用单独开一个进程进行监控Redis集群运行状态,在Redis编译安装完成后,源文件可以看到一个sentinel.conf文件这个就是哨兵的配置文件,Redis哨兵也类似于Redis主从,在集群中选举一个主服务器(Master),所有写入的数据由主服务器接收,然后同步到集群中的从服务器(Slave)上,但是哨兵比Redis主从更加智能的,在哨兵集群中,当主服务器(Master)出现故障,集群会自动重新选举一台主服务器,这样不需要人工干预,系统运行更加稳定
            第三种:Redis cluster,这个是本文主要讲解的类型,无论是Redis主从或者Redis哨兵,他们都有一个共同的问题,就是所有请求都是由一台服务器进行响应,既:主服务器(Master),如果请求/并发量太大,这台服务器将会成为瓶颈。而Redis 3.0以后提供了一个Redis cluster模式,它使用哈希槽分片,将所有数据分布在不同的服务器上。

    1.2、Redis Cluster原理说明
        1.2.1、Redis集群基础说明
            在Redis 3.0版本以后,Redis发布了Redis Cluster。该集群主要支持搞并发和海量数据处理等优势,具体:①、自动分割数据到不同的节点上,②整个集群的部分节点失败或者不可达的情况下能够继续处理命令。具体解释如下:
            Redis没有使用一致性hash,而是引入哈希槽的概念。Redis集群由16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置那个槽,集群的每个节点负责一部分hash槽,也就是说数据存放在hash槽里,而每个节点只负责部分hash槽(这样数据就存放在不同的节点)。
            例如:A、B、C三个节点,
                A节点负责0到5500号hash槽,
                B节点负责5501到11000号hash槽,
                C节点负责11001到16384号hash槽
                这种结构很容易添加或者删除节点. 比如如果我想新添加个节点D, 我需要从节点 A, B, C中得部分槽到D上. 如果我想移除节点A,需要将A中的槽移到B和C节点上,然后将没有任何槽的A节点从集群中移除即可. 由于从一个节点将哈希槽移动到另一个节点并不会停止服务,所以无论添加删除或者改变某个节点的哈希槽的数量都不会造成集群不可用的状态

        1.2.2、Redis 集群的主从复制模型
            为了使在部分节点失败或者大部分节点无法通信的情况下集群仍然可用,所以集群使用了主从复制模型,每个节点都会有N-1个复制品.
            在我们例子中具有A,B,C三个节点的集群,在没有复制模型的情况下,如果节点B失败了,那么整个集群就会以为缺少5501-11000这个范围的槽而不可用.
            然而如果在集群创建的时候(或者过一段时间)我们为每个节点添加一个从节点A1,B1,C1,那么整个集群便有三个master节点和三个slave节点组成,这样在节点B失败后,集群便会选举B1为新的主节点继续服务,整个集群便不会因为槽找不到而不可用了
            不过当B和B1 都失败后,集群是不可用的.

        1.2.3、关于Redis数据一致性(异步写)
            Redis集群不能保证数据的强一致性。原因:
            ①、Redis集群采用异步写的方法,既:当客户端向Master写入一条数据后,Master给客户端返回一个执行结果,然后在操作Master和Slave之间的数据同步,这样当客户端完成写入并拿到Master返回的结果时(但Master还未来得及执行主从同步),Master出现宕机或网络不可达,就出现了数据不一致的情况。这也就是Redis的异步写。但是如果Redis集群采用同步写,那么整个集群的性能将大大下降(既:客户端写入数据后,Master先执行主从同步,然后在返回给客户端写入结果)
            ②、Redis集群出现网络脑裂,举个例子 假设集群包含 A 、 B 、 C 、 A1 、 B1 、 C1 六个节点,其中 A 、B 、C 为主节点, A1 、B1 、C1为A,B,C的从节点,还有一个客户端Z1假设集群中发生网络分区,那么集群可能会分为两方,大部分的一方包含节点A 、C 、A1 、B1和 C1,小部分的一方则包含节点B和客户端 Z1,Z1仍然能够向主节点B中写入, 如果网络分区发生时间较短,那么集群将会继续正常运作,如果分区的时间足够让大部分的一方将B1选举为新的master,那么Z1写入B中得数据便丢失了(注意:在网络分裂出现期间,客户端Z1可以向主节点B发送写命令的最大时间是有限制的,这一时间限制称为节点超时时间(node timeout),是Redis集群的一个重要的配置选项)

 

posted on 2018-11-13 15:19  米缸鼠  阅读(299)  评论(0)    收藏  举报

导航