Windows平台Redis Cluster集群模式的坑

更多的master♂来守护你

Posted by MatthewHan on 2019-11-18

前言

在一台迷のWindows机器上搭建了一个单节点模拟的三主三从redis集群,过程中有一些坑记录下。

cluster模式

Redis的Cluster模式工作至少需要三个主节点,所以一般采用三主三从实现负载。

较理想的环境是一个实例单节点部署主从,多个实例实现集群。

集群架构

由于Redis Cluster采用哈希分区规则,哈希分区一般有以下几种方式:

  1. 节点取余分区
  2. 一致性哈希分区
  3. 虚拟槽分区

其中Redis Cluster就是采用虚拟槽分区,虚拟分区也是利用哈希空间,使用分散使用分散度良好的哈希函数把所有 数据映射到一个固定范围的整数集合中,整数定义为槽(slot)。这个范围一般远远大于节点数,比如Redis Cluster槽范围是0~16383。槽是集群内数据 管理和迁移的基本单位。采用大范围槽的主要目的是为了方便数据拆分和集群扩展。每个节点会负责一定数量的槽。

假设当前集群有5个节点,每个节点平均大约负责3276个槽。由于采用高质量的哈希算法,每个槽所映射的数据通常比较均匀,将数据平均划分到5个节点进行数据分区。

修改集群的配置文件

一般redis.windows.conf中有以下需要修改:

  1. port:端口号,三主三从的集群,由于是一台机器,需要6个进程模拟,所以端口号也需要6个,可以从7001~7006;
  2. cluster-enabledyes表示开启集群模式,存储方式aof,会将写操作记录到日志中。
  3. cluster-config-file:定义一个文件,节点配置的一些信息,节点握手🤝、连接时间戳这些都保存在一个配置文件中,由redis创建和更新。每个集群节点都需要不用饿集群配置文件。
  4. cluster-node-timeout:集群超时时间,单位毫秒,节点超过这个时间,依然无法建议通讯就可以判断是宕机了,如果可以的话需要启动从节点选举成主节点的机制。
  5. bind:绑定本机网卡的ip地址,这个比较重要,如果bind127.0.0.1的话,即使集群所在的ip可达,外部服务不在同一ip下的话,是无法建立连接的。所以一般可以使用ipconfig或者ifconfig查看网卡的情况,选择合适的可达ip进行绑定。

遇到的坑

  • 用redis-trib.rb搭建集群

redis-trib.rb是采用Ruby实现的Redis集群管理工具。内部通过Cluster相 关命令帮我们简化集群创建、检查、槽迁移和均衡等常见运维操作,使用之前需要安装Ruby依赖环境。但是网上的很多教程redis-trib.rb已经失效的,版本和Ruby环境不匹配。如果发现无法使用的话,请去GitHub的这个地址。Linux环境在安装完rubygem redis依赖之后可以执行以下命令来安装redis-trib.rb

1
sudo cp /{redis_home}/src/redis-trib.rb /usr/local/bin
  • 登陆到集群上之后执行set key value命令之后可能会提示“Redirected to solt [xxxx] located at ip:port”并且跳转到其他节点

因为分片的机制,这个提示的意思是该key根据哈希算法得到slot是xxxx,这个slot应该分配在xxxx的所属区间,而不是当前节点,或者当前登陆的是salve节点,所以可能就会跳转到对应的master节点上。

  • You should use redis-cli instead

如果出现这个提示,表明原本的命令失效了,可以使用redis-cli命令

1
./redis-cli --cluster create masterIp:masterPort ...
  • can’t connect to redis-server

首先先确认你的Redis集群服务开启了没,然后判断是否是密码的问题,最可能的还是配置文件bind填写的问题,假如没有部署在一个ip下的话,是否写成了bind 127.0.0.1