一.Redis的安装和配置
本文以redis-3.0.7版本为例
1. 下载redis安装包, 可以去官网下载
2. 将下载好的redis安装包拷贝到linux服务器目录下
3. Xshell连接服务器, 解压redis安装包
进入到该目录下, 执行命令解压安装
tar -zxvf redis-3.0.7.tar.gz
解压完后进入到解压的目录
4. 编译安装
依次执行以下命令
make
make test
make install
结束后返回上一级执行授权命令
chown -R root:root redis-3.0.7
到这里Redis的安装就结束了
二. Sentinel介绍
Sentinel(哨兵)是Redis 的高可用性解决方案:由一个或多个Sentinel 实例 组成的Sentinel 系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器。
Sentinel作用:
1):Master状态检测
2):如果Master异常,则会进行Master-Slave切换,将其中一个Slave作为Master,将之前的Master作为Slave
3):Master-Slave切换后,master_redis.conf、slave_redis.conf和sentinel.conf的内容都会发生改变,即master_redis.conf中会多一行slaveof的配置,sentinel.conf的监控目标会随之调换
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 的主观下线状态就会被移除。
主观下线和客观下线
主观下线:Subjectively Down,简称 SDOWN,指的是当前 Sentinel 实例对某个redis服务器做出的下线判断。
客观下线:Objectively Down, 简称 ODOWN,指的是多个 Sentinel 实例在对Master Server做出 SDOWN 判断,并且通过 SENTINEL is-master-down-by-addr 命令互相交流之后,得出的Master Server下线判断,然后开启failover.
通俗来讲就是:
redis的sentinel系统用来管理多个redis服务器,可以实现一个功能上实现HA的集群。该系统主要执行三个任务:
①监控( Monitoring ): Redis Sentinel实时监控主服务器和从服务器运行状态。
②提醒(notification): 当被监控的某个 Redis 服务器出现问题时, Redis Sentinel 可以向系统管理员发送通知, 也可以通过 API 向其他程序发送通知
一个简单的主从结构加sentinel集群的架构图如下:
上图是一主一从节点,加上两个部署了sentinel的集群,sentinel集群之间会互相通信,沟通交流redis节点的状态,做出相应的判断并进行处理,这里的主观下线状态和客观下线状态是比较重要的状态,它们决定了是否进行故障转移
可以 通过订阅指定的频道信息,当服务器出现故障得时候通知管理员
客户端可以将 Sentinel 看作是一个只提供了订阅功能的 Redis 服务器,你不可以使用 PUBLISH 命令向这个服务器发送信息,但你可以用 SUBSCRIBE 命令或者 PSUBSCRIBE 命令, 通过订阅给定的频道来获取相应的事件提醒。
一个频道能够接收和这个频道的名字相同的事件。 比如说, 名为 +sdown 的频道就可以接收所有实例进入主观下线(SDOWN)状态的事件。
三. 配置Redis主从服务器和哨兵
Redis配置文件参数说明请参考文章redis配置文件详解
这里测试配置1主2从3哨兵
1. 复制6份redis.conf文件, 按照个人喜好命名
为了便于区分, 这里分别命名为 :
redis-master-6379.conf
redis-slaver-6380.conf
redis-slaver-6381.conf
sentinel-63791.conf
sentinel-63792.conf
sentinel-63793.conf
2. 修改相关配置属性
在文件中找到以下属性并修改
(1). 修改redis-master-6379.conf文件(Redis主服务器配置)
port 6379
daemonize yes
bind 0.0.0.0
(2). 修改redis-slaver-6380.conf文件(Redis从服务器1配置)
port 6380
daemonize yes
bind 0.0.0.0
dbfilename dump6380.rdb
slaveof 127.0.0.1 6379
(3). 修改redis-slaver-6381.conf文件(Redis从服务器2配置)
port 6381
daemonize yes
bind 0.0.0.0
dbfilename dump6381.rdb
slaveof 127.0.0.1 6379
(4). 修改sentinel-63791.conf文件(Redis哨兵1配置)
直接清空文件内容, 并加以下配置代码
port 63791
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 18000
sentinel parallel-syncs mymaster 1
(5). 修改sentinel-63792.conf文件(Redis哨兵2配置)
直接清空文件内容, 并加以下配置代码
port 63792
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 18000
sentinel parallel-syncs mymaster 1
(6). 修改sentinel-63793.conf文件(Redis哨兵3配置)
直接清空文件内容, 并加以下配置代码
port 63793
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 18000
sentinel parallel-syncs mymaster 1
四. 启动Redis并开启哨兵进行测试
1.分别启动redis主服务器和2个从服务器
redis-server redis-master-6379.conf
redis-server redis-slaver-6380.conf
redis-server redis-slaver-6381.conf
可以分别查看对应的状态信息
redis-cli -h 127.0.0.1 -p 6379
info replication
可以看到6379端口对应的redis服务器当前是master主服务器角色, 并且有2个从服务器
同理可以查看另外两个从服务器的状态信息
2. 启动三个哨兵
redis-sentinel sentinel-63791.conf &
redis-sentinel sentinel-63792.conf &
redis-sentinel sentinel-63793.conf &
查看sentinel状态信息
redis-3.0.7]# redis-cli -h 127.0.0.1 -p 63791
info sentinel
可以看出当前配置了一个主服务器, 端口是6379, 和2个从服务器, 并开启了3个哨兵
3. 测试哨兵机制
将主服务器进程杀掉
当kill掉该进程后, 可以看到redis实时日志信息
可以看到,6379主服务器断了之后,sentinel 帮我们选了6381作为新的主服务器
接下来查看一下6381的状态信息
从6381的状态信息中看到, 原来的从服务器6381在主服务器6379挂掉之后已经被选举成了新的主服务器
接下来我们再重新开启6379服务器, 那么6381会不会将自己的主服务器角色让给6379呢? 答案当然是否定的~~
重新启动6379服务器后, 主服务器依然是刚才选举得来的6381, 6379此时成了从服务器的角色