掌桥专利:专业的专利平台
掌桥专利
首页

一种K8s环境下基于grpc的缓存同步实现方法及系统

文献发布时间:2023-06-19 18:30:43


一种K8s环境下基于grpc的缓存同步实现方法及系统

技术领域

本发明涉及云计算技术领域,具体为一种K8s环境下基于grpc的缓存同步实现方法及系统。

背景技术

在K8s环境下,程序通常以多副本的方式运行,每个副本运行相同的代码。同时,在许多业务场景下,需要通过缓存提高程序的响应速度与执行效率。

现有技术中,如果程序以多副本的方式运行,且将缓存存放于内存中,当其中一个副本中的缓存发生改变时,其他副本的缓存无法及时更新,在缓存失效前的短暂时间内,可能会导致数据不一致的情况发生,进而导致程序的行为出现问题。因此,在K8s环境下,人们通常会使用Redis等外部缓存系统来解决缓存不一致的问题。

但是,当环境资源紧缺需要尽量减少业务系统以外的组件时,或者希望程序依赖更少的外部组件以减少出错的可能性时,人们通常会选择继续将缓存存放于内存中,并通过缩短缓存失效时间等措施减少缓存不一致的情况发生,但并不能做到完全杜绝,因此不得不提示用户进行等待,直到缓存过期后数据恢复正常。并且,缓存失效时间设置地过短也会导致缓存的作用降低。

发明内容

本发明的目的在于提供一种K8s环境下基于grpc的缓存同步实现方法及系统,以解决上述背景技术中提出的问题。

为实现上述目的,本发明提供如下技术方案:一种K8s环境下基于grpc的缓存同步实现方法,该方法包括以下步骤:

节点对应K8s环境中一个Deployment或StatefulSet所管理的每一个Pod;

节点之间进行缓存更新的同步;

获取到集群中所有节点的IP后,对节点信息进行整理,并保存到节点的内存中;

选用grpc作为集群内节点间通信的方式进行缓存。

优选的,节点之间进行缓存更新的同步时,采用K8s apiserver,

该方案为程序添加如下配置项:

Pod标签:值为该程序部署时所指定的K8s Pod标签;

Pod UID:通过K8s提供的Downward API获取Pod自身的UID;

在程序运行时,以Pod标签为筛选条件,调用K8s apiserver提供的Restful接口,查询处于运行状态下的所有Pod,获取其IP地址,Pod UID用于判别查询到的Pod是否为自身。

优选的,节点之间进行缓存更新的同步时,采用K8s headless service;

首先,为程序添加如下配置项:

Pod自身IP:通过K8s提供的Downward API获取Pod自身的IP;

然后,为程序创建headless service用于节点间通信,通过将service的ClusterIP设置为None,即可将其转换为headless service,需要注意,该headlessservice仅用于集群间通信,不对外提供服务;

在程序运行时,对headless service的域名进行DNS解析,获取Pod IP列表,“Pod自身IP”配置项用于判别查询到的Pod是否为自身。

优选的,节点信息包括以下内容:

节点IP:通过集群感知机制获取;

端口号:节点间通信所使用的端口号,可使用固定端口号,或从配置文件读取;

是否为自身节点:通过“Pod UID”或“Pod自身IP”判别该节点是否为自身节点;

其中,当节点为自身节点时,直接通过程序内部的方法调用进行缓存更新,否则通过grpc进行远程更新。

优选的,缓存的操作分为以下步骤:

a)从数据库中读取数据,并存放于缓存中;

b)当缓存中存在所需数据时,读取缓存,否则读取数据库,并将其存放于缓存中;

c)执行业务逻辑,数据发生变化,更新数据库,同时更新缓存。这里的数据变化包括创建新数据、更新已有数据、删除已有数据;

d)超过过期时间后,数据被标记为过期,无法再被读取。

一种K8s环境下基于grpc的缓存同步实现系统,该系统由术语定义模块、集群感知模块、节点注册模块以及缓存同步模块构成;

术语定义模块,用于节点对应K8s环境中一个Deployment或StatefulSet所管理的每一个Pod;

