在部署redis sentinel之前,我们需要了解以下几点:
1.官方文档推荐redis sentinel部署最少使用3个sentinel节点,究其原因主要有两点:
(1)在多节点sentinel运行时,只有当达到quorum设置的参数时,master才会被认为odown(客观下线),但此时并不会出发故障迁移;
(2)在故障迁移前,需要经过大多数的sentinel选举出一个leader,被授权来进行故障迁移。
当只有两个sentinel时,一旦master和其中一个sentinel停止工作,根据第二点,就会出现无法推举出leader并授权进行failover;另外当出现脑裂情况时,客户端无法判断哪个是需要写入的master。
2.主观下线(sdown)和客观下线(odown),当master在down-after-milliseconds 时间内不可达,则sentinel认为master是sdown;当达到quorum个数量的sentinel认为master为sdown时,则sentinel认为master为odown,后续将会进行sentine 选举并进行failover。
3.在failover过程中,parallel-syncs指定了最多可以有多少个slave同时对新的master进行同步,这个数字越小,完成failover所需的时间就越长,但是如果这个数字越大,就意味着越多的slave因为replication而不可用。可以通过将这个值设为 1 来保证每次只有一个slave处于不能处理命令请求的状态。
4.由于redis是异步复制,当master被网络隔离,客户端将依然可以向master写数据,但是当网络恢复后,master就会变成redis的一个slave,那么,在网络隔离期间,客户端向master写的数据将会丢失。为避免此种情况,我们需要在redis配置以下两个参数:
min-slaves-to-write 1
min-slaves-max-lag 10
master在网络隔离时,当master无法向min-slaves-to-write个 数量的slave复制数据时或master在min-slaves-max-lag时间内无法向slave复制数据时,master将无法接受客户端写数据,通过此种方法可以缓解数据丢失。
通过以上,我们了解到redis sentinel的一些工作机制,下面我们来进行部署。
ip | redis端口 | 角色 | sentinel端口 |
---|---|---|---|
10.10.123.86 | 6380 | slave | 26379 |
10.10.123.87 | 6379 | slave | 26379 |
10.10.123.88 | 6379 | master | 26379 |
1.在3个节点上配置redis
#master节点
bind 127.0.0.1 10.10.123.88
protected-mode yes
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize yes
supervised no
pidfile "/var/run/redis_6379.pid"
loglevel notice
logfile "/usr/local/redis/logs/6379.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 "/usr/local/redis/data/6379"
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
slave-priority 100
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated 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 -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes
#两个slave节点只需改bind和端口并在最后添加一下:
slaveof 10.10.123.88 6379
2.在3个节点上配置sentinel
bind 0.0.0.0
port 26379
daemonize yes
dir "/usr/local/redis/data/"
logfile "/usr/local/redis/logs/sentinel.log"
sentinel monitor mymaster 10.10.123.88 6379 2
sentinel down-after-milliseconds mymaster 6000
sentinel failover-timeout mymaster 18000
sentinel parallel-syncs mymaster 1
注意:默认情况下,sentinel会处于protected-mode,此时只允许本地环回地址访问,外部无法通过ip+port访问,因此其他sentinel在经过down-after-milliseconds 6000 时间后,会出现sdown sentinel的情况;此时可以通过在配置文件配置bind或protected-mode no来关闭此模式,此处推荐使用bind 0.0.0.0方式
3.启动3个节点redis
[test@test ~] redis-server 6379.conf
#查看redis主从
[test@test ~] redis-cli -h 10.10.123.88 -p 6379
10.10.123.88:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=10.10.123.86,port=6380,state=online,offset=4526241,lag=1
slave1:ip=10.10.123.87,port=6379,state=online,offset=4526241,lag=0
master_repl_offset:4526241
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:3477666
repl_backlog_histlen:1048576
4.启动3个节点sentinel
[test@test ~] redis-sentinel sentinel.conf
#查看启动信息
22123:X 27 Oct 09:21:41.458 # Sentinel ID is 78aae51608ef7ee160001b9466ffb01193195526
22123:X 27 Oct 09:21:41.458 # +monitor master mymaster 10.10.123.88 6379 quorum 2
22123:X 27 Oct 09:21:41.459 * +slave slave 10.10.123.87:6379 10.10.123.87 6379 @ mymaster 10.10.123.88 6379
22123:X 27 Oct 09:21:41.462 * +slave slave 10.10.123.86:6380 10.10.123.86 6380 @ mymaster 10.10.123.88 6379
22123:X 27 Oct 09:23:28.981 * +sentinel sentinel 9918ab7835d217f91768857d8af99d30df40ed8c 10.10.123.86 26379 @ mymaster 10.10.123.88 6379
22123:X 27 Oct 09:24:44.045 * +sentinel sentinel 4d6724c49b78bc9842cfb855cc610916e4c5b530 10.10.123.87 26379 @ mymaster 10.10.123.88 6379
#查看sentinel信息
[test@test ~] redis-cli -p 26379
127.0.0.1:26379> info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=10.10.123.88:6379,slaves=2,sentinels=3
通过配置bind,address初才会显示ip,否则显示127.0.0.1.
通过以上可知:master 名字为mymaster,有两个slave节点,有3个sentinel节点
#查看master的运行信息
127.0.0.1:26379> sentinel master mymaster
#查看slave的运行信息
127.0.0.1:26379> sentinel slaves mymaster
其中flags为当前状态,若master或slave服务停止,则会出现当前状态信息。
通过以上步骤,3个节点的redis+sentinel的环境就运行起来了,后面我们只需通过停止master、slave或sentinel来进行测试。
注意:只有master节点会出现sdown,而slave和sentinel则只会出现odown