redis集群模式

前言

因为之前线上redis集群主从切换,client端未感知,导致往从库写数据报错,所以学习并整理了redis集群相关知识点。

主从复制

主从复制,是只从一台redis服务器的数据,复制到其他的一台或者多台redis服务器上。
前者为主节点(master),后者为从节点(slave)。
数据的复制只能从主节点到从节点。
主从复制主要起到以下几个作用:

  • 数据冗余:实现了数据的热备份
  • 故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速恢复。
  • 负载均衡:主节点提供写服务,从节点提供读服务,从而达到负载均衡的作用,常用于读多写少的功能,能有效提高服务器的并发量。
  • 高可用基础:作为哨兵和集群的基础,为redis的高可用提供基础。

如下图,即为主从复制的整个过程:


redis主从复制.png

主从复制的注意点:

  • 1.延迟与不一致:repl-disable-tcp-nodelay no/yes ,当配置为yes时,TCP会对包进行合并从而减少带宽并降低频率,从节点数据延迟增加,一致性变差。
  • 2.数据过期问题:在redis 3.2之前,从节点过期数据需要主节点来进行删除,当处于惰性删除时,从节点会获取到已经过期的数据,将redis升级到3.2之后即可解决。
  • 3.故障转移:由于没有哨兵等机制,主从节点如果出现问题而发生更改时,需要修改程序或者另外写程序进行自动切换。
  • 4.因为主从复制需要从节点发送指令到master,如果从节点过多,会导致主节点繁忙从而影响正常业务。

哨兵模式

在主从复制的基础上,引入了哨兵模式,提供了高可用解决方案,可以在没有人工干预的情况下实现故障恢复能力。
哨兵是一个独立的进程,监控各个节点的监控状态。
客户端通过连接sentinel来获取对应redis的主从节点。
哨兵模式主要起到以下几个作用:

  • 1.监控:哨兵会不断检查主节点和从节点是否运作正常。
  • 2.自动故障转移:当主节点无法正常工作时,哨兵会开始自动故障转移操作,将从节点选举为主节点,并让其他从节点改为复制新的主节点。
  • 3.配置提供者:客户端初始化时,通过连接哨兵来获取当前redis服务的主节点地址。
  • 4.通知:哨兵可以将各节点的状态发送给客户端。

扩展:我们公司通过对redis的扩展,一组sentinel里面连接了多个master,对key通过一致性hash来获取对应的分片,从而实现负载均衡。

redis sentinel集群.png

sentinel常用配置:

  • sentinel down-after-milliseconds <master-name> <milliseconds>
    指定主节点应答哨兵sentinel的最大时间间隔,超过这个时间,哨兵主观上认为主节点下线(即主观下线),默认30秒
  • sentinel monitor <master-name> <ip> <redis-port> <quorum>
    哨兵sentinel监控的redis主节点,其中quorum指指定个数的sentinel认为master不可达,则认为主节点客观下线
  • sentinel parallel-syncs <master-name> <numslaves>
    指定了在发生failover主备切换时,最多可以有多少个slave同时对新的master进行同步。这个数字越小,完成failover所需的时间就越长;反之,但是如果这个数字越大,就意味着越多的slave因为replication而不可用。可以通过将这个值设为1,来保证每次只有一个slave,处于不能处理命令请求的状态。
  • sentinel known-sentinel
    指定主节点所连接的sentinel节点信息

