4 Redis部署模式

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> # 转向是自动完成的,无需任何用户操作
 

 

 

 

 

哨兵模式Redis 的一种高可用部署方案,可以保证 Redis 服务的高可用性和自动故障转移。在哨兵模式中,有一个或多个 Redis 实例充当主节点(master),其余的实例充当从节点(slave)。每个主节点都有一个哨兵进程来监控它的状态,并在主节点发生故障时自动将一个从节点升级为新的主节点。 要部署 Redis 哨兵模式,首先需要安装并启动多个 Redis 实例。每个实例都需要配置不同的端口和数据目录。然后,在每个实例的配置文件中,需要指定相应的角色(主节点或从节点)和哨兵配置。 主节点配置示例(redis.conf): ``` port 6379 daemonize yes dir /var/lib/redis/6379 ``` 从节点配置示例(redis.conf): ``` port 6380 daemonize yes dir /var/lib/redis/6380 slaveof 127.0.0.1 6379 ``` 接下来,需要配置哨兵进程监控 Redis 实例的状态。创建一个哨兵配置文件(sentinel.conf),并添加以下内容: ``` port 26379 daemonize yes sentinel monitor mymaster 127.0.0.1 6379 2 sentinel down-after-milliseconds mymaster 5000 sentinel failover-timeout mymaster 10000 sentinel parallel-syncs mymaster 1 ``` 其中,`mymaster` 是要监控的主节点名称,`127.0.0.1` 是 Redis 主节点的 IP 地址,`6379` 是 Redis 主节点的端口号。 最后,启动哨兵进程: ``` redis-sentinel /path/to/sentinel.conf ``` 这样就完成了 Redis 哨兵模式部署。哨兵进程将会定期检测主节点的状态,如果主节点不可用,则会自动将一个从节点提升为新的主节点,并通知其他从节点和客户端进行更新。这样可以确保 Redis 服务在主节点故障时能够自动切换到可用的节点上,实现高可用性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值