集群感知模块,用于节点之间进行缓存更新的同步;采用K8s headless service;首先,为程序添加如下配置项:Pod自身IP:通过K8s提供的Downward API获取Pod自身的IP;

然后,为程序创建headless service用于节点间通信,通过将service的ClusterIP设置为None,即可将其转换为headless service,需要注意,该headlessservice仅用于集群间通信,不对外提供服务;

在程序运行时,对headless service的域名进行DNS解析,获取Pod IP列表,“Pod自身IP”配置项用于判别查询到的Pod是否为自身;

节点注册模块,用于获取到集群中所有节点的IP后,对节点信息进行整理,并保存到节点的内存中;

缓存同步模块,用于选用grpc作为集群内节点间通信的方式进行缓存。

优选的,所述集群感知模块中,采用K8s apiserver,

该方案为程序添加如下配置项:

Pod标签:值为该程序部署时所指定的K8s Pod标签;

Pod UID:通过K8s提供的Downward API获取Pod自身的UID;

在程序运行时,以Pod标签为筛选条件,调用K8s apiserver提供的Restful接口,查询处于运行状态下的所有Pod,获取其IP地址,Pod UID用于判别查询到的Pod是否为自身。

优选的,所述集群感知模块中,采用K8s headless service;

首先,为程序添加如下配置项:

Pod自身IP:通过K8s提供的Downward API获取Pod自身的IP;

然后,为程序创建headless service用于节点间通信,通过将service的ClusterIP设置为None,即可将其转换为headless service,需要注意,该headlessservice仅用于集群间通信,不对外提供服务;

在程序运行时,对headless service的域名进行DNS解析,获取Pod IP列表,“Pod自身IP”配置项用于判别查询到的Pod是否为自身。

优选的,所述节点注册模块中,节点信息包括以下内容:

节点IP:通过集群感知机制获取;

端口号:节点间通信所使用的端口号,可使用固定端口号,或从配置文件读取;

是否为自身节点:通过“Pod UID”或“Pod自身IP”判别该节点是否为自身节点;

其中,当节点为自身节点时,直接通过程序内部的方法调用进行缓存更新,否则通过grpc进行远程更新。

优选的,所述缓存同步模块中,缓存的操作分为以下步骤:

a)从数据库中读取数据,并存放于缓存中;

b)当缓存中存在所需数据时,读取缓存,否则读取数据库,并将其存放于缓存中;

c)执行业务逻辑,数据发生变化,更新数据库,同时更新缓存。这里的数据变化包括创建新数据、更新已有数据、删除已有数据;

d)超过过期时间后,数据被标记为过期,无法再被读取。

与现有技术相比,本发明的有益效果是:

本发明提出的K8s环境下基于grpc的缓存同步实现方法及系统相对于普通的内存缓存方式,该发明能使多副本程序内存中的缓存得到实时更新,有效解决缓存数据不一致的问题,同时不依赖外部缓存系统。因此,如果程序运行于K8s环境中,且需要通过缓存来提供程序运行效率,同时因为环境等因素无法使用外部缓存系统的情况下,可采用该发明提供的缓存同步方法,以提高程序的数据一致性。

附图说明

图1为本发明方法流程图。

具体实施方式

为了使本发明的目的、技术方案进行清楚、完整地描述,及优点更加清楚明白,以下结合附图对本发明实施例进行进一步详细说明。应当理解,此处所描述的具体实施例是本发明一部分实施例,而不是全部的实施例,仅仅用以解释本发明实施例,并不用于限定本发明实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

实施例一

请参阅图1,本发明提供一种技术方案:一种K8s环境下基于grpc的缓存同步实现方法,该方法包括以下步骤:

1)术语定义:

为更加清晰地描述该方法的实现步骤,这里对方法中使用的部分名词术语进行解释。

a)节点:程序的每一个副本被称作节点,运行着相同的代码。对应K8s环境中一个Deployment或StatefulSet所管理的每一个Pod。

其中,Pod是指容器组,一个Pod中通常运行一个业务程序;Deployment是指无状态负载,Pod之间相互独立,提供完全相同的功能;StatefulSet是指有状态负载,Pod之间不完全独立,各个Pod维持各自不同的状态。

需要注意,本文所定义的节点概念对应着K8s中的Pod,而不是Node。

