Redis部署模式
1.Redis主从复制
Redis 的复制(replication)功能允许用户根据一个 Redis 服务器来创建任意多个该服务器的复制品,其中被复制的服务器为主服务器(master),而通过复制创建出来的服务器复制品则为从服务器(slave)。 主从服务器两者拥有相同的数据库数据:只要主从服务器之间的网络连接正常,主服务器就会一直将 发生在自己身上的数据更新同步给从服务器,从而一直保证主从服务器的数据相同。
可以使用两种方式来实现
方法1. 使用 SLAVEOF <master-ip> <master-port> 命令,比如向一个服务器发送 SLAVEOF 127.0.0.1 6379 ,可以让接收到该命令的服务器变为 127.0.0.1:6379 的从服务器。 在将一个服务器设置成从服务器之后,可以通过向它发送 SLAVEOF no one 来让它变回一个主 服务器(数据库已有的数据会被保留)。
方法2. 在启动服务器时,通过设置 slaveof <master-ip> <master-port> 配置选项来让服务器成为指定 服务器的从服务器。
即修改redis.conf文件。
# 使得Redis服务器可以跨网络访问
bind 0.0.0.0
# 设置密码
requirepass "123456"
# 指定主服务器,注意:有关slaveof的配置只是配置从服务器,主服务器不需要配置
slaveof 192.168.11.128 6379
# 主服务器密码,
masterauth 123456
服务器下线
在一个由主服务器和从服务器组成的系统中,主服务器或者从服务器都有可能会下线,但是不同服务器下线带来的影响并不相同:
如果下线的是从服务器,那么整个系统处理读请求的性能将有所下降,但整个系统仍然可以继续处理写请求和读请求,所以这种下线不会导致系统停机;
另一方面,因为在整个系统里面,只有主服务器一个能够处理写请求,所以如果下线的是主服务 器,那么整个系统将只能处理读请求而无法处理写请求,导致系统停机。
让系统重新上线的方法
为了让系统能够回到正常上线状态(也即是,让系统中的服务器既能够处理读请求,又能够处理写请求),用户需要向系统中的某一个从服务器发送 SLAVEOF no one 命令,让它变为新的主服务器,并向其他从服务器发送 SLAVEOF 命令,让它们去复制新的从服务器。
2.哨兵模式
启动 Redis Sentinel
通过执行 Redis 安装文件夹中的 redis-sentinel 程序,可以启动一个 Sentinel 实例:
$ redis-sentinel sentinel.conf
因为 Redis 的 Sentinel 实际上就是一个运行在Sentienl 模式下的 Redis 服务器,所以我们同样可以使用以下命令来启动一个 Sentinel 实例:
$ redis-server sentinel.conf --sentinel
启动 Sentinel 时需要指定配置文件, 该文件记录了要监视的主服务器,多个Sentinel 实例可以监视同一个主服务器,监视相同主服务器的这些 Sentinel 们会自动地互相连 接,组成一个分布式的 Sentinel 网络,互相通信并交 换彼此关于被监视服务器的信息。
右图展示了一个由三个 Sentinel 实例组成的 Sentinel 网络,这三个 Sentinel 监视着主服务器 s1 以及它的两个从服务器 s2 和 s3 。
Sentinel的工作方式:
1):每个Sentinel以每秒钟一次的频率向它所知的Master,Slave以及其他 Sentinel 实例发送一个 PING 命令。
2):如果一个实例(instance)距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项所指定的值, 则这个实例会被 Sentinel 标记为主观下线。
3):如果一个Master被标记为主观下线,则正在监视这个Master的所有 Sentinel 要以每秒一次的频率确认Master的确进入了主观下线状态。
4):当有足够数量的 Sentinel(大于等于配置文件指定的值)在指定的时间范围内确认Master的确进入了主观下线状态, 则Master会被标记为客观下线 。
5):在一般情况下, 每个 Sentinel 会以每 10 秒一次的频率向它已知的所有Master,Slave发送 INFO 命令 。
6):当Master被 Sentinel 标记为客观下线时,Sentinel 向下线的 Master 的所有 Slave 发送 INFO 命令的频率会从 10 秒一次改为每秒一次 。
7):若没有足够数量的 Sentinel 同意 Master 已经下线, Master 的客观下线状态就会被移除。
若 Master 重新向 Sentinel 的 PING 命令返回有效回复, Master 的主观下线状态就会被移除。
Sentinel 的配置
监视配置选项
Sentinel 在启动时必须指定相应的配置文件: $ redis-sentinel sentinel.conf
一个 Sentinel 配置文件至少要包含一个监视配置选项,用于指定被监视主服务器的相关信息:
sentinel monitor <name> <ip> <port> <quorum>
其中 name 是用户为被监视主服务器设置的名字,而 ip 和 port 则是被监视主服务器的 IP 地址和 端口号,quorum 为确认这个主服务器已下线所需要的最少 Sentinel 数量。
举个例子,配置 sentinel monitor mymaster 127.0.0.1 6379 2 表示要监视的主服务器的名字为 mymaster ,它的 IP 地址为 127.0.0.1 ,端口号为 6379 ,而确认这个主服务器已下线最少需要两个 Sentinel 同意。
Sentinel 可以自动发现并监视主服务器属下的所有从服务器,所以用户只需要给出主服务器的地址和 端口号就可以了。
端口配置选项
如果要在同一台机器上运行多个Sentinel 实例,用户还需要通过 port <number> 选项来为每个 Sentinel 设置不同的端口号,如果不进行设置,那么 Sentinel 的默认端口号为 26379 。
举个例子,如果要在同一台机器上运行两个 Sentinel 实例,用户可以通过载入以下两个配置文件来分 别将两个 Sentinel 实例的端口号设置为 26379 和 26380 :
# sentinel1.conf port 26379 sentinel monitor …
# sentinel2.conf port 26380 sentinel monitor …
3.集群模式
节点故障检测和自动故障转移
Redis 集群的主节点内置了类似 Redis Sentinel 的节点故障检测和自动故障转移功能,当集群中的某 个主节点下线时,集群中的其他在线主节点会注意到这一点,并对已下线的主节点进行故障转移。集群进行故障转移的方法和 Redis Sentinel 进行故障转移的方法基本一样,不同的是,在集群里面, 故障转移是由集群中其他在线的主节点负责进行的,所以集群不必另外使用 Redis Sentinel 。
分片
集群使用分片来扩展数据库的容量,并将命令请求的负载交给不同的节点来分担。
集群将整个数据库分为16384 个槽(slot),所有键都属于这16384个槽的其中一个,计算键 key属于哪个槽的公式为 slot_number = crc16(key) % 16384 ,其中 crc16 为 16 位的循环冗余校验 和函数。
集群中的每个主节点都可以处理 0 个至 16384 个槽,当 16384 个槽都有某个节点在负责处理时, 集群进入上线状态,并开始处理客户端发送的数据命令请求。
转向
对于一个被指派了槽的主节点来说,这个主节点只会处理属于指派给自己的槽的命令请求。
如果一个节点接收到了和自己处理的槽无关的命令请求,那么节点会向客户端返回一个转向错误 (redirection error),告诉客户端,哪个节点才是负责处理这条命令的,之后客户端需要根据错误中包含 的地址和端口号重新向正确的 节点发送命令请求。
搭建一个 Redis 集群需要以下步骤:
1 安装ruby (redis 3 和redis 4 需要.redis 5将集群命令集成到redis-cli中)
2. 创建多个节点。
3. 为每个节点指派槽,并将多个节点连接起来,组成一个集群。
4. 当集群数据库的 16384 个槽都有节点在处理时,集群进入上线状态。
最简单的集群三主三从
1)安装ruby的运行环境
yum install ruby
然后需要把ruby相关的包安装到服务器,这里用的是redis-3.0.0.gem。(redis的版本和ruby包的版本最好保持一致),然后执行
gem install redis-3.0.0.gem
接下来需要把这个ruby脚本工具复制到usr/local/rediscluster 目录下。那么这个ruby脚本工具在redis/src目录下的redis-trib.rb文件。
2)创建节点
集群中的节点就是运行在集群模式下的 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 <number> cluster-enabled yes
然后启动各个redis节点,可以做出shell命令:
cd redis01
./redis-server redis.conf
cd ..
cd redis02
./redis-server redis.conf
cd ..
cd redis03
./redis-server redis.conf
cd ..
cd redis04
./redis-server redis.conf
cd ..
cd redis05
./redis-server redis.conf
cd ..
cd redis06
./redis-server redis.conf
cd ..
3)为了创建一个包含三个主节点和三个从节点的集群,我们需要执行以下命令:
$ ./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 并按下回车。
4)连接节点
$ 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> # 转向是自动完成的,无需任何用户操作