熟悉Trino 的同学应该都知道Trino新增、删除 catalog 都需要重启集群,这个生产环境里如果需要频繁增加数据源的场景是非常不友好的操作。
    网上关于动态加载Catalog的方案有一些,但是在Trino比较新的版本里面已经无法适用。 目前官方关于这个功能一直都没有完成,详细issue  Dynamic Catalogs #12709。 详细阅读了这个issue里面的讨论,有2个推送虽然没有被官方确认合并,但这2个推送给我了改造思路,目前推送的都是半成品,所以想要完整的实现还需要自己修改源代码实现一部分功能。
 
     相关推送:JDBC  RESTFUL API

改造思路:

    1.catalog 统一维护存储 如 Database、Zoopkeeper、中间件 等。
    2.增加Restful API 接口来统一管理 管理 catalog目录
    3.集群重启、node节点单独重启,能加载到最新catalog目录。

具体实现:

   1.选择数据库来实现,方便跟公司程序集成。      
   2.按照2个github的推送,实现Database 跟 Restful 接口开发。(这部分不赘述,照着推送的代码实现就行,重点是后面的修改思路)
   3.第1步完成后,会发现遇到的问题

①启动后只有Coordinator节点能够正常的加载catalog目录,node节点启动的时候无法加载catalog目录。

这部分是因为 官方的DynamicCatalogManagerModule 功能并不完整,只实现了Coordinator的部分的功能,下面的Worker的加载功能并没有实现,这部分需要新增Worker加载Catalog目录功能、以及实现CatalogManager接口。

                  ②Restful Api接口来新增catalog时候,Worker节点没有成功加载catalog
           这个是我实现过程中花了时间最长,但是又最不需要修改的地方。网上有方案修改 DiscoveryNodeManager在检测心跳的时候去新增这个Catalog,但是我测试了下在比较新的Trino版本并没有作用。
           另外的做定时刷新,这个可能是有用,但是并不符合我的想法,我想只有在新增的catalog时API接口触发下就行,而且立马就可以用,不需要等刷新时间。
                         
       实现方案:其实ServerMainModule里注入了RestfulAPI后,就相当于Coordinator 跟 Worker 都实现了这些API,并不是只有Coordinator才有这些功能,所以这一步只要通过/v1/node 获取到所有的node节点,
       通过对应的地址去注册Catalog就行,根本就不需要去做多余的额外实现。(为了这个不需要修改的功能搞了2个星期,最后发现不需要改也能实现,崩溃。。。。。)

实践效果:

1.获取node节点

2.新增catalog

Coordinator:

Worker:

不需要重启查询:

删除某个catalog:

到这里基本就完成了不重启自动加载Catalog目录的功能,但是仍然有一点小问题,经过测试同样名称的catalog新增后删除后,再新增仍然使用同样的名称跟连接器,会导致跟前面加载进去的同名连接器冲突,但是这个可以让程序上就源头上规避掉,使用过的catalog名称就不然再使用。在数据库里面把名称设为主键,删除catalog只修改状态不删除记录。

目前这个是我实现的方案,如果有更好的想法老铁欢迎留言一起交流,关于Coordinator同步了能自动同步到Worker节点的功能,网上关于这个修改的资料比较少。

