Redis高可用方案之sentinel(哨兵集群)
Redis哨兵为Redis提供了高可用性。实际上这意味着你可以使用哨兵模式创建一个可以不用人为干预而应对各种故障的Redis部署。
监控:哨兵不断的检查master和slave是否正常的运行。
通知:当监控的某台Redis实例发生问题时,可以通过API通知系统管理员和其他的应用程序。
自动故障转移:如果一个master不正常运行了,哨兵可以启动一个故障转移进程,将一个slave升级成为master,其他的slave被重新配置使用新的master,并且应用程序使用Redis服务端通知的新地址。
配置提供者:哨兵作为Redis客户端发现的权威来源:客户端连接到哨兵请求当前可靠的master的地址。如果发生故障,哨兵将报告新地址。
Redis哨兵是一个分布式系统:
哨兵自身被设计成和多个哨兵进程一起合作运行。有多个哨兵进程合作的好处有:
当多个哨兵对一个master不再可用达成一致时执行故障检测。这会降低错误判断的概率。
即使在不是所有的哨兵都工作时哨兵也会工作,使系统健壮的抵抗故障。毕竟在故障系统里单点故障没有什么意义。
Redis的哨兵、Redis实例(master和slave)、和客户端是一个有特种功能的大型分布式系统。
部署哨兵之前需要了解的基本事情:
一个健壮的部署至少需要三个哨兵实例。
三个哨兵实例应该放置在客户使用独立方式确认故障的计算机或虚拟机中。例如不同的物理机或不同可用区域的虚拟机。
sentinel + Redis实例不保证在故障期间保留确认的写入,因为Redis使用异步复制。然而有方式部署哨兵使丢失数据限制在特定时刻,虽然有更安全的方式部署它。
你的客户端要支持哨兵,流行的客户端都支持哨兵,但不是全部。
没有HA设置是安全的,如果你不经常的在开发环境测试,在生产环境他们会更好。你可能会有一个明显的错误配置只是当太晚的时候。
Sentinel,Docker,或者其他形式的网络地址交换或端口映射需要加倍小心:Docker执行端口重新映射,破坏Sentinel自动发现其他的哨兵进程和master的slave列表。
机器信息:
192.168.121.40 Master
192.168.121.41 Slave1
192.168.121.42 Slave2
Master(192.168.121.40)
机器配置如下:
redis.conf
cat redis.conf | grep -v "#"
bind 127.0.0.1 192.168.121.40
protected-mode yes
port 6879
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize yes
supervised no
pidfile "/usr/local/redis-4.0.10_6879/redis_6879.pid"
loglevel notice
logfile "/usr/local/redis-4.0.10_6879/redis_6879.log"
databases 16
always-show-logo yes
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-4.0.10_6879"
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
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
slave-lazy-flush no
appendonly yes
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
aof-use-rdb-preamble no
lua-time-limit 5000
cluster-node-timeout 15000
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
slaveof 192.168.121.41 6879
Slave1和Slave2配置相同,只是bind处需要把IP改成41和42
Master的sentinel.conf哨兵配置文件:
Redis源码发布包包含一个sentinel.conf的文件,Master(192.168.121.40)机器配置如下:
cat sentinel.conf
port 26879
#1表示在sentinel集群中只要有两个节点检测到redis主节点出故障就进行切换,单sentinel节点无效(自己测试发现的)
#如果3s内mymaster无响应,则认为mymaster宕机了
#如果10秒后,mysater仍没活过来,则启动failover
sentinel monitor mymaster 192.168.121.40 6879 1
sentinel down-after-milliseconds mymaster 3000
sentinel failover-timeout mymaster 10000
daemonize yes
#指定工作目录
dir "/data/redis/sentinel-work"
protected-mode no
logfile "/data/redis/sentinellog/sentinel.log"
# Generated by CONFIG REWRITE
Slave(192.168.121.41-42)机器配置同上
注意:以上配置中不存在的文件路径需要手动创建。哨兵可配置多个,最好是最少3个节点,配置相同。
启动集群
启动192.168.121.40-41--42各机器Redis节点命令如下:
/usr/local/redis-4.0.10_6879/src/redis-server /usr/local/redis-4.0.10_6879/redis.conf
启动各Redis哨兵节点命令如下:
/usr/local/redis-4.0.10_6879/src/redis-sentinel /usr/local/redis-4.0.10_6879/sentinel.conf
三台都启动完成以后登陆 列出Slave的信息
[root@wgq_idc_cache_3_40 redis-4.0.10_6879]# /usr/local/redis-4.0.10_6879/src/redis-cli -p 6879
127.0.0.1:6879> info Replication
# Replication
role:slave
master_host:192.168.121.41
master_port:6879
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:2049886
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:50eb71744c1aacc84bd865ff3af7ee1902395634
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:2049886
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1001311
repl_backlog_histlen:1048576
查看启动sentinel.log
cat sentinel.log
4453:X 15 Jun 17:09:41.774 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
4453:X 15 Jun 17:09:41.774 # Redis version=4.0.10, bits=64, commit=00000000, modified=0, pid=4453, just started
4453:X 15 Jun 17:09:41.774 # Configuration loaded
4454:X 15 Jun 17:09:41.779 * Running mode=sentinel, port=26879.
4454:X 15 Jun 17:09:41.779 # Sentinel ID is 5092d7a7096ec024a1d15e0fc903f7c289d4bd8a
4454:X 15 Jun 17:09:41.779 # +monitor master mymaster 192.168.121.40 6879 quorum 1
4454:X 15 Jun 17:12:47.369 # +sdown master mymaster 192.168.121.40 6879
4454:X 15 Jun 17:12:47.369 # +odown master mymaster 192.168.121.40 6879 #quorum 1/1
4454:X 15 Jun 17:12:47.369 # +new-epoch 1
4454:X 15 Jun 17:12:47.369 # +try-failover master mymaster 192.168.121.40 6879
4454:X 15 Jun 17:12:47.370 # +vote-for-leader 5092d7a7096ec024a1d15e0fc903f7c289d4bd8a 1
4454:X 15 Jun 17:12:47.371 # +elected-leader master mymaster 192.168.121.40 6879
4454:X 15 Jun 17:12:47.371 # +failover-state-select-slave master mymaster 192.168.121.40 6879
4454:X 15 Jun 17:12:47.442 # +selected-slave slave 192.168.121.42:6879 192.168.121.42 6879 @ mymaster 192.168.121.40 6879
4454:X 15 Jun 17:12:47.442 * +failover-state-send-slaveof-noone slave 192.168.121.42:6879 192.168.121.42 6879 @ mymaster 192.168.121.40 6879
4454:X 15 Jun 17:12:47.572 * +failover-state-wait-promotion slave 192.168.121.42:6879 192.168.121.42 6879 @ mymaster 192.168.121.40 6879
4454:X 15 Jun 17:12:48.401 # +promoted-slave slave 192.168.121.42:6879 192.168.121.42 6879 @ mymaster 192.168.121.40 6879
到这里我们已经完成了sentinel集群的搭建;
如果启动有此警告信息:
WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
方法1: 临时设置生效:
sysctl -w net.core.somaxconn = 65535
sysctl -w vm.overcommit_memory = 1
方法2: 永久生效: 修改/etc/sysctl.conf文件,增加一行
net.core.somaxconn = 65535
vm.overcommit_memory = 1
然后执行命令
sysctl -p
参考:http://redis.majunwei.com/topics/sentinel.html
Tag标签:「哨兵 集群 redis 方案 sentinel」更新时间:「2021-11-04 17:17:28」阅读次数:「947」