Redis
是一个 K-V
存储系统,是一个高性能的 K-V
数据库,是目前大规模使用的缓存中间件。单节点的Redis
已经就达到了很高的性能,为了提高可用性我们可以使用 Redis
集群。
集群简介
Redis
集群是一个可以在多个 Redis
节点之间进行数据共享的设施(installation
)。
Redis
集群不支持那些需要同时处理多个键的 Redis
命令, 因为执行这些命令需要在多个 Redis
节点之间移动数据, 并且在高负载的情况下, 这些命令将降低 Redis
集群的性能,并导致不可预测的行为。
Redis
集群通过分区(partition
)来提供一定程度的可用性(availability
):即使集群中有一部分节点失效或者无法进行通讯,集群也可以继续处理命令请求。
Redis
集群提供了以下两个好处:
将数据自动切分(
split
)到多个节点的能力当集群中的一部分节点失效或者无法进行通讯时,仍然可以继续处理命令请求的能力
集群说明
集群数据共享
Redis
集群使用数据分片(sharding
)而非一致性哈希(consistency hashing
)来实现:一个 Redis
集群包含 16384
个哈希槽(hash slot
),数据库中的每个键都属于这 16384
个哈希槽的其中一个,集群使用公式 CRC16(key) % 16384
来计算键 key
属于哪个槽,其中 CRC16(key)
语句用于计算键 key
的 CRC16
校验和。
集群中的每个节点负责处理一部分哈希槽
一个集群可以有三个哈希槽,其中:
节点
A
负责处理0
号至5500
号哈希槽节点
B
负责处理5501
号至11000
号哈希槽节点
C
负责处理11001
号至16384
号哈希槽
集群中的主从复制
为了使得集群在一部分节点下线或者无法与集群的大多数(majority
)节点进行通讯的情况下,仍然可以正常运作,Redis
集群对节点使用了主从复制功能:集群中的每个节点都有 1
个至 N
个复制品(replica
),其中一个复制品为主节点(master
),而其余的 N-1
个复制品为从节点(slave
)
集群 TCP
端口
每个 Redis Cluster
节点都需要 2
个 TCP
连接打开,正常的 Redis TCP
端口被服务于客户端,例如:6379
,加上通过增加 10000
到数据端口获取的端口,例如:16379
。
第二个高端口被用来 Redis Cluster Bus
,也就是使用二进制协议的一个节点到节点的通信信道。Redis Cluster Bus
被节点用于故障检测,配置更新,故障转移授权等等。客户端不应该尝试与 Redis Cluster Bus
端口进行通信,而是始终使用正常的 Redis
命令端口,然而要确保在防火墙中打开两个端口,否则 Redis Cluster
节点将无法通信。
命令端口和 Redis Cluster Bus
端口偏移是固定的,始终为 10000
。
注意,为了使 Redis Cluster
正常工作,你需要为每个节点:
用于客户端进行通信的普通客户端通信端口(通常使用
6379
)对所有需要到达集群的客户端,以及所有其它集群节点(使用客户端端口进行密钥迁移)都是开放的Redis Cluster Bus
端口(客户端端口+10000
)必须可从所有其它集群节点访问
如果不打开两个 TCP
端口,集群将无法按预期工作
Redis Cluster Bus
使用不同的二进制协议进行节占到节点的数据交换,这更适合于使用少量的带宽和处理时间交换节点之间的信息
安装依赖
$ sudo gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3$ sudo