玩转Redis的高可用(主从、哨兵、集群)

该文章采用大量的图例,相信你可以从中学习到全新的知识,从而打开分布式一致性算法的大门,大伙们记得等我搞完Paxos与Zab。

所谓的高可用,也叫 HA(High Availability),是分布式系统架构设计中必须考虑的因素之一,它是保证系统SLA的重要指标。Redis 高可用的主要有三种模式: 主从模式 , 哨兵模式和集群模式 。

redis主从配置_redis主从配置查询redis主从配置_redis主从配置查询


redis主从配置_redis主从配置查询


Redis 提供了 Redis 提供了(replication)功能,当一台 redis 数据库中的数据发生了变化,这个变化会被自动地同步到其他的 redis 机器上去。

Redis 多机器部署时,这些机器会被分成两类,一类是主( ),一类是从(sle )。一般 主可以进行读、写作 ,而 从只能进行读作 。一个主可以有多个从,但是一个从只会有一个主,也就是所谓的 一主多从结构 。

· 支持主从,主机会自动将数据同步到从机,可以进行读写分离;

· Master 是以非阻塞的方式为主 Sles 提供服务。所以在 Master-Sle 同步期间,客户端仍然可以提交查询或修改请求;

· Sle 同样是以非阻塞的方式完成数据同步。在同步期间,如果有客户端提交查询请求,Redis 则返回同步之前的数据。

· Redis 不具备自动容错和恢复功能,主机从机的宕机都会导致前端部分读写请求失败,需要等待机器重启或者手动切换前端的 IP 才能恢复;

· 主机宕机,宕机前有部分数据未能及时同步到从机,切换 IP 后面还会引入数据不一致的问题,降低了系统的可用性;

· Redis 较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂;

· Redis 的主和从中的数据是一样的,降低的内存的可用性

实际生产中,我们优先考虑哨兵模式。这种模式下, 宕机,哨兵会自动选举 并将其他的 sle 指向新的 。

在主从模式下,redis 同时提供了哨兵命令 redis-sentinel ,哨兵是一个的进程,作为进程,它会运行。其原理是哨兵进程向所有的 redis 机器人发送命令,等待 Redis 响应,从而运行的多个 Redis 实例。一般为了便于决策选举,使用 奇数个哨兵 。多个哨兵构成一个哨兵集群,哨兵直接也会相互通信,检查哨兵是否正常运行,同时发现 战机哨兵之间会进行决策选举新的

哨兵模式的作用:

· 通过发送命令,让 Redis 返回其运行状态,包括主和从;

· 然而一个哨兵进程对 Redis 进行,也可能会出现问题,为此,我们可以使用多个哨兵进行。各个哨兵之间还会进行,这样就形成了多种哨兵模式。

哨兵很像 kafka 集群中的 zookeeper 的功能。

· 哨兵模式是基于主从模式的,所有主从的优点,哨兵模式都具有。

· 主从可以自动切换,系统更健壮,可用性更高。

· 具有主从模式的缺点,每台机器上的数据是一样的,内存的可用性较低。

· Redis 较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。

Redis 集群模式本身没有使用一致性 hash 算法,而是使用 slots 插槽 。

Redis 哨兵模式基本已经可以实现高可用,读写分离 ,但是在这种模式下每台 Redis 都存储相同的数据,很浪费内存,所以在 redis3.0 上加入了 Cluster 集群模式,实现了 Redis 的分布式存储,对数据进行分片,也就是说每台 Redis 上存储不同的内容;每个都会通过集群总线(cluster bus),与其他的进行通信。 通讯时使用特殊的端口号,即对外服务端口号加 10000。例如如果某个 node 的端口号是 6379,那么它与其它 nodes 通信的端口号是 16379。nodes 之间的通信采用特殊的二进制协议。

对客户端来说,整个 cluster 被看做是一个整体,客户端可以连接任意一个 node 进行作,就像作单一 Redis 实例一样, 当客户端作的时候 key 没有分配到该 node 上时,Redis 会返回转向指令,指向正确的 node,这有点儿像浏览器页面的 302 redirect 跳转。