b)集群:多个节点组成的集合被称作集群。集群中的节点能感知到其他节点的存在并进行通信。

2)集群感知:

由于节点之间需要进行缓存更新的同步,这需要节点可以感知到其他节点的存在,并且相互之间可以进行通信。由于程序运行于K8s中,该方案通过K8s提供的集群感知功能获取集群内各节点的IP地址,通过IP地址进行节点间通信。可根据需要采取以下几种不同的通信方案:

a)方案一:K8s apiserver。

该方案需要为程序添加如下配置项:

Pod标签:值为该程序部署时所指定的K8s Pod标签。

Pod UID:通过K8s提供的Downward API获取Pod自身的UID。

在程序运行时,以Pod标签为筛选条件,调用K8s apiserver提供的Restful接口,查询处于运行状态下的所有Pod,获取其IP地址。Pod UID用于判别查询到的Pod是否为自身。

b)方案二:K8s headless service。

首先,为程序添加如下配置项:

Pod自身IP:通过K8s提供的Downward API获取Pod自身的IP。

然后,为程序创建headless service用于节点间通信。通过将service的ClusterIP设置为None,即可将其转换为headless service。需要注意,该headlessservice仅用于集群间通信,不对外提供服务。

在程序运行时,对headless service的域名进行DNS解析,获取Pod IP列表。“Pod自身IP”配置项用于判别查询到的Pod是否为自身。

3)节点注册:

在获取到集群中所有节点的IP后,需要对这些信息进行整理,并保存到节点的内存中,即对节点进行注册。存储节点信息的数据结构可采用列表。节点信息需要包括以下内容:

节点IP:通过集群感知机制获取。

端口号:节点间通信所使用的端口号,可使用固定端口号,或从配置文件读取。

是否为自身节点:通过“Pod UID”或“Pod自身IP”判别该节点是否为自身节点。

其中,当节点为自身节点时,直接通过程序内部的方法调用进行缓存更新,否则通过grpc进行远程更新。

由于上一步提到的集群感知机制都是主动拉取的形式,因此,当节点的数目发生变化时,无法实时地更新节点信息。所以需要定时执行拉取操作。可将定时周期设置为5秒。

4)缓存同步:

该发明选用grpc作为集群内节点间通信的方式,相对于Http Rest API的通信方式,grpc具有性能好、效率高等优点,可在一定程度上降低节点间的通信时延。使用grpc时需要指定端口,即“节点注册”步骤中提到的端口号。

在业务场景中,缓存的操作通常分为以下步骤:

a)从数据库中读取数据,并存放于缓存中;

b)当缓存中存在所需数据时,读取缓存,否则读取数据库,并将其存放于缓存中;

c)执行业务逻辑,数据发生变化,更新数据库,同时更新缓存。这里的数据变化包括创建新数据、更新已有数据、删除已有数据;

d)超过过期时间后,数据被标记为过期,无法再被读取。

该方案需要解决的问题出现在步骤c),因此以下内容仅针对步骤c)所涉及的操作进行处理。由于更新其他节点的缓存时,需要通过grpc进行更新,所消耗的时间远大于更新节点自身内存中缓存的时间,因此需要尽量减少grpc更新的次数。步骤a)、b)、d)并不涉及数据的变化,因此无需同步各个节点缓存的数据。

在数据发生变化后,遍历“节点注册”中保存的集群内所有节点的信息,对于自身节点,直接通过方法调用的形式更新缓存,对于非自身节点的其他节点,调用grpc接口更新缓存,在接口传参中,除了被更新的数据以外,还需要指定操作的类型,如新增、修改、删除。

由于节点信息是通过主动拉取的形式更新的,存在短时间的延迟。当节点信息发生变化时,对于新增的节点,在下一次更新节点信息之前,新增节点的缓存将无法得到更新;对于停止运行或者异常的节点,缓存也无法进行更新,但由于该节点也无法对外提供服务,因此不会存在数据不一致的问题。综上所述,该发明实际上也并不能保证完全的缓存一致性,但由于节点的新增仅发生于Pod扩容、Pod重启等场景,属于极少发生的场景,因此该发明相对于普通的内存缓存仍具有较大优势。

