概述
Redis-Sentinel哨兵机制为Redis提供了高可用性,这意味着你可以使用哨兵模式创建一个可以不用人为干预而能够自动地应对各种故障的Redis部署。与此同时,Redis-Sentinel哨兵机制还为Redis提供了如下功能:
监控:哨兵不断地检查master和slave是否正常运行。
通知:当被监控的某台Redis实例出现故障时,哨兵可以通过API通知系统管理员和其他的应用程序。
自动故障转移:如果一个master不正常运行了,哨兵可以启动一个故障转移进程,将一个slave升级成为master,其他的 slave被重新配置使用新的master,并且应用程序使用Redis服务端通知的新地址。
配置提供者:哨兵作为Redis客户端发现的权威来源:客户端连接到哨兵请求当前可靠的master的地址。如果发生故障,哨兵将报告新地址。
哨兵的分布式特性
Redis哨兵是一个分布式系统,哨兵自身被设计成和多个哨兵进程一起合作运行,有多个哨兵进程合作的好处有:
a. 当多个哨兵对一个master不再可用达成一致时才会执行故障转移,这会降低错误判断的概率。
b. 即使在不是所有的哨兵都工作时哨兵也会工作,使系统健壮的抵抗故障,毕竟在故障系统里单点故障没有什么意义。
redis安装
一,将压缩包放入/tools/soft 目录并解压到、tools目录下
tar -zxvf redis-5.0.8.tar.gz -C /tools/
二、更改目录名
mv redis-5.0.8/ redis
三、进入redis目录编译
make MALLOC=libc
主从Replication的配置
安装Redis-Sentinel集群
Redis官网地址:https://redis.io/
Redis安装参考:Redis介绍与安装
Redis-Sentinel集群配置
hostname | IP地址 | 节点角色&端口 |
---|---|---|
master | 10.150.200.16 | Master:6379 / Sentinel : 26379 |
slave1 | 10.150.200.19 | Slave :6379 / Sentinel : 26379 |
slave2 | 10.150.200.17 | Slave :6379 / Sentinel : 26379 |
redis.conf配置
Master主节点(10.150.200.16)的 redis.conf 配置如下:
protected-mode no
port 6379
timeout 0
tcp-keepalive 300
daemonize no
pidfile "/var/run/redis_6379.pid"
loglevel notice
logfile "/tools/redis/logs/redis.log"
databases 16
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename "dump.rdb"
dir "/tools/redis/rdbs"
masterauth "123456"
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
replica-priority 100
requirepass "123456"
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
appendonly yes
appendfilename "appendonly.aof"
appendfsync no
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble yes
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -5
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value -2
hll-sparse-max-bytes 3000
stream-node-max-bytes 4096
stream-node-max-entries 100
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes
Slave从节点(10.150.200.19,10.150.200.17)与Master主节点(10.150.200.16)的 redis.conf 配置内容基本相同,只是额外增加了一行主节点的配置信息。
replicaof 10.150.200.19 6379
5.0一下版本为
slaveof 10.150.200.19 6379
sentinel.conf配置
Master主节点(10.150.200.16)和Slave从节点(10.150.200.19,10.150.200.17)的 sentinel.conf 配置相同,内容如下:
protected-mode no
port 26379
daemonize yes
dir "/tools/redis/sentinel-tmp"
sentinel monitor redis-master 172.16.250.234 6379 2
# sentinel auth-pass <master-name> <password>
# 当在Redis实例中开启了requirepass foobared 授权密码 这样所有连接Redis实例的客户端都要提供密码
# 设置哨兵sentinel 连接主从的密码 注意必须为主从设置一样的验证密码
sentinel auth-pass redis-master 123456
# sentinel down-after-milliseconds <master-name> <milliseconds>
# 指定多少毫秒之后 主节点没有应答哨兵sentinel 此时哨兵主观上认为主节点下线 默认30秒
sentinel down-after-milliseconds redis-master 30000
# sentinel failover-timeout <master-name> <milliseconds>
# 故障转移的超时时间 failover-timeout 可以用在以下这些方面:
# 1. 同一个sentinel对同一个master两次failover之间的间隔时间。
# 2. 当一个slave从一个错误的master那里同步数据开始计算时间。直到slave被纠正为向正确的master那里同步数据时。
# 3.当想要取消一个正在进行的failover所需要的时间。
# 4.当进行failover时,配置所有slaves指向新的master所需的最大时间。不过,即使过了这个超时,slaves依然会被正确配置为指向master,但是就不按parallel-syncs所配置的规则来了
# 默认三分钟
sentinel failover-timeout redis-master 180000
# sentinel parallel-syncs <master-name> <numslaves>
# 指定在发生failover主备切换时最多可以有多少个slave同时对新的master进行同步,
# 这个数字越小,完成failover所需的时间就越长,
# 但是如果这个数字越大,就意味着越多的slave因为replication而不可用。
# 可以通过将这个值设为 1 来保证每次只有一个slave 处于不能处理命令请求的状态。
sentinel parallel-syncs redis-master 1
# 配置当某一事件发生时所需要执行的脚本,可以通过脚本来通知管理员,例如当系统运行不正常时发邮件通知相关人员。
# 对于脚本的运行结果有以下规则:
# 若脚本执行后返回1,那么该脚本稍后将会被再次执行,重复次数目前默认为10
# 若脚本执行后返回2,或者比2更高的一个返回值,脚本将不会重复执行。
# 如果脚本在执行过程中由于收到系统中断信号被终止了,则同返回值为1时的行为相同。
# 一个脚本的最大执行时间为60s,如果超过这个时间,脚本将会被一个SIGKILL信号终止,之后重新执行。
#
# 通知型脚本:当sentinel有任何警告级别的事件发生时(比如说redis实例的主观失效和客观失效等等),将会去调用这个脚本,
# 这时这个脚本应该通过邮件,SMS等方式去通知系统管理员关于系统不正常运行的信息。调用该脚本时,将传给脚本两个参数,
# 一个是事件的类型,
# 一个是事件的描述。
# 如果sentinel.conf配置文件中配置了这个脚本路径,那么必须保证这个脚本存在于这个路径,并且是可执行的,否则sentinel无法正常启动成功。
# #通知脚本
# sentinel notification-script <master-name> <script-path>
# sentinel notification-script redis-master /var/redis/notify.sh
#
# 客户端重新配置主节点参数脚本
# 当一个master由于failover而发生改变时,这个脚本将会被调用,通知相关的客户端关于master地址已经发生改变的信息。
# 以下参数将会在调用脚本时传给脚本:
# <master-name> <role> <state> <from-ip> <from-port> <to-ip> <to-port>
# 目前<state>总是“failover”,
# <role>是“leader”或者“observer”中的一个。
# 参数 from-ip, from-port, to-ip, to-port是用来和旧的master和新的master(即旧的slave)通信的
# 这个脚本应该是通用的,能被多次调用,不是针对性的。
# sentinel client-reconfig-script <master-name> <script-path>
# sentinel client-reconfig-script redis-master /var/redis/reconfig.sh
配置完成之后,先创建好相应目录,并使用如下命令分别启动Redis和Sentinel集群:
[root@master src]# mkdir ../logs
[root@master src]# mkdir ../rdbs
[root@master src]# mkdir ../sentinel-tmp
[root@master src]# ./redis-server ../redis.conf
[root@master src]# ./redis-sentinel ../sentinel.conf
停止服务使用如下命令:
[root@master src]# pkill ./redis-server
[root@master src]# pkill ./redis-sentinel
集群启动成功之后,登录 Redis 客户端查看节点的复制信息。
使用如下命令:
[root@master src]# ./redis-cli -h 10.150.200.19 -p 6379 -a 123456
172.16.250.234:6379> info replication
Master 主节点(10.150.200.16)节点如下。
[root@miguvideo-9 src]# ./redis-cli -h 10.150.200.19 -p 6379 -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
10.150.200.19:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=10.150.200.16,port=6379,state=online,offset=1194654,lag=1
slave1:ip=10.150.200.17,port=6379,state=online,offset=1194654,lag=1
master_replid:ac29dc620c380ced10b6298a5c3d91f2b6d2fa29
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1194944
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:146369
repl_backlog_histlen:1048576
Slave从节点(172.16.250.239)节点如下。
[root@miguvideo-9 src]# ./redis-cli -h 10.150.200.16 -p 6379 -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
10.150.200.16:6379> info replication
# Replication
role:slave
master_host:10.150.200.19
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:1185870
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:ac29dc620c380ced10b6298a5c3d91f2b6d2fa29
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1185870
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:137295
repl_backlog_histlen:1048576
10.150.200.16:6379>
参考链接:
https://blog.csdn.net/pengjunlee/article/details/78777508
https://www.jianshu.com/p/85115435fd24
https://blog.csdn.net/pengjunlee/article/details/81429119