在一台迷の Windows 机器上搭建了一个单节点模拟的三主三从 redis 集群,过程中有一些坑记录下。
cluster 模式
Redis 的 Cluster 模式工作至少需要三个主节点,所以一般采用三主三从实现负载。
较理想的环境是一个实例单节点部署主从,多个实例实现集群。
由于 Redis Cluster 采用哈希分区规则,哈希分区一般有以下几种方式:
- 节点取余分区
- 一致性哈希分区
- 虚拟槽分区
其中 Redis Cluster 就是采用虚拟槽分区,虚拟分区也是利用哈希空间,使用分散使用分散度良好的哈希函数把所有 数据映射到一个固定范围的整数集合中,整数定义为槽(slot)。这个范围一般远远大于节点数,比如 Redis Cluster 槽范围是 0~16383。槽是集群内数据 管理和迁移的基本单位。采用大范围槽的主要目的是为了方便数据拆分和集群扩展。每个节点会负责一定数量的槽。
假设当前集群有 5 个节点,每个节点平均大约负责 3276 个槽。由于采用高质量的哈希算法,每个槽所映射的数据通常比较均匀,将数据平均划分到 5 个节点进行数据分区。
修改集群的配置文件
一般 redis.windows.conf 中有以下需要修改:
port
:端口号,三主三从的集群,由于是一台机器,需要 6 个进程模拟,所以端口号也需要 6 个,可以从 7001~7006;cluster-enabled
:yes
表示开启集群模式,存储方式aof
,会将写操作记录到日志中。cluster-config-file
:定义一个文件,节点配置的一些信息,节点握手 🤝、连接时间戳这些都保存在一个配置文件中,由 redis 创建和更新。每个集群节点都需要不用饿集群配置文件。cluster-node-timeout
:集群超时时间,单位毫秒,节点超过这个时间,依然无法建议通讯就可以判断是宕机了,如果可以的话需要启动从节点选举成主节点的机制。bind
:绑定本机网卡的 ip 地址,这个比较重要,如果bind
127.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
。
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 命令
./redis-cli --cluster create masterIp:masterPort ...
- can't connect to redis-server
首先先确认你的 Redis 集群服务开启了没,然后判断是否是密码的问题,最可能的还是配置文件 bind
填写的问题,假如没有部署在一个 ip 下的话,是否写成了 bind 127.0.0.1
。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于