三分钟快速搭建分布式高可用的Redis集群


三分钟快速搭建分布式高可用的Redis集群

文章插图
 
这里的redis集群指的是Redis Cluster,它是Redis在3.0版本正式推出的专用集群方案,有效地解决了Redis分布式方面的需求 。当单机内存、并发、流量等遇到瓶颈的时候,可以采用这种Redis Cluster方案进行解决 。
分区规则Redis Cluster采用虚拟槽(slot)进行数据分区,即使用分散度良好的哈希函数把所有键映射到一个固定范围的整数集合里,这里的整数就是槽(slot) 。Redis Cluster槽的范围是0~16383,计算公式:slot=CRC16(key) & 16383 。
白嫖小贴士:CRC16是一种高质量的哈希算法,可以使每个槽所映射的键通常比较均匀 。
当集群中有3个节点时,每个节点平均大概负责5461个槽以及槽所映射的键值数据 。这样一来,可以解耦数据与节点之间的关系,简化节点扩容和缩容的难度 。节点自身维护槽的映射关系,不需要客户端或代理服务维护分区信息 。
不过,Redis Cluster相对于单机还是存在一些限制的,比如:
  1. 批量操作键支持有限,仅支持具有相同槽的键进行批量操作 。
  2. 事务操作键支持有限,仅支持在同一个节点上多个键的事务操作 。
  3. 不支持多个数据空间 。单机Redis可以支持16个数据库,而Cluster模式下只能使用一个数据库空间 。
扯了这么多Redis Cluster的分区规则,下面我们开始步入正题 。
手动搭建把Redis Cluster搭建起来总共几步?答:三步!第一步把冰箱门打开 。第二步把大象关进去 。第三步把冰箱门带上 。不好意思,段子暴露年龄了 。集群搭建需要以下三个步骤:
  1. 准备节点 。
  2. 节点握手 。
  3. 分配槽 。
Redis Cluster由多个节点组成,节点数量至少有6个才能组成一个完整高可用的集群,其中有3个主节点和3个从节点,我们就以此为例搭建一个Redis Cluster 。
准备节点首先,为6个节点(同一台机器上的6380、6381、6382、6383、6384、6385端口)分别创建配置文件,以6380端口的节点为例:
# 节点端口port 6380#日志文件logfile "log/redis-6380.log"# 开启集群模式cluster-enabled yes# 集群配置文件cluster-config-file "data/nodes-6380.conf"保持文件名为redis-6380.conf,其他节点的配置文件替换成各自的端口 。准备好配置文件后启动所有节点,命令如下:
src/redis-server conf/redis-6380.conf &src/redis-server conf/redis-6381.conf &src/redis-server conf/redis-6382.conf &src/redis-server conf/redis-6383.conf &src/redis-server conf/redis-6384.conf &src/redis-server conf/redis-6385.conf &检测日志是否正确,以下是6380端口的节点的日志:
 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo # Redis version=4.0.14, bits=64, commit=00000000, modified=0, pid=3031, just started # Configuration loaded * No cluster configuration found, I'm df1ac987f47dea35f1d0a83c3b405f0ef86892ab * Running mode=cluster, port=6380.6380端口的节点启动成功,第一次启动时如果没有集群配置文件,Redis会自动创建一个 。6380端口的节点创建的集群配置文件如下:
df1ac987f47dea35f1d0a83c3b405f0ef86892ab :0@0 myself,master - 0 0 0 connectedvars currentEpoch 0 lastVoteEpoch 0集群文件中记录的集群的状态,这里最重要的是节点ID,它是一个40位的16进制字符串,用于唯一标识集群中的这个节点 。同样,也可以通过cluster nodes命令查看集群节点状态 。比如在6380端口的节点上执行命令:
127.0.0.1:6380> cluster nodesdf1ac987f47dea35f1d0a83c3b405f0ef86892ab :6380@16380 myself,master - 0 0 0 connected目前,我们已经成功启动了6个节点,但是它们只能识别自己的节点信息,互相之间并不认识 。下面我们通过节点握手让这6个节点互相之间建立联系从而组成一个集群 。
节点握手节点握手是一些运行在集群模式下的节点通过Gossip协议互相通信,达到感知彼此的过程 。
白嫖小贴士:Gossip协议是基于流行病传播方式的节点或者进程之间信息交换的协议,在分布式系统中被广泛使用 。
节点握手通过客户端执行cluster meet命令实现,它是一个异步命令,执行之后立刻返回,在Redis内部异步发起与目标节点的握手通信,该命令的语法如下:


推荐阅读