redis集群(redis多机功能篇)

Redis 的集群

在前面的课程中,我们陆续学习了 Redis 的复制特性,以及 Redis Sentinel 和 twemproxy 这两个程序,其中:

  • 复制特性可以创建指定服务器的复制品,这些复制品可以用于扩展系统处理读请求的能力。
  • Redis Sentinel 可以在复制特性的基础上,通过监视主从服务器并在主服务器故障时执行自动故 障转移来保证系统的可用性。
  • twemproxy 使用分片策略来将数据 库划分到多个不同的服务器,以此来扩展系统储存的数据量,并通过将命令请求分散给不同的服务器来处理,以此来扩展系统处理命令请求的能力。

以上这些特性或程序都是独立的,如果我 们需要一个完整地包含复制、高可用和分片特性的 Redis 服务器群,那么就需要用到 Redis 的集群(cluster)特性。

集群

Redis 的分布式数据库实现

分布式

Redis 集群是一个由多个 Redis 服务器组成的分布式网络服务器群,集群中的各个服 务器被称为节点(node),这些节点会相互连接并进行通信。

分布式的 Redis 集群没有中心节点,所以用户不必担心某个节点会成为整个集群的性能瓶颈。
在这里插入图片描述
集群中的三个节点互相连接。

复制

Redis 集群的每个节点都有两种角色可选,一个是主节点(master node),另一个是从节点(slave node):其中主节点用于储存数据,而从节点则是某个主节点的复制品。

当用户需要处理更多读请求的时候,添加从节点可以扩展系统的读性能。因为 Redis 集群重用了单机 Redis 复制特性的代码,所以集群的复制行为和我们之前介绍的单机复制特性的行为是完全一样的。
在这里插入图片描述
为三个主节点分别添加一个从节点。

节点故障检测和自动故障转移

Redis 集群的主节点内置了类似 Redis Sentinel 的节点故障检测和自动故障转移功能,当集群中的某个主节点下线时,集群中的其他在线主节点会注意到这一点,并对已下线的主节点进行故障转移。

集群进行故障转移的方法和 Redis Sentinel 进行故障转移的方法基本一样,不同的是,在集群里面,故障转移是由集群中其他在线的主节点负责进行的,所以集群不必另外使用 Redis Sentinel 。

当 7000 下线时,7001 和 7002 会察觉到这一点,并对 7000 进行故障转移。
在这里插入图片描述

分片

集群使用分片来扩展数据库的容量,并将命令请求的负载交给不同的节点来分担。

集群将整个数据库分为 16384 个槽(slot),所有键都属于这 16384 个槽的其中一个,计算键 key 属于哪个槽的公式为 slot_number = crc16(key) % 16384 ,其中 crc16 为 16 位的循环冗余校验和函数。

集群中的每个主节点都可以处理 0 个至 16384 个槽,当 16384 个槽都有某个节点在负责处理时,集群进入上线状态,并开始处理客户端发送的数据命令请求。

比如说,如果我们有三个主节点 7000 、 7001 和 7002 ,那么我们可以:

  • 将槽 0 至 5460 指派给节点 7000 负责处理;
  • 将槽 5461 至 10922 指派给节点 7001 负责处理;
  • 将槽 10923 至 16383 指派给节点 7002 负责处理;

这样就可以将 16384 个槽平均地指派给三个节点负责处理。

转向

对于一个被指派了槽的主 节点来说,这个主节点只会处理属于指派给自己的槽的命令请求。

如果一个节点接收到了和自己处理的槽无关的命令请求,那么节点会向客户端返回一个转向错误(redirection error),告诉客户端,哪个节点才是负责处理这条命令的,之后客户端需要根据错误中包含的地址和端口号重新向正确的 节点发送命令请求。
在这里插入图片描述

集群搭建

设置和建立一个集群的方法

集群搭建步骤

搭建一个 Redis 集群需要执行以下步骤:

  1. 创建多个节点。
  2. 为每个节点指派槽,并将多个节点连接起来,组成一个集群。
  3. 当集群数据库的 16384 个槽都有节点在处理时,集群进入上线状态。

接下来,就让我们来搭建一个包含六个节点的 Redis 集群,其中三个节点为主节点,而另外三个节点 为从节点,每个主节点都有一个从节点。

注意,在极端情况下,如果将 16384 个槽都指派给一个主节点,那么只有一个主节点也可以让集群进入上线状态,但是要让集群的故障转移特性生效,最起码要有三个主节点;而要让故障转移真正有意义,最少要为三个主节点分别设置一个从节点,这也是我们使用六个节点作为例子的原因。

创建节点

集群中的节点就是运行在集群模式下的 Redis 服务器,为了构建一个集群,我们需要一一创建集群中的每个节点。

为了让 Redis 服务器以集群模式运行,我 们需要在启动服务器时,打开服务器的集群模式选项:
cluster-enabled yes
另外,如果有多个节点运行在同一台机器里面,那么我 们还需要为每个节点指定不同的端口号:
port 7000
我们可以将这两个配置值写入到 redis.conf 文件里面,然后执行以下命令来启动一个节点:
$ redis-server redis.conf

节点运行示例

在这里插入图片描述

节点创建示例

为了在同一台机器上构建一个包含六个 节点的集群,其中三个主 节点分别运行在机器的 7000 、 7001 和 7002 端口,而三个从节点则分别运行在机器的 7003 、 7004 和 7005 端口,我们可以先创建一个 rediscluster 文件夹,然后分别创建 7000 至 7005 这六个文件夹,每个文件夹都包含一个 redis.conf 文件,它的内容为:
port
cluster-enabled yes
然后只要分别执行:
~/rediscluster/7000$ redis-server redis.conf