sentinel常见命令:

  • sentinel is-master-down-by-addr
    当主节点主观下线时,向其他sentinel节点询问对该节点的状态判断,如果超过quorum个数的节点判定不可达,则判断该主节点为客观下线
  • SENTINEL masters / SENTINEL master <master_name>/SENTINEL slaves <master_name>
    显示所有主节点 / 显示指定主节点 / 显示主节点的所有从节点状态
  • SENTINEL get-master-addr-by-name <master_name>
    返回主节点的IP和端口号(如果在进行failover或者已经完成,则显示被提升为主节点的从节点信息)
  • SENTINEL reset <pattern>
    重置名字匹配该 正则表达式 的所有的 主节点 的状态信息,清除它之前的 状态信息,以及 从节点 的信息,并自动重新发现。
  • SENTINEL failover <master_name>
    强制当前 Sentinel 节点执行 failover,并且不需要得到其他 Sentinel 节点的同意。但是 failover 后会将 最新的配置 发送给其他 Sentinel 节点。
  • info
    info信息下会有当前sentinel的各种信息:
    • 1.master:当前sentinel监听的主节点的状态
  • SENTINEL REMOVE <name>
    用来移除指定的主节点:主节点不再被监控,并且将被从Sentinel的内部状态中被完全移除,所以不会被SENTINEL masters列出。
sentinel集群 master下线.png
发布/订阅消息列表
  • +reset-master <instance details> --- 主节点被重置。
  • +slave <instance details> --- 一个新的从节点被发现和关联。
  • +failover-state-reconf-slaves <instance details> --- 故障转移状态被转换为reconf-slaves状态。
  • +failover-detected <instance details> --- 另一个Sentinel开始了故障转移或者其他的外部实体被发现(一个关联的从节点变为主节点)。
  • +slave-reconf-sent <instance details> --- 为了给新的从节点重新配置,sentinel 中的leader发送SLAVEOF命令到这个实例。
  • +slave-reconf-inprog <instance details> --从节点被重新配置展示一个主节点的从节点,但是同步过程尚未完成。
  • +slave-reconf-done <instance details> --- 从节点现在和主节点是同步的。
    -dup-sentinel <instance details> --指定的主节点,一个或者多个sentinels被 移除,因为是重复的。
  • +sentinel <instance details> --- 这个主节点的一个新的sentinel被发现和关联。
  • +sdown <instance details> --- 指定的实例现在处于主观下线状态。
  • -sdown <instance details> --- 指定的实例不再处于主观下线状态。
  • +odown <instance details> --- 指定的实例现在处于客观下线状态。
  • -odown <instance details> --- 指定的实例现在不处于客观下线状态。
  • +new-epoch <instance details> --- 当前时间被更新。
  • +try-failover <instance details> --- 准备新的故障转移,等待大多数的选举。
  • +elected-leader <instance details> --- 赢得了选举,开始故障转移。
  • +failover-state-select-slave <instance details> --- 新的故障转移状态是select-- slave:我们 正在寻找合适提升为主节点的从节点。
  • no-good-slave <instance details> --- 没有合适进行提升的从节点。一般会在稍后重试,但是这或许会改变并且终止故障转移。
  • selected-slave <instance details> --- 我们找到了指定的从节点来进行提升。
  • failover-state-send-slaveof-noone <instance details> --- 我们尝试重新配置这个提升后的主节点,等待它切换。
  • failover-end-for-timeout <instance details> --- 故障转移由于超时而停止,无论如何从节点最后被配置为复制新的主节点。
  • failover-end <instance details> --- 故障转移由于成功而停止,所有的从节点被配置为复制新的主节点。
  • switch-master <master name> <oldip> <oldport> <newip> <newport> --- 配置改变后,主节点新的IP和地址都是指定的。这是大多数外部用户感兴趣的消息。
  • +tilt --- 进入Tilt模式。
  • -tilt --- 退出Tilt模式。

呼应前言,之前线上出现,手动failover的时候,客户端没有感知主从切换,导致始终往老的主节点写数据,此时老的主节点已经变成从节点,写入报错。
经排查,是因为线上redis配置了7个sentinel,其中4个不可用,而quorum为2,这导致,当2个sentinel节点同意主节点不可用,尝试开始故障转移,但是没有至少4个sentinel节点授权并开始,所以sentinel就不会开始故障转移,也就不会publish相关消息,导致客户端不感知。

集群模式

待完善

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,542评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,596评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,021评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,682评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,792评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,985评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,107评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,845评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,299评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,612评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,747评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,441评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,072评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,828评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,069评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,545评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,658评论 2 350

推荐阅读更多精彩内容