面试问Redis集群,被虐的不行了( 二 )


通讯设计
集群中的每个节点会在一定的时期给其它节点发送 ping 消息,其他节点返回 pong 作为响应 。
经过一段时间后所有节点都会知道集群全部节点的槽信息 。如下图有三个节点,那么就会把 16384 个哈希槽分成三份 。
分别为:

  • 0-5500
  • 5501-11000
  • 11001-16384

面试问Redis集群,被虐的不行了

文章插图
 
当用户发起了一个 key 的请求,集群是如何处理请求的呢?上图的黑框代表这集群所有节点的槽信息,里边还有很多其它信息 。
如图所示,用户发起请求 key,Redis 接收后计算 key 的槽位置,在根据槽位置找出对应的节点 。
如果访问的槽就在节点本身,那么就会直接返回 key 对应数据 。否则会回复 moved 重定向错误,并且给客户端返回正确的节点 。
然后重发 key 指令,如下图:
面试问Redis集群,被虐的不行了

文章插图
 
配置集群
①修改配置文件
如下图:
面试问Redis集群,被虐的不行了

文章插图
 
只需要注意圈中的配置信息即可:
  • cluster-enabled yes:开启集群模式 。
  • cluster-config-file nodes-6379.conf:集群配置文件 。
  • clustre-node-timeout 10000:节点超时时间,这里为了方便测试设置为 10s 。

面试问Redis集群,被虐的不行了

文章插图
 
②构建 6 个节点的配置文件并全启动
给大家提供一个命令可以很方便的替换文件:
sed 's/6379/6380/g' 6379-redis.conf > 6380-redis.conf 按照这样的方式创建出来 6 个不同端口的配置文件:
面试问Redis集群,被虐的不行了

文章插图
 
随便打开一个配置文件查看,检测是否替换成功:
面试问Redis集群,被虐的不行了

文章插图
 
为了查看日志信息方便,全部使用前台启动 。并且查看服务是否都正常启动,执行命令:
ps -ef | grep redis 可以看到启动后多了个 cluster 标识,代表着都是集群的一个节点 。
面试问Redis集群,被虐的不行了

文章插图
 
所有节点启动完成,集群启动的指令需要基于 Ruby(本人使用 Redis 版本为 4.0),接下来一起安装 。
③安装 Ruby
执行命令:
wget https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.1.tar.gz 解压(根据自己下载的版本来解压):
tar -xvzf ruby-2.7.1.tar.gz 安装:
./configure | make | make install 这三个指令一气呵成,查看 ruby 和 gem 版本:ruby -v 。
面试问Redis集群,被虐的不行了

文章插图
 
④启动集群
集群的执行命令在 /usr/local/redis/src/redis-trib.rb,注意如果需要直接使用 redis-trib.rb 命令,需要 ln 到 bin 目录下,否则就必须使用 ./redis-trib.rb 的方式 。
如果按照步骤走,这里会出现一个错误,如下图:
面试问Redis集群,被虐的不行了

文章插图
 
执行 gem install redis,很不幸的是在这里也会出现错误:
面试问Redis集群,被虐的不行了

文章插图
 
随后需要安装 yum install zlib-devel 和 yum install openssl-devel 。
安装完成后,在 /ruby-2.7.1/ext/openssl 和 /ruby-2.7.1/ext/zlib 分别执行 ruby extconf.rb,并且执行 make | make install 。
然后再执行 gem install redis 就 OK:
面试问Redis集群,被虐的不行了

文章插图
 
这时再回头来执行:
./redis-trib.rb create --replicas 1 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 
面试问Redis集群,被虐的不行了

文章插图
 
信息解读:创建集群,并且给 6 个节点分配哈希槽,后三个节点配置为前三个节点的从节点 。
面试问Redis集群,被虐的不行了

文章插图
 
显示每个节点的哈希槽信息和节点 ID,最后一步需要输入 yes:
面试问Redis集群,被虐的不行了


推荐阅读