Redis基于HA的集群布署 – Redis Sentinel
Redis Sentinel规划
考虑到大多数学习者环境有限,我们使用如下配置:
IP | 端口 | 身份 |
---|---|---|
192.168.41.128 | 7001 | master |
192.168.41.128 | 7002 | slave |
192.168.41.128 | 26379 | sentinel |
所以我们在一台服务器上安装3个目录:
- redis1-对应master
- redis2-对应slave
- redis-sentinel对应sentinel,它使用26379这个端口来监控master和slave
因此我们使用redis-stable源码包来如此构建我们的实验环境:
[root@bogon redis-stable]# make PREFIX=/usr/local/redis1 install
[root@bogon redis-stable]# make PREFIX=/usr/local/redis2 install
[root@bogon redis-stable]# make PREFIX=/usr/local/redis-sentinel install
根据redis安装教程安装 三个测试redis
Sentinel中的配置
更改/usr/local/redis-sentinel/bin/sentinel.conf
文件:
port 26379
daemonize yes
logfile "/var/log/redis/sentinel.log"
sentinel monitor master1 192.168.56.101 7001 1
sentinel down-after-milliseconds master1 1000
sentinel failover-timeout master1 5000
#sentinel can-failover master1 yes #remove from 2.8 and aboved version
daemonize yes – 以后台进程模式运行
port 26379 – 哨兵的端口号,该端口号默认为26379,不得与任何redis node的端口号重复
logfile “/var/log/redis/sentinel.log“ – log文件所在地
sentinel monitor master1 192.168.56.101 7001 1 – (第一次配置时)哨兵对哪个master进行监测,此处的master1为一“别名”可以任意如sentinel-26379,然后哨兵会通过这个别名后的IP知道整个该master内的slave关系。因此你不用在此配置slave是什么而由哨兵自己去维护这个“链表”。
sentinel monitor master1 192.168.56.101 7001 1 – 这边有一个“1”,这个“1”代表当新master产生时,同时进行“slaveof”到新master并进行同步复制的slave个数。在salve执行salveof与同步时,将会终止客户端请求。此值较大,意味着“集群”终止客户端请求的时间总和和较大。此值较小,意味着“集群”在故障转移期间,多个salve向客户端提供服务时仍然使用旧数据。我们这边只想让一个slave来做此时的响应以取得较好的客户端体验。
sentinel down-after-milliseconds master1 1000 – 如果master在多少秒内无反应哨兵会开始进行master-slave间的切换,使用“选举”机制
sentinel failover-timeout master1 5000 – 如果在多少秒内没有把宕掉的那台master恢复,那哨兵认为这是一次真正的宕机,而排除该宕掉的master作为节点选取时可用的node然后等待一定的设定值的毫秒数后再来探测该节点是否恢复,如果恢复就把它作为一台slave加入哨兵监测节点群并在下一次切换时为他分配一个“选取号”。
sentinel can-failover master1 yes #remove from 2.8 and aboved version – 该功能已经从2.6版以后去除,因此注释掉,网上的教程不适合于redis-stable版
在配置Redis Sentinel做Redis的HA场景时,一定要注意下面几个点:
除非有多机房HA场景的存在,坚持使用单向链接式的master->slave的配置如:node3->node2->node1,把node1设为master
如果sentinel(哨兵)或者是HA群重启,一定要使用如此顺序:先启master,再启slave,再启哨兵
第一次配置完成“哨兵”HA群时每次启动不需要手动再去每个redis node中去更改master slave这些参数了,哨兵会在第一次启动后记录和动态修改每个节点间的关系,第一次配置好启动“哨兵”后由哨兵以后自行维护一般情况下不需要人为干涉,如果切换过一次master/slave后也因该记得永远先起master再起slave再起哨兵这个顺序,具体当前哪个是master可以直接看哨兵的sentinel.conf文件中最末尾哨兵自行的记录
Redis Master和Redis Slave的配置
这部分配置除了端口号,所在目录,pid文件与log文件不同其它配置相同,因此下面只给出一份配置:
daemonize yes
pidfile "/var/run/redis/redis1.pid"
port 7001
tcp-backlog 511
timeout 0
tcp-keepalive 0
loglevel notice
logfile "/var/log/redis/redis1.log"
databases 16
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error no
rdbcompression yes
rdbchecksum yes
dbfilename "dump.rdb"
dir "/usr/local/redis1/data"
slave-serve-stale-data yes
slave-read-only yes #slave只读,当你的应用程序试图向一个slave写数据时你会得到一个错误
repl-diskless-sync no
repl-disable-tcp-nodelay no
slave-priority 100
maxmemory 0
appendonly no
# The name of the append only file (default: "appendonly.aof")
appendfilename "appendonly.aof"
# appendfsync always
#appendfsync everysec
appendfsync no #关闭AOF
no-appendfsync-on-rewrite yes
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 "gxE"
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-entries 512
list-max-ziplist-value 64
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
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
其中:
slave-read-only yes 我们把slave设成只读,当你的应用程序试图向一个slave写数据时你会得到一个错误
appendfsync no 我们关闭了AOF功能
这是192.168.41.128:7001 master上的配置,你要把192.168.41.128:7002作为slave,那很简单,你只需要在redis2的配置文件的最未尾加入一句:
slaveof 192.168.41.1128 7001
配完了master, slave和sentinel后,我们按照这个顺序来启动redis HA:
master->slave->sentinel
启动后我们通过windows客户端使用命令:
redis-cli -p 26379 -h 192.168.41.128
进入我们配置好的sentinel后并使用: info命令来查看我们的redis sentinel HA配置。可以看到目前它的master为7001,它有一个slave。
为了确认,我们另外开一个command窗口,通过:
redis-cli -p 7001 -h 192.168.41.128
进入到7001后再使用redis内部命令info replication来查看相关信息
我们还可以通过命令:
redis-cli -h 192.168.41.128 -p 7002
进入到7002中并通过info replication来查看7002内的情况: