28 November 2015

Redis Cluster 把键空间分配给多个节点,并通过副本和故障转移提高可用性。本文以 Redis 3.0.5 的六进程学习环境说明配置关系,不把同机启动六个进程视为生产高可用部署。

分片依据是哈希槽

Cluster 使用 16384 个哈希槽,每个主节点负责其中一部分。客户端先确定槽,再把请求发送到对应节点;收到 MOVED 或 ASK 时按协议处理。多键操作并非全部不支持,而是通常要求相关键位于同一槽,hash tag 可以控制一组键的槽归属。

三个主节点、每个主节点一个副本是常见的学习拓扑。副本是否与主节点位于不同机器和故障域,直接影响容错能力,不能只数进程个数。

每个进程使用独立目录

以下是 7000 节点的配置示意,其他节点更换端口与数据目录:

port 7000
bind 127.0.0.1
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
dir /path/to/redis-cluster/7000

目录必须提前建立,节点间不能共享同一个可写 nodes.conf 或数据文件。这里绑定回环地址,只适合同机测试;跨机器部署要配置可达地址、必要端口及访问控制。

Cluster 还需要节点通信端口,3.0 环境通常为客户端端口加 10000。只放行客户端端口并不足以让节点完成通信。

创建与验证

Redis 3.0.5 使用发行包中的 redis-trib.rb 创建集群,并依赖相应 Ruby 环境。新的 Redis 版本提供 redis-cli --cluster,两种工具的命令不能直接混用。启动节点后,用对应版本工具分配槽与副本。

redis-cli -c -p 7000
CLUSTER INFO
CLUSTER NODES

检查槽是否完整分配、节点是否处于预期角色,再做写入和读取。在隔离环境停止一个主进程,观察选举与业务恢复,并测试恢复节点重新加入。客户端必须支持 Cluster 路由,不能把单节点连接代码当成完整集群支持。

异步复制意味着故障转移仍可能丢失最近的写入,可用性也受多数主节点连通性与槽覆盖状态影响。故障转移不代替备份,扩容也需要显式迁移槽和观察负载。

参考:Redis Cluster 规范。





blog comments powered by Disqus
Fork me on GitHub