Redis Sentinel 部署

安装环境

CentOS7.4
Redis3.2.10

Redis Sentinel简介

Redis Sentinel为Redis提供高可用性。实际上,这意味着使用Sentinel可以创建一个Redis部署,在没有人为干预的情况下抵抗某些类型的故障。

  • Redis Sentinel还提供其他附属任务,如监视,通知和作为客户配置提供者的行为。
  • 监测。Sentinel会不断检查您的主从实例是否按预期工作。
  • 通知。Sentinel可以通过API向另一台计算机程序通知系统管理员,其中一个受监控的Redis实例出现问题。
  • 自动故障转移。如果主服务器无法按预期工作,则Sentinel可以启动故障切换进程,其中从服务器升级为主服务器,其他附加从服务器将重新配置为使用新主服务器,并且使用Redis服务器的应用程序会通知有关使用新服务器的新地址连接。
  • 配置提供者。Sentinel充当客户端服务发现的权威来源:客户端连接到Sentinels以请求负责给定服务的当前Redis主服务器的地址。如果发生故障转移,Sentinels将报告新地址。

Redis Sentinel是一个分布式系统:

  • Sentinel本身被设计为在多个Sentinel进程合作的配置中运行。多个Sentinel进程合作的优势如下:

  • 当多个Sentinels同意给定的主站不再可用时,会执行故障检测。这降低了误报的可能性。

  • 即使不是所有的Sentinel进程都能正常工作,Sentinel也能正常工作,从而使系统在发生故障时更具有鲁棒性 毕竟,有一个自身是单点故障的故障切换系统是没有意义的。
  • Sentinel,Redis实例(主设备和从设备)以及连接到Sentinel和Redis的客户端的总和也是具有特定属性的更大的分布式系统。在本文档中,概念将逐步引入,从为了理解Sentinel的基本属性所需的基本信息,到更复杂的信息(可选),以便了解Sentinel的工作原理。

在部署前了解有关Sentinel的基本知识

您需要至少三个Sentinel实例才能实现可靠的部署。
三个Sentinel实例应放置在相对独立的计算机或虚拟机中。例如,不同的物理服务器或虚拟机在不同的可用区域上执行。
由于Redis使用异步复制,Sentinel + Redis分布式系统不能保证在故障期间保留已确认的写入。然而,有些方法可以部署Sentinel,使窗口可以丢失局限于某些时刻的写入,而另外还有其他安全性较低的部署方式。
您的客户需要支持Sentinel。主流的客户端库支持Sentinel,但不是全部。
Sentinel,Docker或其他形式的网络地址转换或端口映射应该小心:Docker执行端口重新映射,打破其他Sentinel进程的Sentinel自动发现以及主服务器的从属列表。

Redis安装

参考CentOS7 install Redis

Redis主从搭建

Redis安装测试完毕后,执行以下命令停止Redis默认服务

service redis stop

编写Redis主节点的配置文件

bind 0.0.0.0
protected-mode yes
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize no
supervised no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile /var/log/redis/redis-6379.logwhere
databases 16
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump-6379.rdb
dir /var/lib/redis/
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

编写从节点配置文件

此文搭建在单机上,因此以不同端口启动redis服务以模拟多节点。

bind 0.0.0.0
protected-mode yes
port 6380
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize no
supervised no
pidfile /var/run/redis_6380.pid
loglevel notice
logfile /var/log/redis/redis-6380.logwhere
databases 16
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump-6380.rdb
dir /var/lib/redis/
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
slaveof 127.0.0.1 6379

注意53行,多了slaveof 127.0.0.1 6379这样的一行代码,它配置了ip为127.0.0.1,端口为6379的节点是主节点。

复制上文代码,并修改其中所有的6380->6381,实际修改后如下

bind 0.0.0.0
protected-mode yes
port 6381
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize no
supervised no
pidfile /var/run/redis_6381.pid
loglevel notice
logfile /var/log/redis/redis-6381.logwhere
databases 16
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump-6381.rdb
dir /var/lib/redis/
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
slaveof 127.0.0.1 6379

现在我们创建了如下三个文件

redis-6379.conf  //主节点配置文件
redis-6380.conf  //从节点1配置文件
redis-6381.conf  //从节点2配置文件

启动节点

接下来我们启动各个Redis节点,我们先启动主节点。

redis-server redis-6379.conf &

然后启动两个从节点

redis-server redis-6380.conf &
redis-server redis-6381.conf &

确认是否启动

redis-cli -h 127.0.0.1 -p 6379 ping
redis-cli -h 127.0.0.1 -p 6380 ping
redis-cli -h 127.0.0.1 -p 6381 ping

若均返回PONG则代表均启动成功

查看主从关系

redis-cli -h 127.0.0.1 -p 6379 info replication

返回如下信息代表正确

# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6380,state=online,offset=71,lag=0
slave1:ip=127.0.0.1,port=6381,state=online,offset=71,lag=0
master_repl_offset:71
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:70

查看从节点关系

redis-cli -h 127.0.0.1 -p 6380 info replication

返回如下信息代表正确

# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:5
master_sync_in_progress:0
slave_repl_offset:113
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

部署Sentinel节点

编写主Sentinel节点配置文件

bind 0.0.0.0
protected-mode yes
port 26379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize no
supervised no
pidfile /var/run/redis_26379.pid
loglevel notice
logfile /var/log/redis/redis-26379.logwhere
databases 16
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump-26379.rdb
dir /var/lib/redis/
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
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000

与普通Redis配置文件相比,多了最后4行,其中
– 第一行是配置主节点的信息及Sentinel选举主节点所需票数(该处由于Sentinel节点为3个,因此仅需2个节点同意即可发起主节点转移操作)
– 第二行是主节点不通后的超时时间
– 第三行配置的是当主节点不通后转移后主节点可同时发起复制的从节点个数
– 第四行配置的是转移节点操作的超时时间

以同样方式复制2份配置文件并修改其中所有带有26379字符->26380->26381
现在我们有如下三份配置文件

redis-sentinel-26379.conf
redis-sentinel-26380.conf
redis-sentinel-26381.conf

启动Sentinel节点

redis-sentinel redis-sentinel-26379.conf &
redis-sentinel redis-sentinel-26380.conf &
redis-sentinel redis-sentinel-26381.conf &

检查节点监听状态

redis-cli -h 127.0.0.1 -p 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=127.0.0.1:6379,slaves=2,sentinels=3
[root@192 config]# redis-server -v
Redis server v=3.2.10 sha=00000000:0 malloc=jemalloc-3.6.0 bits=64 build=c8b45a0ec7dc67c6

到此,Redis Sentinel 就已经部署完毕了。

参考文献:
– 《Redis开发与运维》
Redis Sentinel文档

发表评论

关闭菜单