分散式 | dble後設資料更新同步

愛可生雲資料庫發表於2021-10-22

作者:吳金玲

愛可生 dble 專案團隊成員,主要負責 dble 相關的日常測試工作,擅長對 dble 中出現的問題進行排查。熱愛測試工作,餘生欲將測試工作進行到底。

本文來源:原創投稿

*愛可生開源社群出品,原創內容未經授權不得隨意使用,轉載請聯絡小編並註明來源。


同步後設資料,reload @@config_all or reload @@metadata ?

一、本文以 dble 3.21.06.0 版本為例,首先讓我們來看看社群經常遇到的幾類找不到表或者表欄位的問題
sharding.xml的關鍵配置如下:

問題1:啟動 dble 後,在所有後端節點都建立了表 sharding_2_t1 ,然後在 dble 管理端執行 reload @@config_all 命令,查詢表 sharding_2_t1 資料及向表 sharding_2_t1 中插入資料,均報找不到表的 metadata 資訊(如下圖所示),為什麼?

問題2:在後端節點對錶 sharding_4_t1 增加一個 age 欄位,且已確保所有後端節點都增加了這個欄位,然後執行 reload @@config_all ,對錶進行查詢使用新增的欄位沒問題,但使用 order by 就提示找不到這個欄位(如下圖所示),為什麼?

二、在回答出現以上問題的原因之前,首先讓我們來看看 reload @@config_all 和 reload @@metadata 的使用說明(具體可參見 dble 官方文件:https://github.com/actiontech...),這樣能夠使我們更好的理解問題

1.reload @@config_all(2.19.09.0 版本之後功能完全等同於reload @@config )

重新載入所有配置,涉及3個 xml 配置檔案( user.xml,db.xml,sharding.xml ),同時 reload @@config_all 還有3個可選引數的形式:reload @@config_all [-s] [-f] [-r];

-s 跳過測試後端連結,預設不加此引數會對配置中的後端連結進行測試,測試失敗將返回 ERROR ;

-f 關閉所有變更的 dbGroup(同時加-r引數則所有 dbGroup 都會被視為變更)相關的處於事務中的前端連結,如果無此引數預設僅將相應後端連結放入舊連結池。

-r 不做智慧判斷,將所有後端連線池全部重新載入一遍。不加此引數時,將對新配置進行智慧判斷,只會對增刪改的連線池做變更,不影響未作變更的連線池。

相關影響:當執行此命令時,表的配置資訊發生變更時,涉及到的表的 meta 資訊才會被過載,否則保持原有表 meta 資訊。另外,如果包含 -r 引數則不做上述判斷,全部重新載入 meta 資料。如果不包含 -r 但是包含 -s 引數,則對 metadata 是否需要重新載入的計算時,忽略所有 dbGroup/dbInstance 的變更。注意,不能在配置變更中體現的某些變化是無法重新載入 metadata 的,比如一個帶有預設 shardingNode 的 schema 嘗試通過刪除配置將拆分表或者 global 表變成非拆分表是不符合規範的。應當避免這種操作。

2.reload @@metadata

reload @@metadata 的作用是重新載入所有後設資料資訊,同時還有兩種擴充套件的過濾表示式的形式:

reload @@metadata where schema=? [ and table=? ]:重新載入指定 schema 中所有表或指定表的後設資料資訊。

reload @@metadata where table in ('schema1.table1' ,'schema2.table2','schema1.table3',...):重新載入 schema1 中 table1,table3 和 schema2 中 table2 的後設資料資訊。

從以上 reload @@config_all 和 reload @@metadata 的使用說明可以看出,二者在載入後設資料時的主要區別為:reload @@config_all 只會對配置中的變更項進行重新載入 metadata ,對配置未做變更的項需要手動執行 reload @@metadata 同步變更的後設資料。

三、理解了 reload @@config_all 及 reload @@metadata 的區別後,我們再來分析出現前面兩個問題的原因。

不難看出,問題1和問題2的報錯都是由於在配置沒有發生變更的情況下,在後端節點建表或修改表結構後,認為可以通過執行 reload @@config_all 同步到變更的表的後設資料導致的。這裡使用者有一個常見的誤區,認為所有場景下執行 reload @@config_all 都會觸發重新載入後設資料,但實際上只有當配置同時發生變更時才會同步更新後設資料,其他場景都需要手動執行 reload @@metadata 將後端表的後設資料同步到 dble 中。

另外,問題2中為什麼 select age from sharding_4_t1 能夠查詢成功,這是因為此查詢屬於簡單查詢,直接下發語句到後端節點執行即可,dble 內部不需要用到 age 欄位,而後端節點存在 age 欄位,所以執行成功。

四、為了便於排查後設資料相關的錯誤,可以使用 check full @@metadata 檢視當前 dble 中所有表的後設資料資訊。

check full @@metadata 還支援按多種條件過濾(具體可參見 dble 的官方文件:https://github.com/actiontech...

通過以上查詢結果不難發現,表 sharding_2_t1 和表 sharding_4_t1 的後設資料均未同步到更新。

執行 reload @@metadata 後,再次執行 check full @@metadata 查詢後設資料資訊:

通過以上結果可以看到表sharding_2_t1和表sharding_4_t1已經同步到正確的後設資料資訊,此時可以對錶進行常規操作而不會報錯:

相關文章