iT邦幫忙

0

「相容 MySQL 協議」的引擎,你們是怎麼做能力偵測的?我們試了 42 種,結論有點慘

  • 分享至 

  • xImage

上次在這裡問多語系 README 的問題,得到不少實用的回覆,謝謝各位。這次想問一個更技術的,我們內部卡了一陣子。

先說身分,免得被當成來打廣告的:我是一個 MIT 授權開源資料庫工具的維護者之一。下面的數字都是連真實實例跑出來的,不是抄文件。

問題

我們寫了 16 個驅動,實際連上 42 種資料庫。其中 26 種沒有自己的驅動,是借別人的通訊協議進來的——最常見的就是「相容 MySQL 協議」。

問題是:協議相容,不等於行為相容。 而且不相容的地方常常「看起來正常」,這才是最麻煩的。

舉幾個我們實際踩到的:

  • StarRocksversion() 回傳 5.1.0,一個不存在的 MySQL 版本。真實建號只在 current_version() 裡。Apache Doris5.7.99,而且它連 current_version() 都沒有,真實版本只在 @@version_comment
  • Apache Doris 的語法裡 SHOW STATUS LIKE '...' 直接解析錯誤(mismatched input 'LIKE'),但不帶 LIKE 的裸 SHOW STATUS 是接受的,只是回零行。
  • StarRocks 沒有 information_schema.PROCESSLIST 這張表。
  • Doris 和 StarRocksinformation_schema.statistics 永遠是空的,索引一個都報不出來,即使索引確實建了。
  • Doris 的外鍵被接受、SHOW CONSTRAINTS 也列得出來,但 KEY_COLUMN_USAGE 是 0 行,而且約束根本不生效——我們插了一筆引用不存在客戶的訂單,插進去了。
  • StarRocks 對每張 BASE TABLEINDEX_LENGTH 回 NULL,於是 DATA_LENGTH + INDEX_LENGTH 整個被 NULL 汙染。
  • Vitess 的行數和體積精確到位元組,挑不出毛病,但 vtgate 拒絕 KILL QUERY,跑著的查詢殺不掉。

同一類的:EXPLAIN 在 MySQL 系裡至少三種寫法(EXPLAINEXPLAIN FORMAT=JSONEXPLAIN JSON),Doris 和 StarRocks 的 JSON 版都解析不過。

也得說我們自己寫錯的地方

不是全部都是人家的問題,至少兩處是我們的:

  1. 我們所有語句一律走 mysql2execute()(二進位 prepared 協議),包括沒參數的。SHOWEXPLAIN 這類在不少相容引擎的 prepared 協議裡沒實作,於是 SingleStore 掛了四個功能、StarRocks 掛了兩個。改成沒參數的走文字協議就全好了。
  2. 上面 StarRocks 的 NULL 那條,我們在 SQL 裡直接寫兩欄相加,沒加 COALESCE不是它先報零,是我們自己把能讀到的也弄沒了。

想問的

我們現在的做法是:在連線建立的當下做一輪能力偵測,把「這台伺服器接受哪種 EXPLAIN 寫法」「有沒有 PROCESSLIST」這類問題先問清楚,再按結果決定後面怎麼發。不寫死一種語法然後在出錯分支裡猜。

但這樣連線會變慢,而且偵測本身也要維護。

想聽聽各位的做法:

  1. 你們是連線時偵測,還是出錯後降級?各自踩過什麼坑?
  2. 「缺少這個指標」和「這個指標是 0」,你們在介面上怎麼區分?我們後來把前者改成明確的「未發布」,不再填 0——因為 Garnet 的快取命中率永遠顯示 100%,原因是它根本不發布 keyspace 計數器,分母是 0。
  3. 有沒有人做過跨引擎的相容性矩陣,而且能撐得住版本更新的?我們現在是每個版本重測一遍,很花時間。

上面每條都標了測試時的版本,換個版本結論可能就不一樣了。如果哪一條和各位的實測對不上,很想知道。

圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友回答

立即登入回答