当我们的存取的 Key 到达的时候,Redis 会根据 crc16 的算法对计算后得出一个结果,然后把结果和 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,通过这个值,去找到对应的插槽所对应的,然后直接自动跳转到这个对应的上进行存取作。

为了保证高可用, redis-cluster 集群引入了主从模式 ,一个主对应一个或者多个从。当其它主 ping 主 1 时,如果半数以上的主与 1 通信超时,那么认为 1 宕机了,就会启用 1 的从 sle 1,将 sle 1 变成主继续提供服务。

如果 1 和它的从 sle 1 都宕机了,整个集群就会进入 fail 状态,因为集群的 slot 映射不完整。 如果集群超过半数以上的 挂掉,无论是否有 sle,集群都会进入 fail 状态。

redis-cluster 采用去中心化的思想 ,没有中心的说法,客户端与 Redis 直连,不需要中间层,客户端不需要连接集群所有,连接集群中任何一个可用即可。

对 redis 集群的扩容就是向集群中添加机器,缩容就是从集群中删除机器,并重新将 16383 个 slots 分配到集群中的上(数据迁移)。

扩缩容也是使用集群管理工具 redis-tri.rb。

扩容时,先使用 redis-tri.rb add-node 将新的机器加到集群中,这是新机器虽然已经在集群中了,但是没有分配 slots,依然是不起做用的。在使用 redis-tri.rb reshard 进行分片重哈希(数据迁移),将旧上的 slots 分配到新上后,新才能起作用。

缩容时,先要使用 redis-tri.rb reshard 移除的机器上的 slots,然后使用 redis-tri.rb add-del 移除机器。

采用去中心化思想,数据按照 slot 存储分布在多个,间数据共享,可动态调整数据分布;

高可用性:部分不可用时,集群仍可用。通过增加 Sle 做 standby 数据副本,能够实现故障自动 failover,之间通过 gossip 协议交换状态信息,用投票机制完成 Sle 到 Master 的角色提升;

降低运维成本,提高系统的扩展性和可用性。

1.Redis Cluster 是无中心的集群架构,依靠 Goss 协议(谣言传播)协同自动化修复集群的状态。但 GosSIp 有消息延时和消息冗余的问题,在集群数量过多的时候,之间需要不断进行 PING/PANG 通讯,不必须要的流量占用了大量的网络资源。虽然 Reds4.0 对此进行了优化,但这个问题仍然存在。

2.数据迁移问题

Redis Cluster 可以进行的动态扩容缩容,这一过程,在目前实现中,还处于半自动状态,需要人工介入。在扩缩容的时候,需要进行数据迁移。

而 Redis 为了保证迁移的一致性,迁移所有作都是同步作 ,执行迁移时,两端的 Redis 均会进入时长不等的阻塞状态,对于小 Key,该时间可以忽略不计,但如果一旦 Key 的内存使用过大,的时候会接触发集群内的故障转移,造成不必要的切换。

主从模式: 挂掉后,需要手动指定新的 ,可用性不高,基本不用。

哨兵模式: 挂掉后,哨兵进程会主动选举新的 ,可用性高,但是每个存储的数据是一样的,浪费内存空间。数据量不是很多,集群规模不是很大,需要自动容错容灾的时候使用。

Redis-Cluster

Redis Cluster 的性能与单部署是同级别的。

多主、负载均3、安装redis-trib.rb:衡、读写分离

Redis Cluster 支持标准的 主从配置来保障高可用和高可靠。

failover 我们知道在一主一从的情况下,如果主从同时挂了,那整个集群就挂了。(故障转移)

Redis Cluster 也实现了一个类似 Raft 的共识方式,来保障整个集群的可用性。

水平、垂直方向都非常容易扩展。

数据分区,海量数据存储

部署 Redis Cluster 不需要其他的或者工具,而且 Redis Cluster 和单机 Redis 几乎完全兼

容。

角色: 、sle

Redis Cluster 由多个Redis组构成,是一个P2P(point to point)无中心的集群架构,依靠Gossip协议传播集群