实施例二

一种K8s环境下基于grpc的缓存同步实现系统,该系统由术语定义模块、集群感知模块、节点注册模块以及缓存同步模块构成;

术语定义模块,用于节点对应K8s环境中一个Deployment或StatefulSet所管理的每一个Pod;

集群感知模块,用于节点之间进行缓存更新的同步;采用K8s apiserver,

该方案为程序添加如下配置项:Pod标签:值为该程序部署时所指定的K8s Pod标签;Pod UID:通过K8s提供的Downward API获取Pod自身的UID;在程序运行时,以Pod标签为筛选条件,调用K8s apiserver提供的Restful接口,查询处于运行状态下的所有Pod,获取其IP地址,Pod UID用于判别查询到的Pod是否为自身;

节点注册模块,用于获取到集群中所有节点的IP后,对节点信息进行整理,并保存到节点的内存中;节点信息包括以下内容:节点IP:通过集群感知机制获取;端口号:节点间通信所使用的端口号,可使用固定端口号,或从配置文件读取;是否为自身节点:通过“PodUID”或“Pod自身IP”判别该节点是否为自身节点;其中,当节点为自身节点时,直接通过程序内部的方法调用进行缓存更新,否则通过grpc进行远程更新

缓存同步模块,用于选用grpc作为集群内节点间通信的方式进行缓存;缓存的操作分为以下步骤:a)从数据库中读取数据,并存放于缓存中;b)当缓存中存在所需数据时,读取缓存,否则读取数据库,并将其存放于缓存中;c)执行业务逻辑,数据发生变化,更新数据库,同时更新缓存。这里的数据变化包括创建新数据、更新已有数据、删除已有数据;d)超过过期时间后,数据被标记为过期,无法再被读取。

实施例三

一种K8s环境下基于grpc的缓存同步实现系统,该系统由术语定义模块、集群感知模块、节点注册模块以及缓存同步模块构成;

术语定义模块,用于节点对应K8s环境中一个Deployment或StatefulSet所管理的每一个Pod;

集群感知模块,用于节点之间进行缓存更新的同步;采用K8s headless service;首先,为程序添加如下配置项:Pod自身IP:通过K8s提供的Downward API获取Pod自身的IP;然后,为程序创建headless service用于节点间通信,通过将service的ClusterIP设置为None,即可将其转换为headless service,需要注意,该headless service仅用于集群间通信,不对外提供服务;在程序运行时,对headless service的域名进行DNS解析,获取Pod IP列表,“Pod自身IP”配置项用于判别查询到的Pod是否为自身;

节点注册模块,用于获取到集群中所有节点的IP后,对节点信息进行整理,并保存到节点的内存中;节点信息包括以下内容:节点IP:通过集群感知机制获取;端口号:节点间通信所使用的端口号,可使用固定端口号,或从配置文件读取;是否为自身节点:通过“PodUID”或“Pod自身IP”判别该节点是否为自身节点;其中,当节点为自身节点时,直接通过程序内部的方法调用进行缓存更新,否则通过grpc进行远程更新

缓存同步模块,用于选用grpc作为集群内节点间通信的方式进行缓存;缓存的操作分为以下步骤:a)从数据库中读取数据,并存放于缓存中;b)当缓存中存在所需数据时,读取缓存,否则读取数据库,并将其存放于缓存中;c)执行业务逻辑,数据发生变化,更新数据库,同时更新缓存。这里的数据变化包括创建新数据、更新已有数据、删除已有数据;d)超过过期时间后,数据被标记为过期,无法再被读取。

尽管已经示出和描述了本发明的实施例,对于本领域的普通技术人员而言,可以理解在不脱离本发明的原理和精神的情况下可以对这些实施例进行多种变化、修改、替换和变型,本发明的范围由所附权利要求及其等同物限定。

相关技术
  • 一种基于交互缓存技术的数据采集和主动同步组帧系统
  • 一种基于图形化编程平台实现同步云变量的方法及其系统
  • 一种基于触发器的表级双向同步实现方法和系统
  • 一种K8S环境下的API网关服务高可用实现方法
  • 一种K8S环境下的API网关服务高可用实现方法
技术分类

06120115597573