原来在空闲时改进了一个功能,但没有深入研究,后来也没有继续进行。详细内容请参考 这里 。
当时遇到一个问题:新增数据源需要每个节点都调用API进行注册,这样非常麻烦。最近有空闲时间,我重新研究了一下,在原有基础上做了一些改进。
具体流程如下:
具体流程如下:
1. 新增注册、删除 Catalog 需要的一些 API 接口对外提供服务。
2. 通过 Coordinator 节点的 API 注册新的数据源,同时将相关的数据源信息保存到数据库,状态为 Status=2。
3. 新增 WorkerCatalogSyncTask,Worker 节点同步功能,参考了 Trino 里的 CatalogPruneTask 功能,通过 Coordinator 定时任务捕获到新增数据源 [Status=2] ,通知所有的 Worker 节点进行注册。
4. 所有的 Worker 注册完毕后,修改数据源状态为 0。
5. 让 Worker 节点启动时也能像 Coordinator 一样加载有数据源的功能【DynamicCatalogManageMoudle 模式、文件模式本来就可以加载的】。
这样的改进好处是所有的 Catalog 存储在数据库中不容易丢失,无论哪个节点失败了或者新增节点都能从数据库获取到最近的 Catalog 目录,保证每个节点的 Catalog 都是最新的。
具体的一些代码实现截图给大家参考下,前前后后调试了很多,写的有点乱。
这些具体的可以参照前面的文章,GitHub 2个推送已经实现了基本的功能,我这里截图我自己实现的一部分:
1. 让 Worker 跟 Coordinator 一样有加载 catalog 目录的功能,新增 WorkerDynamicCatalogManager 这个参考 CoordinatorDynamicCatalogManager 实现,基本一样,把 Worker 跟 Coordinator 一样的服务启动的时候注入,让 Worker 跟 Coordinator 有一样的功能,不然 Worker 初始化不会自动加载数据源。
2. WorkerCatalogSyncTask,参考 CatalogPruneTask,只要 API 的部分改造完成,这个地方就很好弄了,仿照一个就可以自动固定时间去访问各个 Worker 节点的 API 信息进行注册,这样就只需要跟 Coordinator 通信就可以了。
实践效果:
定时获取是否有新增的数据源
API 注册
Coordinator:数据库会捕获到新增了1个 Catalog,Worker 注册完,数量从1变成0
Worker:新增了相同的 Catalog