Gossip协议是一个通信协议,一种传播消息的方式。

思想启发于:传播

这些收到信息的接下来会做同样的事情,即把这些信息传递给其他一些随机选择的。

信息会周期性的传递给N个目标。这个N被称为fanout(扇出)

gossip协议包含多种消息,包括meet、ping、pong、fail、publish等等

通过gossip协议,cluster可以提供 集群间状态同步更新 、 选举自助failover 等重要的集群功能。

分布式架构设计中,核心问题即为如何分片数据。在技术的更替中出现过以下分布式hash算法:

redis-cluster把所有的物理映射到[0-16383]个slot上,基本上采用平均分配和连续分配的方式。

slot槽必须在上连续分配,如果出现不连续的情况,则RedisCluster不能工作。

采用 raft 协议(参照Paxos算法 )

当sle 收到过半的 同意时,会成为新的。此时会以的Epoch 通过PONG 消息广播自己成为,让Cluster 的其他尽快的更新拓扑结构(node.conf)。

就是上面讲的从选举

人工故障切换是预期的作,而非发生了真正的故障,目的是以一种安全的方式(数据无丢失)将当前和其中一个sle(执行cluster-failover的)交换角色

2、从告知其主要进行手动切换(CLUSTERMSG_TYPE_MFSTART)

3、主会阻塞所有客户端命令的执行(10s)

4、从从主的ping包中获得主的偏移量

5、从达到偏移量,发起选举、统计选票、赢得选举、升级为主并更新配置

6、切换完成后,原主向所有客户端发送moved指令重定向到新的主

以上是在主在线情况下。

如果主下线了,则采用cluster failover force或cluster failover takeover 进行强制切换。

扩容

扩容数据必须为空

缩容

只能删除数据为空的

为了避免这种情况我们可以做一主多从,但这样成本就增加了。

Redis提供了一种方法叫副本漂移,这种方法既能提高集群的可靠性又不用增加太多的从机。

Master1宕机,则Sler11提升为新的Master1

集群从拥有最多的从机的组(Master3)中,选择名称字母顺序最小的从机(Sler31)漂移

到单点的主从组(Master1)。

具体流程如下(以上图为例):

1、将Sler31的从机记录从Master3中删除

2、将Sler31的的主机改为Master1

3、在Master1中添加Sler31为从

4、将Sler31的源改为Master1

5、通过ping包将信息同步到集群的其他

redis 如何判断是集群还是主从

cache)。用Redis缓存会话比其他存储(如Memcached)的优势在于:Redis提供持久化。当维护一个不是严格要求一致性的缓存时,如果用户的购物车信息全部丢失,大部分人都会不高兴的,现在,他们还会这样吗?

redis主从配置比较简单,基本就是在从配置文件加上:sleof 192.168.33.130 6379

主要是通过 server持久化的rdb文件实现的。 server 先dump出内存快照文件,然后将rdb文件传给sle server,sle s上一篇文章Redis主从原理中简要地说明了主从的一个基本原理,包含全量、积压缓冲区与增量等内容,有兴趣的同学可以先看下。erver 根据rdb文件重建内存表。

redis过程如下:

1、sle server启动连接到 server之后,salve server主动发送SYNC命令给 server

2、 server接受SYNC命令之后,判断,是否有正在进行内存快照的子进程,如果有,则等待其结束,否则,fork一个子进程,子进程把内存数据保存为文件,并发送给sle server

4、sle server 接收内存快照文件之后,清空内存数据,根据接收的快照文件,重建内存表数据结构

5、 server把快照文件发送完毕之后,发送缓存队列中保存的子进程快照期间改变的数据给sle server,sle server做相同处理,保存数据一致性

6、 server 后续接收的数据,都会通过步骤1建立的连接,把数据发送到sle server

Redis哨兵机制原理浅析

可扩展性:可线性扩展到 1000 多个,可动态添加或删除;

利用主从,可以实现读写分离、数据备份等功能。但如果主库宕机后,需要运维人员手动地将一个从库提升为新主库,并将其他从库sleof新主库,以此来实现故障恢复。

