Redis多机功能
从单台 Redis 服务器过渡至多台 Redis 服务器
到目前为止,本课程介绍的所有内容都是以单机 Redis 为背景的,也即是,我们考虑的事情只和一台Redis 服务器有关。但是在生产环境中实际地使用 Redis 的时候,只使用一台 Redis 服务器一般来说是没办法满足我们的需求的,限制主要来自于两个方面:
- 内存容量不足:Redis 使用内存来储存数据库中的数据,但是对于一台机器来说,硬件的内存容量是有限的,当我们需要储存的数据量超过机器的内存容量时,一台服务器就没办法满足我们的要求了。
例子:要储存 128 GB 数据,但机器最大只支持 64 GB 内存;要储存 1 TB 数据,但机器最大只支持 128 GB 内存;诸如此类。
- 处理能力不足:和内存数量限制类似,因为服务器硬件的限制(包括机器配置和网络资源等),一台服务器能够处理的命令请求数量也是有限的,当我们需要处理的命令请求数量超过机器能够处理的命令请求数量时,一台服务器就没办法满足我们的要求了。
例子:每秒钟要处理 20 万次请求,但机器每秒钟只能处理 10 万次请求;每秒钟要处理 100 万次请求,但机器每秒钟只能处理 30 万次或者 50 万次请求;诸如此类。
Redis 提供的多机功能包括:
- 复制(replication),扩展系统处理读请求的能力;
- Sentinel(哨兵),为系统提供高可用特性,减少故障停机出现;
- 集群(cluster),扩展系统的数据库容量以及系统处理读写请求的能力,并提供高可用特性;
复制
Redis 的复制(replication)功能允许用户根据一个 Redis 服务器来创建任意多个该服务器的复制品,其中被复制的服务器为主服务器(master),而通过复制创建出来的服务器复制品则为从服务器(slave)。主从服务器两者拥有相同的数据库数据:只要主从服务器之间的网络连接正常,主服务器就会一直将发生在自己身上的数据更新同步给从服务器,从而一直保证主从服务器的数据相同。
从服务器的创建与使用
使用 SLAVEOF 命令或者 slaveof 选项
Redis 提供了两种方法来为某个主服务器创建从服务器:
使用 SLAVEOF 命令,比如向一个服务器发送
SLAVEOF 127.0.0.1 6379 ,可以让接收到该命令的服务器变为 127.0.0.1:6379 的从服务器。在将一个服务器设置成从服务器之后,可以通过向它发送 SLAVEOF no one 来让它变回一个主服务器(数据库已有的数据会被保留)。
- 在启动服务器时,通过设置 slaveof 配置选项来让服务器成为指定服务器的从服务器。
处理服务器下线
主服务器或者从服务器都有可能会下线,但是不同服务器下线带来的影响并不相同:
- 如果下线的是从服务器,那么整个系统处理读请求的性能将有所下降,但整个系统仍然可以继续处理写请求和读请求,所以这种下线不会导致系统停机;
- 另一方面,因为在整个系统里面,只有主服务器一个能够处理写请求,所以如果下线的是主服务器,那么整个系统将只能处理读请求而无法处理写请求,导致系统停机。
主服务器下线导致主从服务器的连接中断,并使得整个系统无法再执行写命令。这时从服务器还是可以继续处理读请求的,但是从服务器的数据会因为主服务器下线而没办法再得到更新。为了让系统能够回到正常上线状态(也即是,让系统中的服务器既能够处理读请求,又能够处理写请求),用户需要向系统中的某一个从服务器发送 SLAVEOF no one 命令,让它变为新的主服务器,并向其他从服务器发送 SLAVEOF 命令,让它们去复制新的从服务器。虽然上面介绍的方法可以让系统重新上线,但手动来执行这些操作实在太麻烦了,为此,Redis 提供了 Sentinel 程序,用户可以使用Sentinel 来自动检测主从服务器的状态,并在主服务器下线时,自动执行故障转移操作(failover),让系统重新上线。
Sentinel
监视主从服务器,并在主服务器下线时自动进行故障转移
通过执行 Redis 安装文件夹中的 redis-sentinel 程序,可以启动一个 Sentinel 实例:
$ redis-sentinel sentinel.conf
因为 Redis 的 Sentinel 实际上就是一个运行在 Sentienl 模式下的 Redis 服务器,所以我们同样可以使用以下命令来启动一个 Sentinel 实例:
$ redis-server sentinel.conf --sentinel
Sentinel 的配置
指定要监视的主服务器,以及相关的监视参数
Sentinel 在启动时必须指定相应的配置文件: $ redis-sentinel sentinel.conf
一个 Sentinel 配置文件至少要包含一个监视配置选项,用于指定被监视主服务器的相关信息:
sentinel monitor <name> <ip> <port> <quorum>
其中 name 是用户为被监视主服务器设置的名字,而 ip 和 port 则是被监视主服务器的 IP 地址和端口号,quorum 为确认这个主服务器已下线所需要的最少 Sentinel 数量。