redis sentinel实战

来源:互联网 发布:php html转字符串 编辑:程序博客网 时间:2024/05/23 15:06

知识点准备

在部署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 1min-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.88protected-mode yesport 6379tcp-backlog 511timeout 0tcp-keepalive 300daemonize yessupervised nopidfile "/var/run/redis_6379.pid"loglevel noticelogfile "/usr/local/redis/logs/6379.log"databases 16save 900 1save 300 10save 60 10000stop-writes-on-bgsave-error yesrdbcompression yesrdbchecksum yesdbfilename "dump.rdb"dir "/usr/local/redis/data/6379"slave-serve-stale-data yesslave-read-only yesrepl-diskless-sync norepl-diskless-sync-delay 5repl-disable-tcp-nodelay noslave-priority 100appendonly noappendfilename "appendonly.aof"appendfsync everysecno-appendfsync-on-rewrite noauto-aof-rewrite-percentage 100auto-aof-rewrite-min-size 64mbaof-load-truncated yeslua-time-limit 5000slowlog-log-slower-than 10000slowlog-max-len 128latency-monitor-threshold 0notify-keyspace-events ""hash-max-ziplist-entries 512hash-max-ziplist-value 64list-max-ziplist-size -2list-compress-depth 0set-max-intset-entries 512zset-max-ziplist-entries 128zset-max-ziplist-value 64hll-sparse-max-bytes 3000activerehashing yesclient-output-buffer-limit normal 0 0 0client-output-buffer-limit slave 256mb 64mb 60client-output-buffer-limit pubsub 32mb 8mb 60hz 10aof-rewrite-incremental-fsync yes#两个slave节点只需改bind和端口并在最后添加一下:slaveof 10.10.123.88 6379

2.在3个节点上配置sentinel

bind 0.0.0.0port 26379daemonize yesdir "/usr/local/redis/data/"logfile "/usr/local/redis/logs/sentinel.log"sentinel monitor mymaster 10.10.123.88 6379 2sentinel down-after-milliseconds mymaster 6000sentinel failover-timeout mymaster 18000sentinel 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 637910.10.123.88:6379> info replication# Replicationrole:masterconnected_slaves:2slave0:ip=10.10.123.86,port=6380,state=online,offset=4526241,lag=1slave1:ip=10.10.123.87,port=6379,state=online,offset=4526241,lag=0master_repl_offset:4526241repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:3477666repl_backlog_histlen:1048576

4.启动3个节点sentinel

[test@test ~] redis-sentinel sentinel.conf#查看启动信息22123:X 27 Oct 09:21:41.458 # Sentinel ID is 78aae51608ef7ee160001b9466ffb0119319552622123:X 27 Oct 09:21:41.458 # +monitor master mymaster 10.10.123.88 6379 quorum 222123:X 27 Oct 09:21:41.459 * +slave slave 10.10.123.87:6379 10.10.123.87 6379 @ mymaster 10.10.123.88 637922123:X 27 Oct 09:21:41.462 * +slave slave 10.10.123.86:6380 10.10.123.86 6380 @ mymaster 10.10.123.88 637922123:X 27 Oct 09:23:28.981 * +sentinel sentinel 9918ab7835d217f91768857d8af99d30df40ed8c 10.10.123.86 26379 @ mymaster 10.10.123.88 637922123: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 26379127.0.0.1:26379> info sentinel# Sentinelsentinel_masters:1sentinel_tilt:0sentinel_running_scripts:0sentinel_scripts_queue_length:0sentinel_simulate_failure_flags:0master0: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