因此, 主从模式的一个缺点,就在于无法实现自动化地故障恢复 。Redis后来引入了哨兵机制,哨兵机制大大提升了系统的高可用性。

哨兵,就是站岗放哨的,时刻周围的一举一动,在时间发现敌情并发出及时的警报。

Redis中的哨兵(Sentinel), 则是一个特殊的Redis实例 ,不过它并不存储数据。也就是说,哨兵在启动时,不会去加载RDB文件。

关于Redis的持久化,可以参考我的另外一篇文章 谈谈Redis的持久化——AOF日志与RDB快照

上图就是一个典型的哨兵架构,由数据与哨兵构成,通常会部署多个哨兵。

哨兵主要具有三个作用, 、选主与通知 。

:哨兵会利用心跳机制,周期性不断地检测主库与从库的存活性

通知:哨兵会将新主库的地址通知到所有从库,使得所有从库与旧主库sleof新主库,也会将新主库的地址通知到客户端上

我会在下文详细讲一下与选主的过程

哨兵系统是通过3个定时任务,来完成对主库、从库与哨兵之间的探活。

首先我们会在配置文件中配置主库地址,这样哨兵在启动后,会以 每隔10秒 的频率向主库发送命令,从而获得当前的主从拓扑关系,这样就拿到了所有从库的地址。

接着 每隔2秒 ,会使用pub/sub(发布)机制,在主库上的 sentinel :hello的频道上发布消息,消息内容包括哨兵自己的ip、port、runid与主库的配置。

每个哨兵都会该频道,在该频道上发布与消费消息,从而实现哨兵之间的互相感知。

利用启动配置与命令可以获取到主从库地址,利用发布可以感知到其余的哨兵。

在此基础上,哨兵会 每隔1秒 向主库、从库与其他哨兵发送PING命令,因此来进行互相探活。

当某个哨兵在 down-after-milliseconds(默认是30秒) 配置的连续时间内,仍然没有收到主库的正确响应,则当前哨兵会认为主库 主观下线 ,并将其标记为sdown(subjective down)

为了避免当前哨兵对主库的误判,因此这个时候还需要参考其他哨兵的意见。

接着当前哨兵会向其他哨兵发送 sentinel is--down-by-addr 命令, 如果有半数以上(由quorum参数决定)的哨兵认为主库确实处于主观下线状态,则当前哨兵认为主库客观下线 ,标记为odown(objective down)

一旦某个主库被认定为客观下线时,这个时候需要进行哨兵选举,选举出一个哨兵,来完成主从切换的过程。

在每一轮选举中,每个哨兵一票。投票遵循先来先到的原则,如果某个哨兵没有投给别人,就会投给哨兵A。

这里的哨兵选举,采用的是Raft算法。这里不对Raft做详细的探讨,有兴趣的同学,可以参考我的另外一篇文章 22张图,带你入门分布式一致性算法Raft

过半投票机制也常用于很多算法中,例如RedLock,在半数以上的上加锁成功,才代表申请到了分布式锁,具体可参考这篇文章的 我用了上万字,走了一遍Redis实现分布式锁的坎坷之路,从单机到主从再到多实例,原来会发生这么多的问题

在Zookeeper选举中,同样也用到了过半投票机制,在这篇文章中 面试官:能给我画个Zookeeper选举的图吗? 我从源码角度分析了Zookeeper选举的过程。

在选举到哨兵后,将由该哨兵完成故障恢复工作。

故障恢复分为以下两步:

详细说一下步,挑选是有条件的。首先要过滤出不健康的,再按某种规则排序,取个从库,我们直接从源码入手:

因此,以下从库会被过滤出:

剩下的,就是健康的,此时再执行一次快速排序,排序的规则如下:

本文算是Redis哨兵的一个入门文章,主要讲了哨兵--replicas参数指定集群中每个主配备几个从,这里设置为1。的作用,例如、选主和通知。

在Redis读写分离的情况下,使用哨兵可以很轻松地做到故障恢复,提升了整体的可用性。

