简介
Redis Cluster提供了另一种运行Redis的形式,构建一个分布式Redis系统,提供数据分区和故障转移服务。
Redis以集群形式启动时,将会开启两个端口client_port和cluster_port(=client_port+10000),前者用于服务客户端请求(读、写、主从同步、键值迁移等),后者是用于与其他节点进行集群通信(故障检测、配置更新、故障转移授权等)。
注意:当使用Docker运行Redis时,需要使用主机网络(--network host),否则将无法与集群端口通信。
分区策略
Redis使用一种叫做散列槽(hash slot)的分区策略,对于给定的key计算其所属的散列槽(key => CRC16(key) % 16384),然后每个节点负责散列槽的子集。添加和删除节点只需要移动散列槽即可。
Redis使用Hash tag,来确保指定的key落在同一个散列槽,即this{foo}key与that{foo}key将保证位于相同的散列槽。如此,便可执行涉及多个键的操作。
主从模型
主从模型保证每个主节点都有多个奴隶,当主节点出现故障时集群会提升一个奴隶作为主节点以确保服务可以正常运行。
Redis使用异步复制来保证性能,所以无法保证强一致性。异步复制的过程:
- 客户端请求写入
- 主节点处理并回复确认
- 主节点向奴隶传播写入
使用
集群配置参数
- cluster-enabled <yes/no>:开启集群模式还是
standlone模式。 - cluster-config-file <filename>:集群的配置信息,由节点保存和修改,可以此进入集群。
- cluster-node-timeout <milliseconds>:用于节点的自我故障检测和故障转移。如果节点在指定时间内无法访问大部分主节点,将会停止对外服务。
- cluster-slave-validity-factor <factor>:如果设置为0,
奴隶在超时发生后立即进入故障转移。如果该值为正,奴隶在超时cluster-node-timeout * cluster-slave-validity-factor之后,将不进行故障转移。 - cluster-require-full-coverage <yes/no>:集群是否需要覆盖全部
key空间时,才能提供服务。 - cluster-migration-barrier <num>:配置该节点要求的奴隶数量,当该节点奴隶数量大于配置的值时,将允许分出奴隶给孤儿节点来执行奴隶迁移。
创建集群
redis-cli --cluster是一个集群管理工具,其中包含创建集群、添加删除节点、重新分区等等命令,可以使用 redis-cli --cluster help 查看命令参数。Redis集群最少需要3个主节点才能创建。
步骤:
- 使用集群模式启动空的
redis-server实例,此时会生成一个集群配置文件,其中存有一个Node ID用以唯一标记此节点在集群中的身份。 - 使用
redis-cli --cluster create来创建集群
添加删除节点
下面的所有命令都需要与集群中的任意一个工作节点 host:port 连接通讯。
# 1. 集群模式启动空实例
cd /data && redis-server ./redis.conf
# 2. 加入集群
## 添加为主节点,此时节点已经可以进行请求重定向,但是没有分配散列槽和数据,也不参加选举过程
redis-cli --cluster add-node new_host:new_port existing_host:existing_port
## 添加为奴隶,如果不指定主节点id,将会选取副本较少的主节点作为其主节点
redis-cli --cluster add-node new_host:new_port existing_host:existing_port \
--cluster-slave [--cluster-master-id <master_id>]
# 3. 删除节点,当删除主节点时必须保证主节点为空
redis-cli --cluster del-node host:port <node-id>
重新分区
重新分区意味着将散列槽从一组节点移动到另一组节点。
redis-cli --cluster reshard host:port \
--cluster-from <node-id> \
--cluster-to <node-id> \
--cluster-slots <number of slot> \
--cluster-yes
故障转移
Redis集群可以在主节点死亡后,自动挑选一个奴隶升级为主节点继续服务。
# 手动故障转移,将一个奴隶安全的提升了主节点
redis-cli -c -h <slave_ip> -p <slave_port>
> CLUSTER FAILOVER
奴隶迁移
集群中的奴隶可以迁移给孤儿主节点,这样就可以防止当孤儿主节点在死亡后,没有工作的奴隶进行故障转移,从而提高可用性。配置参数 cluster-migration-barrier 控制着迁移条件。
集群客户端
redis-cli -c利用节点的查询路由,支持非常基础的集群访问功能(将请求发送给指定的节点,由该节点保证将请求重定向到正确的节点)。一个好的集群客户端,可以实现客户端分区,缓存散列槽 => 节点ip映射,以直接访问正确的节点,并且可以在集群配置更改后刷新缓存。











网友评论