集群
Redis 的分布式数据库实现
Redis 集群是一个由多个 Redis 服务器组成的分布式网络服务器群,集群中的各个服务器被称为节点(node),这些节点会相互连接并进行通信。
分布式的 Redis 集群没有中心节点,所以用户不必担心某个节点会成为整个集群的性能瓶颈。
Redis 集群的每个节点都有两种角色可选,一个是主节点(master node),另一个是从节点(slave node):其中主节点用于储存数据,而从节点则是某个主节点的复制品。
集群使用分片来扩展数据库的容量,并将命令请求的负载交给不同的节点来分担。
集群将整个数据库分为 16384 个槽(slot),所有键都属于这 16384 个槽的其中一个, 计算键 key属于哪个槽的公式为 slot_number = crc16(key) % 16384 ,其中 crc16 为 16 位的循环冗余校验和函数。
集群中的每个主节点都可以处理 0 个至 16384 个槽,当 16384 个槽都有某个节点在负责处理时,集群进入上线状态,并开始处理客户端发送的数据命令请求。
对于一个被指派了槽的主节点来说,这个主节点只会处理属于指派给自己的槽的命令请求。如果一个节点接收到了和自己处理的槽无关的命令请求,那么节点会向客户端返回一个转向错误(redirection error),告诉客户端,哪个节点才是负责处理这条命令的,之后客户端需要根据错误中包含的地址和端口号重新向正确的节点发送命令请求。
集群搭建
设置和建立一个集群的方法
搭建一个 Redis 集群需要执行以下步骤:
- 创建多个节点。
- 为每个节点指派槽,并将多个节点连接起来,组成一个集群。
- 当集群数据库的 16384 个槽都有节点在处理时,集群进入上线状态。
为了让 Redis 服务器以集群模式运行,我们需要在启动服务器时,打开服务器的集群模式选项:
cluster-enabled yes
另外,如果有多个节点运行在同一台机器里面,那么我们还需要为每个节点指定不同的端口号:
port 7000
我们可以将这两个配置值写入到 redis.conf 文件里面,然后执行以下命令来启动一个节点:
$ redis-server redis.conf
为了创建一个包含三个主节点和三个从节点的集群,我们需要执行以下命令:
$ ./redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
其中,create 方法表示我们要创建一个集群,而之后的 –replicas 1 则表示让 redis-trib.rb 为集群中的每个主节点设置一个从节点,再之后输入的是各个节点的 IP 地址和端口号。
访问集群
使用集群客户端向集群发送命令请求
twemproxy | 集群 |
---|---|
运作模式 | 代理模式,代理本身可能成为性能瓶颈,随着负载的增加需要添加更多 twemproxy来分担请求负载,但每个 twemproxy 本身也会消耗一定的资源。 |
分片 | 基本上是按照池中的服务器数量 N 来分片,每个服务器平均占整个数据库的 1/N。 |
复制和高可用 | 需要配合 Redis 的复制特性以及 Redis Sentinel 才能实现复制和高可用。 |
结论:如果需要完整的分片、复制和高可用特性,并且要避免使用代理带来的性能瓶颈和资源消耗,那么可以选择使用 Redis 集群;如果只需要一部分特性(比如只需要分片,但不需要复制和高可用, 诸如此类),那么可以单独选择 twemproxy 、Redis 复制和 Redis Sentinel 中的一个或多个。