但哨兵无法解决Redis单机写的瓶颈,这就需要引入集群模式,相应的文章也被列为明年的写作中。

redis缓存原理

1、Redis是一种内存高速cache,如果使用redis缓存,那经常被访问的内容会被缓存在内存中,需要使用的时候直接从内存调取,不知道比硬盘调取快了多10少倍,需要注意:sle server如果因为网络或其他原因断与 server的连接,当sle server重新连接时,需要重新获取 server的内存快照文件,sle server的数据会自动全部清空,然后再重新建立内存表,这样会让sle server 启动恢复服务比较慢,同时也给 server并且支持复杂的数据结构,应用于许多高并发的场景中。

redis怎么做到高可用的 高并发

首先获集群模式:数据量比较大,QPS 要求较高的时候使用。 Redis Cluster 是 Redis 3.0 以后才正式推出,时间较晚,目前能证明在大规模生产环境下成功的案例还不是很多,需要时间检验。得半数以上投票的哨兵,将被选举称为Leader。

redis高可用:如果你做主从架构部署,其实就是加上哨兵就可以了,就可以实现,任何一个实例宕机,自动会进行主备切换。

redis高并发:主从架构,一主多从,一般来说,很多项目其实就足够了,单主用来写入数据,单机几万QPS,多从用来查询数据,多个从实例可以提供每秒10万的QPS。

redis高并发的同时,还需要容纳大量的数据:一主多从,每个实例都容纳了完整的数据,比如redis主就10G的内存量,其实你就最对只能容纳10g的数据量。如果你的缓存要容纳的数据量很大,达到了几十g,甚至几百g,或者是几t,那你就需要redis集群,而且用redis集群之后,可以提供可能每秒几十万的读写并发。

2、redis不能支撑高并发的瓶颈在哪里?

单机

3、如果redis要支撑超过10万+的并发,那应该怎么做?

读写分离,一般来说,对缓存,一般都是用来支撑读高并发的,写的请求是比较少的,可能写请求也就一秒钟几千,一两千

大量的请求都是读,一秒钟二十万次读

读写分离

主从架构 -> 读写分离 -> 支撑10万+读QPS的架构

详解Redis 主从及主从原理

redis是内存数据库,访问速度非常快,所以能够解决的也都是这些缓存类型的问题,如下:

Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。

概述

在现有企业中80%公司大部分使用的是redis单机服务,在实际的场景当中单一的redis容易面临风险。

2、容量瓶颈。 当我们有需求需要扩容 Redis 内存时,从 16G 的内存升到 64G,单机肯定是满足不了。当然,你可以重新买个 128G 的新机器。

解决办法

要实现分布式数据库的更大的存储容量和承受高并发访问量,我们会将原来集中式数据库的数据分别存储到其他多个网络上。

Redis 为了解决这个单一的问题,也会把数据多个副本部署到其他上进行,实现 Redis的高可用,实现对数据的冗余备份,从而保证数据和服务的高可用。

主从

什么是主从

主从,是指将一台Redis的数据,到其他的Redis。前者称为主(),后者称为从(sle),数据的是单向的,只能由主到从。

默认情况下,每台Redis都是主;且一个主可以有多个从(或没有从),但一个从只能有一个主。

主从的作用

1、数据冗余: 主从实现了数据的热备份,是持久化之外的一种数据冗余方式。

2、故障恢复: 当主出现问题时,可以由从提供服务,实现快速的故障恢复;实际上是一种服务的冗余。

3、负载均衡: 在主从的基础上,配合读写分离,可以由主提供写服务,由从提供读服务(即写Redis数据时应用连接主,读Redis数据时应用连接从),分担负载;尤其是在写少读多的场景下,通过多个从分担读负载,可以大大提高Redis的并发量。

4、读写分离: 可以用于实现读写分离,主库写、从库读,读写分离不仅可以提高的负载能力,同时可根据需求的变化,改变从库的数量。

主从启用

从开启主从,有3种方式:

1、配置文件: 在从的配置文件中加入 sleof

