title | created_at | tag | toc | displayed_on_home | ||||||
---|---|---|---|---|---|---|---|---|---|---|
[Redis] sentinel |
2021-03-20 02:30:23 -0700 |
|
true |
true |
在上一篇博客Replication
1中我们构建了一个简单的主从复制架构的redis服务,利用Replication我们可以让redis提供读写分离、提供读取能力、数据备份等功能,也支持slave从鼓掌中恢复。但是如果master出现了故障,那么整Replication都会处于一个不可用的状态。这显然无法满足高可用的目标。而整个目标需要借助sentinel
2来实现。
sentinel概述:
- 监控:sentinel是一个分布式系统,多个实例利用
gossip
协议协同工作。sentinel监控master和slave实例,同时sentinel实例之间也互相监控。 - 通知: 当某一个实例出现问题时,sentinel可以通过API通知系统管理员。
- 自动故障转移:如果被监控的master出现问题,sentinel可以启动一个自动故障转移的过程,sentinel实例之间选举出来一个slave提升为master,然后配置其他slave的配置使其成为新的master的slave,并且通知client使用新的连接地址。
- 配置提供者:client不再之间连接到master或者slave,而是连接到sentinel,由sentinel提供redis的master和slave的地址。
运行sentinel有两种方式:
redis-sentinel /path/to/sentinel.conf
;redis-server /path/to/sentinel.conf --sentinel
;
两种方式完全一样的(通常redis-sentinel
文件是redis-server
的一个符号连接,redis-server启动时会做如下检查):
{{}}
/* Returns 1 if there is --sentinel among the arguments or if
- argv[0] contains "redis-sentinel". */ int checkForSentinelMode(int argc, char **argv) { int j; if (strstr(argv[0],"redis-sentinel") != NULL) return 1; for (j = 1; j < argc; j++) if (!strcmp(argv[j],"--sentinel")) return 1; return 0; } {{}}
与redis-server
默认的6379
端口号不同的是,redis-sentinel
默认运行在26379
端口。
这里使用docker-compose -f redis.yml up -d
启动一个主从复制的环境,一个master
、两个slave
和三个sentinel
。
{{}}
{{}}
{{}}
启动后进入到其中的一个sentinel中docker exec -it sentinel_sentinel1.test_1 redis-cli -p 26379
:
{{}}
{{}}
sentinel monitor master1 master.test 6379 2
sentinel down-after-milliseconds master1 30000
sentinel failover-timeout master1 180000
sentinel parallel-syncs master1 1
protected-mode no
port 26379
daemonize no
pidfile /var/run/redis-sentinel.pid
logfile ""
sentinel announce-ip 1.2.3.4 sentinel announce-port 26379
SENTINEL resolve-hostnames yes SENTINEL announce-hostnames no {{}}