Redis哨兵模式

Redis哨兵模式简介

哨兵模式的实现场景

在主从模式的Redis系统中,从数据库在整个系统中起到了数据 冗余备份和 读写分离的作用,但是当数据库遇到异常中断服务后,我们只能通过手动的方式选择一个从数据库来升格为主数据库,显然这种方式很麻烦需要人工介入,这时通过哨兵模式可以实现自动化的系统监控和故障恢复

哨兵模式
哨兵模式原理
哨兵(sentinel) 是一个分布式系统,用于对主从结构中的每台服务器进行监控,当出现故障时通过投票机制选择新的master并将所有slave连接到新的master。所以整个运行哨兵的集群的数量不得少于3个节点。

哨兵模式的作用

  • 监控
    不断的检查master和slave是否正常运行。
    master存活检测、master与slave运行情况检测

  • 通知(提醒)
    当被监控的服务器出现问题时,向其他(哨兵间,客户端)发送通知。

  • 自动故障转移
    断开master与slave连接,选取一个slave作为master,将其他slave连接到新的master,并告知客户端新的服务器地址
    PS:哨兵也是一台redis服务器,只是不提供数据服务
    哨兵的启动依赖于主从模式,所以须把主从模式安装好的情况下再去做哨兵模式,所有节点上都需要部署哨兵模式,哨兵模式会监控所有的redis工作节点是否正常,当master出现问题的时候,因为其他节点与主节点失去联系,因此会投票,投票过半就认为这个master的确出现问题,然后会通知哨兵间,然后从slaves中选取一个作为新的master

一、Sentinel作用:

  • Master状态检测
  • 如果Master异常,则会进行Master-Slave切换,将其中一个Slave作为Master,将之前的Master作为Slave
  • Master-Slave切换后,master_redis.conf、slave_redis.conf和sentinel.conf的内容都会发生改变,即master_redis.conf中会多一行slaveof的配置,sentinel.conf的监控目标会随之调换

二、Sentinel工作方式:

  • 每个Sentinel以每秒钟一次的频率向它所知的Master,Slave以及其他 Sentinel 实例发送一个 PING 命令
  • 如果一个实例(instance)距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项所指定的值, 则这个实例会被 Sentinel 标记为主观下线。
  • 如果一个Master被标记为主观下线,则正在监视这个Master的所有 Sentinel 要以每秒一次的频率确认Master的确进入了主观下线状态。
  • 当有足够数量的 Sentinel(大于等于配置文件指定的值)在指定的时间范围内确认Master的确进入了主观下线状态, 则Master会被标记为客观下线
  • 在一般情况下, 每个 Sentinel 会以每 10 秒一次的频率向它已知的所有Master,Slave发送 INFO 命令。
  • 当Master被 Sentinel 标记为客观下线时,Sentinel 向下线的 Master 的所有 Slave 发送 INFO 命令的频率会从 10 秒一次改为每秒一次
  • 若没有足够数量的 Sentinel 同意 Master 已经下线, Master 的客观下线状态就会被移除。
      若 Master 重新向 Sentinel 的 PING 命令返回有效回复, Master 的主观下线状态就会被移除。
      主观下线和客观下线
      主观下线:Subjectively Down,简称 SDOWN,指的是当前 Sentinel 实例对某个redis服务器做出的下线判断。
      客观下线:Objectively Down, 简称 ODOWN,指的是多个 Sentinel 实例在对Master Server做出 SDOWN 判断,并且通过 SENTINEL is-master-down-by-addr 命令互相交流之后,得出的Master Server下线判断,然后开启failover.
      SDOWN适合于Master和Slave,只要一个 Sentinel 发现Master进入了ODOWN, 这个 Sentinel 就可能会被其他 Sentinel 推选出, 并对下线的主服务器执行自动故障迁移操作。
      ODOWN只适用于Master,对于Slave的 Redis 实例,Sentinel 在将它们判断为下线前不需要进行协商, 所以Slave的 Sentinel 永远不会达到ODOWN。

安装redis

检查是否安装了gcc#

rpm -qa|grep gcc
libgcc-4.4.7-4.el6.x86_64
gcc-4.4.7-4.el6.x86_64
gcc-c++-4.4.7-4.el6.x86_64

如果未安装,可使用yum install gcc 命令安装

编译安装redis#
(1). 解压redis安装包tar -zxvf redis-3.2.1.tar.gz
(2). 编译安装redis

cd redis-3.2.1
make
make install PREFIX=/redis # PREFIX指定安装目录
安装完成后,在/redis目录下会新增bin目录,这里面是启动redis服务的相关脚本。
创建/redis/conf、/redis/data、/redis/log目录。

修改配置文件redis.conf

拷贝redis-3.2.1/redis.conf文件到/redis/conf目录下,编辑/redis/conf/redis.conf文件
node1主机上修改内容如下

bind 192.168.1.101 127.0.0.1 #绑定多个IP,既可以远程访问,也可以本地客户端访问
port 6379 #指定端口
appendonly yes #开启aof持久化
daemonize yes
pidfile "/redis/redis_6379.pid"
logfile "/redis/log/redis_6379.log"
dir "/redis/data"

node2主机上修改内容如下

bind 192.168.1.102 127.0.0.1 #绑定多个IP,既可以远程访问,也可以本地客户端访问
port 6379 #指定端口
appendonly yes #开启aof持久化
daemonize yes
pidfile "/redis/redis_6379.pid"
logfile "/redis/log/redis_6379.log"
dir "/redis/data"
slaveof 192.168.1.101 6379

node3主机上修改内容如下

bind 192.168.1.103 127.0.0.1 #绑定多个IP,既可以远程访问,也可以本地客户端访问
port 6379 #指定端口
appendonly yes #开启aof持久化
daemonize yes
pidfile "/redis/redis_6379.pid"
logfile "/redis/log/redis_6379.log"
dir "/redis/data"
slaveof 192.168.1.101 6379

增加配置文件sentinel.conf

在/redis/conf下增加配置文件sentinel.conf,文件内容为:

node1主机上内容如下

bind 192.168.1.101
port 26379
daemonize yes
logfile "/redis/log/sentinel.log"
dir "/redis/data"
sentinel monitor mymaster 192.168.1.101 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000

node2主机上内容如下

bind 192.168.1.102
port 26379
daemonize yes
logfile "/redis/log/sentinel.log"
dir "/redis/data"
sentinel monitor mymaster 192.168.1.101 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000

node3主机上内容如下

bind 192.168.1.103
port 26379
daemonize yes
logfile "/redis/log/sentinel.log"
dir "/redis/data"
sentinel monitor mymaster 192.168.1.101 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000

部分参数说明:
sentinel monitor

-masterName 指定maser的名字
-ip 指定master的IP
-port 指定maseter的端口
-quorum quorum是Sentinel需要协商同意master是否可到达的数量。为了真正的标记slave为失败,并最终是否需要启动一个故障转移进程。无论怎样,quorum只用于检测故障。为了实际执行故障转移,Sentinel需要选举leader并进行授权。这只发生在大多数Sentinel进程的选举。
down-after-milliseconds选项指定了 Sentinel 认为服务器已经断线所需的毫秒数。

  • 如果服务器在给定的毫秒数之内, 没有返回 Sentinel 发送的 PING 命令的回复, 或者返回一个错误, 那么 Sentinel 将这个服务器标记为主观下(subjectively down,简称 SDOWN )。
    不过只有一个 Sentinel 将服务器标记为主观下线并不一定会引起服务器的自动故障迁移: 只有在足够数量的 Sentinel 都将一个服务器标记为主观下线之后, 服务器才会被标记为客观下线(objectively down, 简称 ODOWN ), 这时自动故障迁移才会执行。
  • parallel-syncs选项指定了在执行故障转移时, 最多可以有多少个从服务器同时对新的主服务器进行同步, 这个数字越小, 完成故障转移所需的时间就越长。
    关于sentinel的详细配置说明请参考Sentinel配置详解

启动redis和sentinel

在三台主机上分别执行下述命令,启动redis服务和sentinel服务

cd /redis
./bin/redis-server conf/redis.conf
./bin/redis-sentinel conf/sentinel.conf

故障转移测试
在node1使用redis-cli命令查看主从信息

./bin/redis-cli -p 6379 info replication
role:master
connected_slaves:2

可以看到node1上的redis进程为master,现在kill掉node1上的redis进程,观察故障转移情况。
使用redis-cli命令查看主从信息

./bin/redis-cli -p 6379 -h 192.168.1.102 info replication
role:master
connected_slaves:1
slave1:ip=192.168.1.103,port=6379,state=online,offset=13836,lag=1
./bin/redis-cli -p 6379 -h 192.168.1.103 info replication
role:slave
master_host:192.168.1.102
master_port:6379
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值