2、启动命令: redis-server启动命令后加入 --sleof

3、客户端命令: Redis启动后,直接通过客户端执行命令 sleof

,则该Redis实例成为从。

通过 replication 命令可以看到的一些信息。

主从原理

在从执行 sleof 命令后,过程便开始运作,下面图示可以看出过程大致分为6个过程。

主从配置之后的日志记录也可以看出这个流程。

1、保存主()信息

执行 sleof 后 Redis 会打印如下日志:

2、从与主建立网络连接

从(sle)内部通过每秒运行的定时任务维护相关逻辑,当定时任务发现存在新的主后,会尝试与该建立网络连接。

从会建立一个 socket 套接字,从建立了一个端口为51234的套接字,专门用于接受主发送的命令。从连接成功后打印如下日志:

如果从无法建立连接,定时任务会无限重试直到连接成功或者执行 sleofnoone 取消。

关于连接失败,可以在从执行 replication 查看 _link_down_since_seconds 指标,它会记录与主连接失败的系统时间。从连接主失败时也会每秒打印如下日志,方便发现问题:

3、发送 ping 命令

连接建立成功后从发送 ping 请求进行首次通信, ping 请求主要目的如下:

如果发送 ping 命令后,从没有收到主的 pong 回复或者超时,比如网络超时或者主正在阻塞无法响应命令,从会断开连接,下次定时任务会发起重连。

从发送的 ping 命令成功返回,Redis 打印如下日志,并继续后续流程:

4、权限验证

如果主设置了 requirepass 参数,则需要密码验证,从必须配置 auth 参数保证与主相同的密码才能通过验证。如果验证失败将终止,从重新发起流程。

5、同步数据集

主从连接正常通信后,对于首次建立的场景,主会把持有的数据全部发送给从,这部分作是耗时最长的步骤。

6、命是一种去中心化的集群架构令持续

当主把当前的数据同步给从后,便完成了的建立流程。接下来主会持续地把写命令发送给从,保证主从数据一致性。

作者:LoyaltyLu

链接:

redis是干嘛的

主从过程大体可以分为3个阶段:连接建立阶段(即准备阶段)、数据同步阶段、命令传播阶段。

redis叫做远程字典服务,是一个key-value存储系统。

和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set()和zset(有序)。这些数据类型都支持push/pop、add/remove及取交集并集和集及更丰富的作,而且这些作都是原子性的。

在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改作写入追加的记录文件,并且在此基础上实现了-sle(主从)同步。

redis的配置特性

se seconds updates,se配置,指出在多长时间内,有多少次更新作,就将数据同步到数据文件。这个可以多个条件配合,比如默认配置文件中的设置,就设置了三个条件。

appendonly yes/no,appendonly配置,指出是否在每次更新作后进行日志记录,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为redis本身同步数据文件是按上面的se条件来同步的,所以有的数据会在一段时间内只存在于内存中。

appendfsync no/always/rysec,appendfsync配置,no表示等作系统进行数据缓存同步到磁盘,always表示每次更新作后手动调用fsync()将数据写到磁盘,rysec表示每秒同步一次。

以上内容参redis主从考

redis集群主数据都是一致的吗为什么?

是的。

Redis集群是通过分片来实现横向扩展的,即将数据分散存储在不同的上,每个只负责一部分数据的读写作。因此,在集群中,每个都存储着不同的数据片段,主和从之间也会进行数据同步,以保证数据的一致性。

在Redis集群中,每个主都会有若干个从,从会对主进行,并且主和从都使用相同的数据持久化机制,从与主建立网络连接。如AOF或RDB。这些机制保证了主和从的数据是一致的。

同时,Redis集群还提供了一个内置的集群状态检查机制,可以确保集群中的所有5、高可用基石: 除了上述作用以外,主从还是哨兵和集群能够实施的基础,因此说主从是Redis高可用的基础。都处于正常状态。如果某个出现故障或下线,集群会自动将该的数据重新分配到其他上,以保证数据的一致性和可靠性。

