Nacos Naming源码分析(一)- 持久化存储

Nacos主要包括两个核心服务 - config & naming。config主要用来托管应用配置,naming用作服务发现。Nacos Naming服务引入了一种Service - Cluster - Instance的数据结构模型,用来存储服务的元信息。在Naming服务中实际来存储service/cluster/instance数据的底层实现被抽象成了ConsistencyService接口。

Naming服务支持两种类型的数据存储:临时和永久数据。永久数据一旦创建之后会一直存在,除非显式删除;临时数据创建之后和所有者的生命周期绑定,需要创建者不断发送心跳信息来保证数据的有效性。

这两种数据类型在代码上表现为ConsistencyService接口的两种实现,如下图:

Nacos Naming源码分析(一)- 持久化存储_第1张图片

 

RaftConsistencyServiceImpl类提供的是基于Raft协议的永久数据存储方案。nacos naming服务内部实现了一个简化的raft协议。每个节点通过本地文件系统保存所有数据,通过raft协议选择leader并同步数据。raft协议通过保证数据在各naming节点的一致性来保证naming服务的高可用。

DistroConsistencyServiceImpl用于存储临时数据。由于nacos的临时数据需要通过创建者不断得发送心跳数据来保活,因此在存储上反而比较简单。naming服务并不会在文件系统或者数据库中持久化存储临时数据,它通过心跳包来保证数据的有效性。

naming服务使用一种“分区”算法来管理临时数据。它把所有数据分为若干个block,每个naming节点只负责一个block内数据的创建/删除/同步。通过数据同步,每个naming node最终都会持有完整的数据集合。

最终DelegateConsistencyServiceImpl类同时持有RaftConsistencyServiceImpl和DistroConsistencyServiceImpl两个实例,通过每个数据key的格式来判断最终存储的类型。

 

转载于:https://my.oschina.net/zhuhui/blog/3085326

你可能感兴趣的:(Nacos Naming源码分析(一)- 持久化存储)