標籤:os 檔案 資料 問題 代碼 c++ 資料庫 sql
某500強客戶要上線一個功能,其後台所有資料庫是我司設計開發的NoSQL資料庫。
為了避免資料庫叢集中,資料節點不一致而導致問題,需要對資料庫節點間的資料進行校正。
理論上說,資料庫節點之間的資料,應當保持最終一致性。而我司的資料庫,是在對主節點對資料進行操作時,coord節點會(立即)通知備節點拉取資料,從而保持資料的一致性。所以,對於正常啟動並執行資料庫來說,一個叢集內每個節點上的資料,是完全一致的。
客戶是上帝,我們所作的就是要讓客戶放心。雖然我們強調我們的資料庫叢集內的節點中資料是一致的,讓客戶看到實際的資料,才是讓客戶放心的唯一方法。
針對客戶提出的需求,我做了一下分析:
最開始,我想寫一個dump工具,dump每個節點下的資料庫隱藏檔,對每個節點上的每一條資料進行遍曆比較,把不同的資料列出來。該方法的優點是速度快,效率高。但是,我的想法太天真了,我的出發點在一開始,叢集中的節點被同時建立,這樣,資料庫中的每條記錄的位移是一致的。我沒有考慮到擴容後的情況。
在實施方,隨時可能擴容,增加資料節點,這樣的話,新的節點和舊的節點,最開始的資料,和記錄的位移,可能就不一致。新的節點建立成功,會主動去向主節點同步,拉取資料,同時,主節點進行資料操作時,會通知新的節點同步資料,二者之間我共同作用,可能就影響了資料記錄的位移,導致新的資料記錄位移和主節點的記錄位移不一致。雖然編目結點也會記錄資料插入的位移,但是對編目結點進行查詢後再去讀取資料記錄比較,會影響效率。
因此,我選擇了另外一種方式:
用過C++驅動,對每個資料節點的的每條資料按照oid升序進行查詢,對比每條記錄。如果有不一致的資料,先將資料記錄下來,並記錄哪些節點存在該條資料,哪些節點不存在該條記錄。然後將記錄最小oid的節點遊標向下移動,可能會移動多個節點的遊標。因為oid最小的節點,向下移動一條,是最可能匹配的下一條記錄。按照該方法,逐步移動遊標,到遊標末尾。
有可能在程式運行時,節點間的資料正在同步,這樣,第一次的檢查結果可能有不一致的資料。因此可以指定迴圈檢查的次數,第二次檢查,就不會再去遍曆所有資料,而是從第一次遍曆之後的結果中選取記錄下來的資料,對每個節點進行尋找,都存在或者都不存在才移除改記錄。
理論有了,則是實踐。
經過兩天的冥想,兩天的story文檔編寫,得到了領導的認可。經過一個周的開發和調試,工具終於問世了。
對我自己機器上的資料庫叢集進行檢查,發現沒有不一致的資料。我們的資料庫還是經得起考驗的 :)
對資料庫節點進行操作,不通過coord節點(這樣,從節點收不到同步訊號,也不會在coord節點上查詢到資料操作),對節點進行資料增刪改,然後用工具測試。結果依然是我預期的。
真棒!好有成就感的說 :)
資料庫將會開源,大家以後就可以看到我寫的工具和代碼了 :)