1. 程式人生 > >[從原始碼學設計]螞蟻金服SOFARegistry之Data節點變更

[從原始碼學設計]螞蟻金服SOFARegistry之Data節點變更

# [從原始碼學設計]螞蟻金服SOFARegistry之Data節點變更 [toc] ## 0x00 摘要 SOFARegistry 是螞蟻金服開源的一個生產級、高時效、高可用的服務註冊中心。 本系列文章重點在於分析設計和架構,即利用多篇文章,從多個角度反推總結 DataServer 或者 SOFARegistry 的實現機制和架構思路,讓大家藉以學習阿里如何設計。 本文為第十一篇,介紹SOFARegistry如何處理Data節點變化,即處理DataServerChangeEvent訊息。 ## 0x02 引子 上文中我們提到,MetaServerChangeEvent也會轉化為 **DataServerChangeEvent**,投放到EventCenter。 這是因為Meta Server的這個推送,也許是在告訴data Server,"hi,目前data server也有變動"。所以本期我們介紹如何處理DataServerChangeEvent,此處需要結合上文。 ## 0x03 業務範疇 我們在這裡首先要講講幾個業務範疇。 ### 3.1 DataServer 資料一致性 為支援海量資料,SOFARegistry 採用了一致性 Hash 來分片儲存 Publisher 資料,避免了單個伺服器儲存全量資料時產生的容量瓶頸問題。而在這個模型中,每個資料分片擁有多個副本,當儲存註冊數的 DataServer 進行擴容、縮容時,MetaServer 會把這個變更通知到 DataServer 和 SessionServer,資料分片會在叢集內部進行資料遷移與同步,此時就出現了 DataServer 內部資料的一致性問題。 ### 3.2 節點變更時的資料同步 MetaServer 會通過網路連線感知到新節點上線或者下線,所有的 DataServer 中執行著一個定時重新整理連線的任務 ConnectionRefreshTask,該任務定時去輪詢 MetaServer
,獲取資料節點的資訊。需要注意的是,除了 DataServer 主動去 MetaServer 拉取節點資訊外,MetaServer 也會主動傳送 NodeChangeResult 請求到各個節點,通知節點資訊發生變化,推拉獲取資訊的最終效果是一致的。 ## 0x04 總體邏輯 這部分總體邏輯如下: 當輪詢資訊返回資料節點有變化時,會向 EventCenter 投遞一個 DataServerChangeEvent 事件,在該事件的處理器中,如果判斷出是當前機房節點資訊有變化,則會投遞新的事件 LocalDataServerChangeEvent。 該事件的處理器 LocalDataServerChangeEventHandler 中會判斷當前節點是否為新加入的節點,如果是新節點則會向其它節點發送 NotifyOnlineRequest 請求,如圖所示: ![](https://img2020.cnblogs.com/blog/1850883/202012/1850883-20201225224746734-1203500952.png) 圖 DataServer 節點上線時新節點的邏輯 本文就主要講解從DataServerChangeEvent到LocalDataServerChangeEvent這部分的邏輯
。 ## 0x05 DataServerChangeEvent ### 5.1 訊息來源 DataServerChangeEvent有三種來源:啟動主動獲取,定期,推送。這三種具體如下: - 啟動主動獲取:這個主動查詢並且拉取的過程,這個過程基本上類似一個同步過程,體現為客戶端一次查詢結果的同步返回。 - 版本變更推送:為了確定服務釋出資料的變更,對於這個服務感興趣的所有客戶端訂閱方都需要推送,進行推送。由於效能要求必須併發執行並且非同步確定推送成功。 - 定期輪訓:這樣避免了某次變更通知沒有通知到所有訂閱方的情況。 因為有了上文的知識,我們應該知道,啟動主動獲取 和 推送 這兩種方式是通過MetaServerChangeEvent完成的
,結合上文邏輯圖,現在簡述如下: ```java +-------------------------------+ |[DataServerBootstrap] | MetaServerChangeEvent | | | +-------------------------+ | startRaftClient | a | | | | +---------------+ | | | | | +-------------------------------+ | | | +-------------------------------+ | | | | [Timer] | | v | | | b | 1 +-------+-----+ | | ConnectionRefreshMetaTask +------------------------------> | EventCenter +----+ | | | MetaServerChangeEvent | +-------+-----+ | | +-------------------------------+ | ^ | | +-------------------------------+ | | | | | | | | | |