Trino418版本动态加载catalog不需要重启集群修改思路及实现的更多相关文章

  1. Android中插件开发篇之----动态加载Activity(免安装运行程序)

    一.前言 又到周末了,时间过的很快,今天我们来看一下Android中插件开发篇的最后一篇文章的内容:动态加载Activity(免安装运行程序),在上一篇文章中说道了,如何动态加载资源(应用换肤原理解析 ...

  2. 插件化开发—动态加载技术加载已安装和未安装的apk

    首先引入一个概念,动态加载技术是什么?为什么要引入动态加载?它有什么好处呢?首先要明白这几个问题,我们先从 应用程序入手,大家都知道在Android App中,一个应用程序dex文件的方法数最大不能超 ...

  3. js动态加载activeX控件在IE11与低版本IE中的差异

    由于IE11更加遵循W3C规范,所以IE11与低版本IE在加载activeX时有差别. 1.IE11中动态加载activeX的顺序 var objectTag = document.createEle ...

  4. geotrellis使用(二十三)动态加载时间序列数据

    目录 前言 实现方法 总结 一.前言        今天要介绍的绝对是华丽的干货.比如我们从互联网上下载到了一系列(每天或者月平均等)的MODIS数据,我们怎么能够对比同一区域不同时间的数据情况,采用 ...

  5. Unity Lightmap动态加载研究

    什么情况下需要Lightmap? 移动平台上目前暂时还不能开实时光影效果,会卡成幻灯片.所以就需要将光影烘焙到贴图上. 什么情况下需要动态加载Lightmap? 1.当项目抛弃了Unity的多场景模式 ...

  6. 关于实现Extjs动态加载类的方式实现

    Extjs4以前的版本没有动态加载类的方式,这样开发程序的时候加载很多的js会导致加载变慢,由于本人一直使用extjs3的版本进行开发,于是简单实现了一个动态加载类的管理器,使用方式与extjs4的方 ...

  7. 会员管理系统的设计和开发(2)-- RDLC报表的设计及动态加载

    在上篇<会员管理系统的设计和开发(1)>介绍了关于会员系统的一些总体设计思路和要点,经过一段时间开发,软件终于完成并发布.在这期间,碰到了不少技术难点,并积累了不少开发心得和经验,本篇继续 ...

  8. js的动态加载、缓存、更新以及复用(四)

    本来想一气呵成,把加载的过程都写了,但是卡着呢,所以只好在分成两份了. 1.页面里使用<script>来加载 boot.js . 2.然后在boot.js里面动态加载 bootLoad.j ...

  9. Java_动态加载

    Java类动态加载(一)——java源文件动态编译为class文件最近在做java动态加载这方面的工作,起初也遇到了很多困难.网上关于这方便的东西很零散,为了便于日后回过头来再看,于是我将这几天的心得 ...

  10. APK动态加载框架(DL)解析

    转载请注明出处:http://blog.csdn.net/singwhatiwanna/article/details/39937639 (来自singwhatiwanna的csdn博客) 前言 好久 ...

随机推荐

  1. vue全家桶进阶之路40:Vue3父件传值给子件

    在Vue3中,可以通过props将父组件的数据传递给子组件.具体步骤如下: 在父组件中定义要传递给子组件的数据,可以是data属性中的数据或者是计算属性computed中的数据. 在子组件中通过pro ...

  2. PictureBox保存图片照片到数据库

    Private Sub PAPHOTO_SAVE() Try If TxtPictureURL.Text.ToString <> "" Then Dim SQL_Str ...

  3. Netty实战(一)

    目录 第一章 Java网络编程 1.1 Java NIO 1.2 选择器 第二章 Netty是什么 2.1 Netty简介 2.2 Netty的特性 2.2.1 设计 2.2.2 易于使用 2.2.3 ...

  4. .Net使用第三方onnx或ModelBuilder轻松接入AI模型

    ML.Net - 开源的跨平台机器学习框架 支持CPU/GPU训练 轻松简洁的预测代码 可扩展其他的机器学习平台 跨平台 1.使用Visual Studio的Model Builder训练和使用模型 ...

  5. Github疯传!200本计算机经典书籍!

    好书在精不在多,每一本经典书籍都值得反复翻阅,温故而知新! 下面分享几本计算机经典书籍,都是我自己看过的. 重构 改善既有代码的设计 就像豆瓣评论所说的,看后有种醍醐灌顶.欲罢不能的感觉.无论你是初学 ...

  6. 通过实例了解vue3.3更新的特征

    开场白 5月份,vue团队发布了 vue3.3. 这次小版本的发布主要解决了-- Vue 与 TypeScript 一起使用时的许多长期存在的痛点. 下面我们一起来学习一下vue3.3新特征 准备新新 ...

  7. 2023-06-02:给定一个二进制数组 nums 和一个整数 k, k位翻转 就是从 nums 中选择一个长度为 k 的 子数组, 同时把子数组中的每一个 0 都改成 1 ,把子数组中的每一个 1

    2023-06-02:给定一个二进制数组 nums 和一个整数 k, k位翻转 就是从 nums 中选择一个长度为 k 的 子数组, 同时把子数组中的每一个 0 都改成 1 ,把子数组中的每一个 1 ...

  8. 在R中子集化数据框的5种方法

    由于微信不允许外部链接,你需要点击文章尾部左下角的 "阅读原文",才能访问文中链接. 通常,我们在使用大型数据集时,只会对其中的一小部分感兴趣,用以进行特定分析. 那么,我们应该如 ...

  9. Python socket记录

    目录 网络编程 1.基本概念 Python中的网络编程 网络编程 1.基本概念 1.什么是客户端/服务器架构? 服务器就是一系列硬件或软件,为一个或多个客户端(服务的用户)提供所需的"服务& ...

  10. 旧版Vue配置API_ROOT,开发、生产地址切换

    1 目录 config/dev.env.js1 'use strict' 2 const merge = require('webpack-merge') 3 const prodEnv = requ ...