共计 6624 个字符,预计需要花费 17 分钟才能阅读完成。
一、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 的客观下线状态就会被移除。
8):若 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 集群之间会互相通信,沟通交流 redis 节点的状态,做出相应的判断并进行处理,这里的主观下线状态和客观下线状态是比较重要的状态,它们决定了是否进行故障转移 可以 通过订阅指定的频道信息,当服务器出现故障得时候通知管理员 客户端可以将 Sentinel 看作是一个只提供了订阅功能的 Redis 服务器,你不可以使用 PUBLISH 命令向这个服务器发送信息,但你可以用 SUBSCRIBE 命令或者 PSUBSCRIBE 命令,通过订阅给定的频道来获取相应的事件提醒。
一个频道能够接收和这个频道的名字相同的事件。比如说,名为 +sdown 的频道就可以接收所有实例进入主观下线(SDOWN)状态的事件。
二、搭建 redis-sentinel 集群环境
1、下载 redis 编译安装包:redis-2.8.19.tar.gz,然后解压缩进行编译安装。将 redis 安装到 /opt/redis 目录下。
[root@idxs21-108 redis]# mkdir bin #redis 脚本文件
[root@idxs21-108 redis]# mkdir conf #redis 配置文件
[root@idxs21-108 redis]# mkdir data #redis 的本地数据存放
[root@idxs21-108 redis]# mkdir logs #redis 日志文件
[root@idxs21-108 redis]# tar zxvf redis-2.8.19.tar.gz cd redis-2.8.19
[root@idxs21-108 redis]# make PREFIX=/opt/redis install cp *.conf /opt/redis/conf #把安装源文件中的.conf 配置文件拷贝一份到安装目录下的 conf 目录中。
[root@idxs21-108 redis]# cd /opt/redis/conf cp redis.cof redis.conf.bak cp sentinel.conf sentinel.conf.bak
2. 在安装 redis 成功后,可以在 /opt/redis/bin 目录下看到以下内容:
[root@idxs21-108 bin]# ll
total 15220
-rwxr-xr-x 1 root root 4586251 Mar 10 2015 redis-benchmark
-rwxr-xr-x 1 root root 22177 Mar 10 2015 redis-check-aof
-rwxr-xr-x 1 root root 45387 Mar 10 2015 redis-check-dump
-rwxr-xr-x 1 root root 4679739 Mar 10 2015 redis-cli
lrwxrwxrwx 1 root root 27 Jun 20 15:59 redis-sentinel -> /opt/redis/bin/redis-server
-rwxr-xr-x 1 root root 6241748 Mar 10 2015 redis-server
3、修改 master 机器配置文件(这里直接使用的 sed 命令做的替换):
# — redis.conf #修改 redis.conf
sed -i ‘s/daemonize no/daemonize yes/g’ redis.conf #使用后台方式运行
sed -i ‘s/logfile “”/logfile “/opt/redis/logs/redis.log”/g’ redis.conf #配置日志路径
# no AOF and RDB for master #配置数据同步策略,master 节点注释关闭掉 dump 数据同步
sed -i ‘s/save 900 1/# save 900 1/g’ redis.conf
sed -i ‘s/save 300 10/# save 300 10/g’ redis.conf
sed -i ‘s/save 60 10000/# save 60 10000/g’ redis.conf
sed -i ‘s/appendonly no/appendonly yes/g’ redis.conf #打开 aof 同步
sed -i ‘s/dir \.\//dir “/opt/redis/data/”/g’ redis.conf #配置数据文件存放路径
sed -i ‘s/slowlog-log-slower-than 10000/slowlog-log-slower-than 5000/g’ redis.conf
sed -i ‘s/slowlog-max-len 128/slowlog-max-len 1000/g’ redis.conf
# — sentinel.conf #修改 sentinel.conf 文件
echo ‘daemonize yes’ >> sentinel.conf #后台方式运行 sentinel
echo ‘logfile /opt/redis/logs/sentinel.log’ >> sentinel.conf
sed -i ‘s/sentinel monitor mymaster 127.0.0.1 6379 2/sentinel monitor mymaster 10.135.40.118 6379 2/g’ sentinel.conf #配置哨兵模式
4、修改 slave 机器配置文件,两台 slave 配置一样:
# — redis.conf
sed -i ‘s/daemonize no/daemonize yes/g’ redis.conf
sed -i ‘s/logfile “”/logfile “/opt/redis/logs/redis.log”/g’ redis.conf
sed -i ‘s/# save “”/save “”/g’ redis.conf
sed -i ‘s/appendonly no/appendonly yes/g’ redis.conf
sed -i ‘s/dir \.\//dir “/opt/redis/data/”/g’redis.conf
# SLOWLOG GET or SLOWLOG GET number
sed -i ‘s/slowlog-log-slower-than 10000/slowlog-log-slower-than 5000/g’ redis.conf
sed -i ‘s/slowlog-max-len 128/slowlog-max-len 1000/g’ redis.conf
echo “slaveof 10.135.40.118 6379” >> redis.conf #指定 master 节点
# — sentinel.conf
echo ‘daemonize yes’ >> sentinel.conf
echo ‘logfile /opt/redis/logs/sentinel.log’ >> sentinel.conf
sed -i ‘s/sentinel monitor mymaster 127.0.0.1 6379 2/sentinel monitor mymaster 10.135.40.118 6379 2/g’ sentinel.conf
5、配置文件修改完成之后启动 redis 服务,从 master 开始启动,所有节点的启动方式和命令都是一样的。
启动 redis 服务和 sentinel 服务:
[root@idxs21-108 redis]# /opt/redis/bin/redis-server /opt/redis/conf/redis.conf
[root@idxs21-108 redis]# /opt/redis/bin/redis-sentinel /opt/redis/conf/sentinel.conf
查看服务进程状态:
[root@idxs21-108 redis]# ps -ef | grep redis
root 10024 9807 0 17:14 pts/0 00:00:00 grep redis
root 68378 1 0 Jul28 ? 01:30:09 /opt/redis/bin/redis-sentinel *:26379
root 68379 1 0 Jul28 ? 00:35:16 /opt/redis/bin/redis-server *:6379
6、测试
1>. 测试数据同步
主 redis 写入数据:
[root@idxs40-118 redis]# redis-cli -p 6379
127.0.0.1:6379> set name abc
OK
127.0.0.1:6379> get name
“abc”
127.0.0.1:6379>
从 redis 读取数据:
[root@idxs40-117 redis]# redis-cli -p 6379
127.0.0.1:6379> get name
“abc”
127.0.0.1:6379>
从 redis 读取数据:
[root@idxs40-119 redis]# redis-cli -p 6379
127.0.0.1:6379> get name
“abc”
127.0.0.1:6379>
2>.redis 默认是读写分离的,只有 master 能写,slave 只能读:
1 [root@idxs40-117 ~]# redis-cli -p 6379
2 127.0.0.1:6579> set name 123
3 (error) READONLY You can't write against a read only slave.
这里可看到,slave 节点默认只有读的权限,无法进行写入操作。
7、sentinel 一些命令介绍 要使用 sentinel 的命令,我们需要用 redis-cli 命令进入到 sentinel:
[root@idxs21-108 redis]# redis-cli -h 10.135.40.118 -p 26379
①INFO sentinel 的基本状态信息
②SENTINEL masters 列出所有被监视的主服务器,以及这些主服务器的当前状态
③SENTINEL slaves 列出给定主服务器的所有从服务器,以及这些从服务器的当前状态
④SENTINEL get-master-addr-by-name 返回给定名字的主服务器的 IP 地址和端口号
⑤SENTINEL reset 重置所有名字和给定模式 pattern 相匹配的主服务器。重置操作清除主服务器目前的所有状态,包括正在执行中的故障转移,并移除目前已经发现和关联的,主服务器的所有从服务器和 Sentinel。
⑥SENTINEL failover 当主服务器失效时,在不询问其他 Sentinel 意见的情况下,强制开始一次自动故障迁移,但是它会给其他 sentinel 发送一个最新的配置,其他 sentinel 会根据这个配置进行更新
8、如果 master 节点宕机,会从两台 slave 中自动选举出一台机器接替 master 角色。后期如果老的 master 节点重新恢复,重新加入集群中,也只能是 salve 节点。
下面关于 Redis 的文章您也可能喜欢,不妨参考下:
Ubuntu 14.04 下 Redis 安装及简单测试 http://www.linuxidc.com/Linux/2014-05/101544.htm
Redis 主从复制基本配置 http://www.linuxidc.com/Linux/2015-03/115610.htm
CentOS 7 下 Redis 的安装与配置 http://www.linuxidc.com/Linux/2017-02/140363.htm
Ubuntu 14.04 安装 Redis 与简单配置 http://www.linuxidc.com/Linux/2017-01/139075.htm
Ubuntu 16.04 环境中安装 PHP7.0 Redis 扩展 http://www.linuxidc.com/Linux/2016-09/135631.htm
Redis 单机 & 集群离线安装部署 http://www.linuxidc.com/Linux/2017-03/141403.htm
CentOS 7.0 安装 Redis 3.2.1 详细过程和使用常见问题 http://www.linuxidc.com/Linux/2016-09/135071.htm
Ubuntu 16.04 环境中安装 PHP7.0 Redis 扩展 http://www.linuxidc.com/Linux/2016-09/135631.htm
Ubuntu 15.10 下 Redis 集群部署文档 http://www.linuxidc.com/Linux/2016-06/132340.htm
Redis 实战 中文 PDF http://www.linuxidc.com/Linux/2016-04/129932.htm
本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-08/146370.htm