如今互联网项目中大量使用了redis,本文著主要分析下redis 单点,master/slave,sentinel模式、cluster的一些特色。node
单节点实例仍是比较简单的,平时作个测试,写个小程序若是须要用到缓存的话仍是和方便的,现实生产环境中基本不会使用单节点模式。redis
2.1从模式特色:算法
主从模式的特色以及本身的一些理解。小程序
主从模式的缺点其实从上面的描述中能够得出:缓存
这个缺点影响是很大的,尤为是对生产环境来,因此有了下面的sentinel模式。服务器
sentinel的中文含义是哨兵、守卫。也就是说既然主从模式中,当master节点挂了之后,slave节点不能主动选举一个master节点出来,那么我就安排一个或多个sentinel来作这件事,当sentinel发现master节点挂了之后,sentinel就会从slave中从新选举一个master。负载均衡
对sentinel模式的理解:测试
1.ntinel模式是创建在主从模式的基础上,若是只有一个Redis节点,sentinel就没有任何意义;
2.当master节点挂了之后,sentinel会在slave中选择一个节点作为master,并修改它们的配置文件,其余slave的配置文件也会被修改,好比slaveof属性会指向新的master;
3.当master节点从新启动后,它将再也不是master而是作为slave接收新的master节点的同步数据
4.sentinel由于也是一个进程有挂掉的可能,因此sentinel也会启动多个造成一个sentinel集群
5.当主从模式配置密码时,sentinel也会同步将配置信息修改到配置文件中,不准要担忧。
6.一个sentinel或sentinel集群能够管理多个主从Redis。
7.sentinel最好不要和Redis部署在同一台机器,否则Redis的服务器挂了之后,sentinel也挂了
8.sentinel监控的Redis集群都会定义一个master名字,这个名字表明Redis集群的master Redis。优化
当使用sentinel模式的时候,客户端就不要直接链接Redis,而是链接sentinel的ip和port,由sentinel来提供具体的可提供服务的Redis实现,这样当master节点挂掉之后,sentinel就会感知并将新的master节点提供给客户端spa
sentinel模式基本能够知足通常生产的需求,具有高可用性。可是当数据量过大时,主从或者或sentinel模式就不能知足需求了,这个时候须要对存储的数据进行分片,将数据存储到多个Redis实例中,就是下面要讲的。
redis 3.0以后版本支持redis-cluster集群,Redis-Cluster采用无中心结构,每一个节点保存数据和整个集群状态,每一个节点都和其余全部节点链接。
cluster的出现是为了解决单机Redis容量有限的问题,将Redis的数据根据必定的规则分配到多台机器。
其结构特色:
一、全部的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽。
二、节点的fail是经过集群中超过半数的节点检测失效时才生效。
三、客户端与redis节点直连,不须要中间proxy层.客户端不须要链接集群全部节点,链接集群中任何一个可用节点便可。
四、redis-cluster把全部的物理节点映射到[0-16383]slot上(不必定是平均分配),cluster 负责维护node<->slot<->value。
五、Redis集群预分好16384个桶,当须要在 Redis 集群中放置一个 key-value 时,根据 CRC16(key) mod 16384的值,决定将一个key放到哪一个桶中。
这种模式适合数据量巨大的缓存要求,当数据量不是很大使用sentinel便可。
如今咱们是三个主节点分别是:A, B, C 三个节点,它们能够是一台机器上的三个端口,也能够是三台不一样的服务器。那么,采用哈希槽 (hash slot)的方式来分配16384个slot 的话,它们三个节点分别承担的slot 区间是:
节点A覆盖0-5460;
节点B覆盖5461-10922;
节点C覆盖10923-16383.
获取数据:
若是存入一个值,按照redis cluster哈希槽的算法: CRC16('key')384 = 6782。 那么就会把这个key 的存储分配到 B 上了。一样,当我链接(A,B,C)任何一个节点想获取'key'这个key时,也会这样的算法,而后内部跳转到B节点上获取数据
新增一个主节点:
新增一个节点D,redis cluster的这种作法是从各个节点的前面各拿取一部分slot到D上,我会在接下来的实践中实验。大体就会变成这样:
节点A覆盖1365-5460
节点B覆盖6827-10922
节点C覆盖12288-16383
节点D覆盖0-1364,5461-6826,10923-12287
一样删除一个节点也是相似,移动完成后就能够删除这个节点了。
二、Redis Cluster主从模式
redis cluster 为了保证数据的高可用性,加入了主从模式,一个主节点对应一个或多个从节点,主节点提供数据存取,从节点则是从主节点拉取数据备份,当这个主节点挂掉后,就会有这个从节点选取一个来充当主节点,从而保证集群不会挂掉。
上面那个例子里, 集群有ABC三个主节点, 若是这3个节点都没有加入从节点,若是B挂掉了,咱们就没法访问整个集群了。A和C的slot也没法访问。
因此咱们在集群创建的时候,必定要为每一个主节点都添加了从节点, 好比像这样, 集群包含主节点A、B、C, 以及从节点A一、B一、C1, 那么即便B挂掉系统也能够继续正确工做。
B1节点替代了B节点,因此Redis集群将会选择B1节点做为新的主节点,集群将会继续正确地提供服务。 当B从新开启后,它就会变成B1的从节点。
不过须要注意,若是节点B和B1同时挂了,Redis集群就没法继续正确地提供服务了。、
redis集群的搭建
集群中至少应该有奇数个节点,因此至少有三个节点,每一个节点至少有一个备份节点,因此下面使用6节点(主节点、备份节点由redis-cluster集群肯定)。