Nacos实战(19)-Nacos健康检查机制:保障你的服务稳定运行!

0 前言

注册中心不应仅提供服务注册和发现功能,还应保证对服务可用性监测,对不健康的服务和过期的进行标识或剔除,维护实例的生命周期,以保证客户端尽可能的查询到可用的服务列表。

因此本文介绍Nacos注册中心的健康检查机制。

1 注册中心的健康检查机制

知道⼀个服务是否还健康的方式:

  • 客户端主动上报,告诉服务端自己健康状态,如果在⼀段时间没有上报,那么我们就认为服务已经不健康
  • 服务端主动向客户端进行探测,检查客户端是否还被能探测到

如你在废墟中大声呼叫救援队并且提供你的位置和健康信息,相比搜救队用探测设备挨着废墟探测会使探测队的工作量减轻很多,他可专注尽快将你救出。好比注册中心对服务健康状态的检测,如所有服务都要注册中心主动探测,由于服务的数量远大于注册中心的数量,那么注册中心的任务量将会比较巨大。那就都采用服务主动上报健康检查。那如果在废墟之下的我们因为身体状况无法呼救,那么搜救队就会放弃搜救了吗?当然不是,搜救队肯定也会对废墟进行全面探测将你救出。如服务本身就没法主动进行健康上报,那么这个时候注册中心主动检查健康状态就有用武之地。

在当前主流的注册中心,对健康检查机制主要都采用TTL(Time To Live),即客户端在⼀定时间没向注册中心发心跳,注册中心认为此服务不健康,进而触发后续剔除逻辑。

对主动探测,根据不同场景,要采用的方式有不同。

Nacos 健康检查机制

既然以上两种健康检查机制都有应用的场景,且适用场景不⼀致,Nacos 对健康检查的机制如何抉择?

2 Nacos服务的特点

Nacos 提供两种服务类型供用户注册实例时选择:

  • 临时实例,临时存在于注册中心,在服务下线或不可用时被注册中心剔除。临时实例会与注册中心保持心跳,注册中心在⼀段时间没收到来自客户端的心跳后就将实例设置为不健康,然后在⼀段时间后剔除
  • 永久实例在被删除之前会永久的存在于注册中心,且可能不知道注册中心存在,不会主动向注册中心上报心跳,这时就要注册中心主动探活

可见Nacos两种健康探测方式均有被使用,Nacos监看检查的整体交互如下:

来看Nacos对两种实例的健康检查机制。

3 临时实例健康检查机制

可通过两种方式进行临时实例注册,通过:

  • Nacos 的 OpenAPI
  • 或 Nacos 提供的 SDK

进行服务注册,OpenAPI注册方式实际是用户根据自身需求调 Http 接口对服务进行注册,然后通过 HTTP 接口发送心跳到注册中心。在注册服务同时会注册⼀个全局的客户端心跳检测的任务。在服务⼀段时间没有收到来自客户端的心跳后,该任务会将其标记为不健康,如果在间隔的时间内还未收到心跳,那么该任务会将其剔除。

SDK注册方式实际是通过 RPC 与注册中心保持连接(Nacos 2.x中,旧版还是仍通过OpenAPI),客户端会定时通过 RPC 连接向 Nacos 注册中心发心跳,保持连接的存活。如客户端和注册中心的连接断开,注册中心会主动剔除该 client 所注册的服务,达到下线效果。

Nacos 注册中心还会在注册中心启动时,注册⼀个过期客户端清除的定时任务,删除那些健康状态超过⼀段时间的客户端。

对不同类型使用方式,Nacos 对健康检查的特点都相同,都是由客户端向注册中心发送心跳,注册中心会在连接断开或是心跳过期后将不健康的实例移除。

4 永久实例健康检查机制

Nacos 中使用 SDK 对于永久实例的注册实际也是使用 OpenAPI 的方式进行注册,这样可以保证即使客户端下线后也不会影响永久实例的健康检查。

永久实例的的监看检查,Nacos采用注册中心探测机制,注册中心会在永久服务初始化时,根据客户端选择的协议类型注册探活的定时任务。Nacos 现在内置提供了三种探测的协议,即Http、TCP 及 MySQL 。

MySQL 主要用于特殊业务场景,如数据库的主备需通过服务名对外提供访问,需要确定当前访问数据库是否为主库时,那么我们此时的健康检查接口,是⼀个检查数据库是否为主库的 MySQL命令。

因为持久化服务的实例的在被主动删除前⼀直存在,探活的定时任务会不断探测服务健康状态,并将无法探测成功的实例标为不健康。

但有时:有些服务不希望校验其健康状态,Nacos 也提供白名单配置,用户可将服务配置到该白名单,Nacos放弃对其健康检查,实例健康状态始终为用户传入的健康状态。

5 集群模式下的健康检查机制

完整的注册中心应具备高可用,即注册中心可集群部署作为⼀个整体对外服务。不同于单机部署,集群部署中我们的客户端只和其中⼀个注册中心服务保持链接和请求,但我们的服务信息需要注册到所有的服务节点上,在其他客户端从任意⼀个注册中心服务获取服务列表时始终是所有的服务列表。此时Nacos在集群模式下又如何对不是和自己保持心跳连接的服务进行健康检查?

对集群下的服务,Nacos⼀个服务只会被 Nacos 集群中的⼀个注册中心负责,其余节点的服务信息只是集群副本,用于订阅者在查询服务列表时,始终可获取到全部服务列表。临时实例只对其被负责的注册中心节点发送心跳信息,注册中心服务节点会对其负责的永久实例进行健康探测,在获取到健康状态后由当前负责的注册中心节点将健康信息同步到集群中的其他的注册中心。

服务的注册从注册方式维度可分:

  • 通过 SDK RPC 连接进行注册,客户端会和注册中心保持链接
  • 通过 OpenAPI 进行 IP 和端口注册

第⼀类如何找到对其负责的注册中心节点?只需和注册中心集群的任⼀台节点建立联系,由这节点负责这客户端。注册中心会在启动时注册⼀个全局的同步任务,将其当前负责的所有节点信息同步到集群中其他节点,其他非负责的节点也会创建该客户端的信息,在非负责的节点上,连接类型的客户端,会有续约时间,在收到其他节点的同步信息时,更新续约时间为当前时间,如在集群中的其他节点⼀段时间内没收到不是自己的负责的节点的同步信息,那认为此节点已不健康,从而达到对不是自己负责的节点健康状态检查。

第二类方式也基本和第⼀类⼀致,OpenAPI 注册的临时实例也是通过同步自身负责的节点到其他节点来更新其他节点的对应的临时实例的心跳时间,保证其他节点不会删除或者修改此实例的健康状态。前面我们特别指明了是临时实例而没有说所有实例,你应该也可能会想到这种方式对于持久化节点会显得多余,永久实例会在被主动删除前⼀直存在于注册中心,那么我们健康检查并不会去删除实例,所以我们只需要在负责的节点永久实例健康状态变更的时候通知到其余的节点即可。

6 总结

本文从注册中心场景展开,详细介绍 Nacos 注册中心的健康检查机制。

Nacos针对不同类型的服务,使用不同健康检查方式进行实例生命周期维护,⼀致性协议使 Nacos 节点均保持实例生命周期的⼀致。

Nacos 注册中心集群中,实例的健康状态和生命周期需要保持⼀致,因此后文介绍 Nacos 注册中心是如何使用 Nacos 的⼀致性协议,来保持数据模型及生命周期⼀致。

本文由博客一文多发平台 OpenWrite 发布!

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

推荐阅读更多精彩内容