[從原始碼學設計]螞蟻金服SOFARegistry之Data節點變更
阿新 • • 發佈:2020-12-26
# [從原始碼學設計]螞蟻金服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 | +-------+-----+ | |
+-------------------------------+ | ^ | |
+-------------------------------+ | | | |
| | | | | |