因此,可以说Redis集群中的主数据是一致的,这是由于集群的和同步机制以及状态检查机制所保证的。

Redis Cluster集群的搭建

3、 server子进程进程做数据快照时,父进程可以继续接收client端请求写数据,此时,父进程把新写入的数据放到待发送缓存队列中

搭建集群工作需要以下三个步骤:

在 Redis 的每一个上,都有这么两个东西, 一个是插槽(slot),它的的取值范围是:0-16383, 可以从上面 redis-trib.rb 执行的结果看到这 16383 个 slot 在三个 上的分布。还有一个就是 cluster,可以理解为是一个集群管理的插件,类似的哨兵。

1)准备。

2)握手。

3)分配槽。

Redis集群一般由多个组成,数量至少为6个才能保证组成完整高可用的集群。每个需要开启配置cluster-enabled yes,让Redis运行在集群模式下。建议为集群内所有统一目录,一般划分三个目录:conf、data、log,分别存放配置、数据和日志相关文件。把6个配置统一放在conf目录下,集群相关配置如下:

其他配置和单机模式一致即可,配置文件命名规则redis-{port}.conf,准备好配置后启动所有。

Cluster集群启动过程如下图:

每个目前只能识别出自己的信息,可以执行cluster nodes命令获取集群状

态。

握手是指一批运行在集群模式下的通过Gossip协议彼此通信,达到感知对方的过程。握手是集群彼此通信的步,由客户端发起命令:cluster meet{ip}{port}

cluster meet命令是一个异步命令,执行之后立刻返回。内部发起与目标进行握手通信,握手通信过程:

1)6379本地创建6380信息对象,并发送meet消息。

2)6380接受到meet消息后,保存6379信息并回复pong消息。

3)之后6379和6380彼此定期通过ping/pong消息进行正常的通

信。

分别执行meet命令让其他加入到集群中,

执行cluster nodes命令确认6个都彼此感知并组成集群。

建立握手之后集群还不能正常工作,这时集群处于下线状态,所有的数据读写都被禁止,通过cluster 命令可以获取集群当前状态。

Redis集群把所有的数据映射到16384个槽中。每个key会映射为一个固定的槽,只有当分配了槽,才能响应和这些槽关联的键命令。通过cluster addslots命令为分配槽。这里利用bash特性批量设置槽(slots),命令如下:

执行cluster 查看集群状态,如下所示:

当前集群状态是OK,集群进入在线状态。所有的槽都已经分配给,执行cluster nodes命令可以看到和槽的分配关系:

集群模式下,Reids角色分为主和从。首次启动的和被分配槽的都是主,从负责主槽信息和相关的数据。使用cluster replicate{nodeId}命令让一个成为从。其中命令执行必须在对应的从上执行,nodeId是要主的ID,命令如下:

Redis集群模式下的主从使用了之前介绍的Redis流程,依然支持全量和部分。(replication)完成后,整个集群的结构如图:

redis-trib.rb是采用Ruby实现的Redis集群管理工具。内部通过Cluster相关命令帮我们简化集群创建、检查、槽迁移和均衡等常见运维作,使用之前需要安装Ruby依赖环境。

1、安装Ruby:

2、安装rubygem redis依赖:

4、安装完Ruby环境后,执行redis-trib.rb命令确认环境是否正确,输出如

首先我们跟之前内容一样准备好配置并启动:

启动好6个之后,使用redis-trib.rb create命令完成握手和槽分配过程,命令如下:

如果部署使用不同的IP地址,redis-trib.rb会尽可能保证主从不分配在同一机器下,因此会重新排序列表顺序。列表顺序用于确定主从角色,先主之后是从。创建过程中首先会给出主从角色分配的,当我们同意这份之后输入yes,redis-trib.rb开始执行握手和槽分配作。

集群完整性指所有的槽都分配到存活的主上,只要16384个槽中有一个没有分配给则表示集群不完整。可以使用redis-trib.rb check命令检测之前创建的集群是否成功,check命令只需要给出集群中任意一个地址就可以完成整个集群的检查工作,命令如下: