Trino418版本动态加载catalog不需要重启集群修改思路及实现2
原来没事的时候改了一个这样的功能,当时也没有仔细研究,后来也没继续弄。详细可以参考 https://www.cnblogs.com/liuzx8888/p/17635913.html
当时有2个问题:新增数据源需要每一个节点都去调取API注册跟数据源注册过了删除Catalog后再新增一模一样的就会提示Catalog存在,这样非常麻烦,最近闲下来又研究了一下,在原先的基础上做了一些改造。
具体流程:
主要的修改思路:
1.CoordinatorDynamicCatalogManager 跟 WorkerDynamicCatalogManager 都在实现具体的Catalog的新增、删除功能,2者的功能要保持一致,让Worker 跟 Coordinator有一样的功能
2.API同时需要在Coordinator 跟Worker 同时注入,API的功能就参考上一篇文章的,Github 2个推送
3.参考CatalogPruneTask实现WorkerCatalogSyncTask,实现通知Worker的功能
4.Coordinator 负责数据库Status操作与本身的Catalog的新增、删除操作,Worker对应的操作都是通过上面自己开发的API来完成
具体的一些代码实现截图给大家参考下,前前后后调试了很多,写的有点乱,总之就是让Worker跟Coordinator有一样的API功能注入,通过Coordinator控制流程实现
1.在CatalogManager 接口里面新增新增、删除Catalog方法,WorkerDynamicCatalogManager、CoordinatorDynamicCatalogManager 实现具体的方法
2. 让Worker 跟 Coordinator 一样有加载catalog目录的功能,把WorkerDynamicCatalogManager 跟 CoordinatorDynamicCatalogManager 不一样的地方实现一下,参考CoordinatorDynamicCatalogManager就行,
3. 把Worker跟Coordinator 一样的服务启动的时候注入,让Worker跟Coordinator有一样的功能,不然Worker初始化不会自动加载Catalog、和新增、删除Catalog的功能
4.WorkerCatalogSyncTask,参考CatalogPruneTask ,只要API的部分改造完成,这个地方就很好弄了,仿照一个就可以自动固定时间去访问各个Worker节点的API信息进行注册,这样就只需要跟Coordinator 通信就可以了
实践效果:
定时获取是否有新增的Catalog
API注册
Coordinator:数据库会捕获到新增了1个Catalog,Worker注册完,数量从1变成0
Worker:新增了相同的Catalog
删除Catalog
Coordinator:
Worker:
再次新增一模一样的Catalog,不会再报Catalog已经存在
Coordinator:
Worker:
这样就能完成了动态加载catalog不重启集群同时还能随意的增加、修改、删除Catalog的功能。在上次的基础上解决了2个遗留问题,其实跟一些老铁做的定时刷新一个原理,欢迎有想法的老铁一起交流。