~/rediscluster/7005$ redis-server redis.conf

就可以创建出六个节点了(节点启动时默认为主节点,之后要将其中三个 节点转为从节点)。

创建集群

在创建出六个节点之后,我们需要让这六个节点互相连接以构成一个集群,然后为三个主节点指派槽,并为这三个主节点分别设置一个从节点。

创建集群的操作可以通过使用位于 Redis 安装文件夹内的 redis-trib.rb 程序来完成,这是一个使用 Ruby 编写的 Redis 集群管理程序,它具有创建集群、检查集群的上线情况和槽指派情况、对集群进行重新分片、向集群添加新节点或者从集群中移除节点等功能。

不带任何参数地执行 redis-trib.rb 可以看到它的各项用法:
在这里插入图片描述

redis-trib.rb 的 create 方法

为了创建一个包含三个主节点和三个从节点的集群,我们需要执行以下命令:
$ ./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 地址和端口号。

在输入该命令之后, redis-trib 会为各个节点指派槽以及角色,并 询问用户是否接受这种节点配置。

节点配置

redis-trib.rb 首先尝试连接给定的六个节点,检查它们是否存在。

在确定这些节点都是可连接之后,redistrib.rb 再将 7000 、 7001 和 7002 设 置为主节点,而 7003 、 7004 和 7005 则分别被设置为三个主节点的从节点。

对于三个主节点,redis-trib.rb 会分别为它们指派 5461 、 5462 和 5461 个槽(默认情况下使用平均分配)。

如果觉得这个配置没问题的话,就可以键 入 yes 并按下回车。
在这里插入图片描述

连接各个节点

在这里插入图片描述
在键入 yes 之后, redis-trib.rb 就会向各个节点发送指令,首先将它们连接为一个集群,然后再为它们指派槽和设置角色。

进行测试

在这里插入图片描述
之后, redis-trib.rb 会对集群进行测试,检查是否每个节点都按照原先展示的配置 设置好了。

如果整个集群数据库的 16384 个槽都有节点在处理,那么集群就会进入上线状态,之后用户就可以开始向集群发送命令请求了。

访问集群

使用集群客户端向集群发送命令请求

集群客户端

因为集群功能比起单机功能要复杂得多,所以不同语言的 Redis 客户端通常需要为集群添加特别的支持,或者专门开发一个集群客户端。

目前主要的 Redis 集群客户端(或者说,支持集群功能的 Redis 客户端)有以下这些:

  • redis-rb-cluster:antirez 使用 Ruby 编写的 Redis 集群客户端,集群客户端的官方实现。 - predis:Redis 的 PHP 客户端,支持集群功能。
  • jedis:Redis 的 JAVA 客户端,支持集群功能。
  • StackExchange.Redis:Redis 的 C# 客户端,支持集群功能。
  • 内置的 redis-cli :在启动时给定 -c 参数即可进入集群模式,支持部分集群功能。

为了让示例保持简单,我们这里使用集群模式的 redis-cli 来进行演示,需要更完整功能的 话,大家可以选择上面列举的其他客户端。

连接节点并执行命令
$ redis-cli -p 7000 -c
127.0.0.1:7000> SET date 2014-10-10 # 键 date 所在的槽位于节点 7000 ,节点直接执行命令
OK
127.0.0.1:7000> SET msg "hello world" # 键 msg 所在的槽位于节点 7001
-> Redirected to slot [6257] located at 127.0.0.1:7001 # 客户端从 7000 转向至 7001
OK
127.0.0.1:7001> SADD fruits “apple” “banana” “cherry” # 键 fruits 所在的槽位于节点 7002
-> Redirected to slot [14943] located at 127.0.0.1:7002 # 客户端从 7001 转向至 7002
(integer) 2
127.0.0.1:7002> # 转向是自动完成的,无需任何用户操作

复习

本节重点

Redis 集群是一个由多个节点组成的分布式服务器群,它具有复制、高可用和分片特性。

Redis 的集群没有中心节点,并且带有复制和故障转移特性,这可以避免单个节点成为性能瓶颈,或者因为某个节点下线而导致整个集群下线。

集群中的主节点负责处理槽(储存数据),而从节点则是主节点的复制品。

Redis 集群将整个数据库分为 16384 个槽,数据库中的每个键都属于 16384 个槽中的其中一个。

集群中的每个主节点都可以负责 0 个至 16384 个槽,当 16384 个槽都有节点在负责时,集群进入 上线状态,可以执行客户端发送的数据命令。

主节点只会执行和自己负责的槽有关的命令,当节点接收到不属于自己处理的槽的命令时,它会将处理指定槽的节点的地址返回给客户端,而客户端会向正确的节点重新发送命令,这个过程称为“转向”。

集群和 twemproxy 的区别

在这里插入图片描述
结论:如果需要完整的分片、复制和高可用特性,并且要避免使用代理 带来的性能瓶颈和资源消耗,那么可以选择使用 Redis 集群;如果只需要一部分特性(比如只需要分片,但不需要复制和高可用, 诸如此类),那么可以单独选择 twemproxy 、Redis 复制和 Redis Sentinel 中的一个或多个。

发布了252 篇原创文章 · 获赞 151 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_39885372/article/details/104289765
今日推荐