Pulsar-SQL 是一個非常有用的功能,只是我們使用過程中確實發現了一些問題,大部分都已經修復了;希望對后續使用該功能的朋友有所幫助。
背景
為了讓業務團隊可以更好的跟蹤自己消息的生產和消費狀態,需要一個類似于表格視圖的消息列表,用戶可以直觀的看到發送的消息;同時點擊詳情后也能查到消息的整個軌跡。
消息列表
點擊詳情后查看軌跡
原理介紹
由于 Pulsar 并沒有關系型數據庫中表的概念,所有的數據都是存儲在 Bookkeeper 中,為了模擬使用 SQL 查詢的效果 Pulsar 提供了 Presto (現在已經更名為 Trino)的插件。
Trino 是一個分布式的 SQL 查詢引擎,它也提供了插件能力,如果我們想通過 SQL 從自定義數據源查詢數據時,基于它的 SPI 編寫一個插件是很方便的。
這樣便可以類似于查詢數據庫一樣查詢 Pulsar 數據:
Pulsar 插件的運行流程如上圖所示:
- 啟動的時候通過 Pulsar-Admin 接口獲取一些元數據,比如 Scheme,topic 分區信息等。
- 然后會創建一個只讀的 Bookkeeper 客戶端,用于獲取數據。
- 之后根據 SQL 條件過濾數據即可。
相關代碼:
使用 Pulsar-SQL
使用起來也很簡單,官方提供了兩個命令:
- sql-worker: 會啟動一個 trino 服務端同時運行了 Pulsar 插件.
- sql: 就是一個 SQL 命令行終端。
遇到的問題
自己在本地運行的時候自然是沒問題,可是一旦想在生產運行,同時如果你的 Pulsar 集群是運行再 k8s 環境中時就會碰到一些問題。
無法使用現有 Trino 集群
首先第一個問題是如果生產環境已經有了一個 Trino 集群想要復用的時候就會碰到問題,常規流程是將 Pulsar 的插件復制到 Trino 的 Plugin 目錄,然后重啟 Trino 后就能使用該插件。
當然社區也是支持這么做的:
但是當我將 Pulsar-plugin 復制到 Trino 中運行的時候卻失敗了,整體的流程可以參考這個 issue:https://Github.com/Apache/pulsar/discussions/20941
簡單來說 Trino 的官方鏡像和 pulsar-plugin 并不能兼容,這個問題直接影響到我們是否可以在生產環境使用它。
但是手動編譯出來的 Trino 服務和插件是兼容的,可以直接運行。
因此我只能在本地編譯出 Trino 服務端和 pulsar-plugin 然后打包成一個鏡像來運行了,當然這樣的壞處就是無法利用到我們現有的 Trino 集群,又得重新部署一個了。
流程也比較麻煩:
- 首先是本地編譯 Pulsar-SQL 模塊
- 將生成物復制到當前目錄
- 執行 make Docker 打出 docker 鏡像并上傳到私服
- 再執行 kubectl 將 trino 部署到 k8s 環境中
整個流程做下來加上和社區的溝通,更加確定這個功能應該是很少有人在生產環境使用的,畢竟第一個坑就很麻煩,更別提后續的問題了