分布式 Redis 服務
由于本課程聚焦于緩存,接下來,我將以微博內的 分布式 Redis 服務系統為例,介紹一個典型的分布式緩存系統的組成。
微博的 Redis 服務內部也稱為 RedisService。RedisService 的整體架構如圖所示。主要分為Proxy、存儲、集群管理、配置中心、Graphite,5 個部分。
- RedisService 中的 Proxy 是無狀態多租戶模型,每個 Proxy 下可以掛載不同的業務存儲,通過端口進行業務區分。
- 存儲基于 Redis 開發,但在集群數據存儲時,只保留了基本的存儲功能,支持定制的遷移功能,但存儲內部無狀態,不存儲 key-slot 映射關系。
- 配置中心用于記錄及分發各種元數據,如存儲 Proxy 的 IP、端口、配置等,在發生變化時,訂閱者可以及時感知。
- Graphite 系統用于記錄并展現系統、業務,組件以及實例等的狀態數據。
- ClusterManager 用于日常運維管理,業務 SLA 監控,報警等。同時 ClusterManager 會整合 Proxy、Redis 后端存儲以及配置中心,對業務數據進行集群管理
多租戶 Proxy
RedisService 中的 Proxy 無任何狀態,所有 Proxy 實例的啟動參數相同。但 Proxy 啟動前,clusterManager 會在配置中心設置該實例的業務及存儲配置信息,Proxy 啟動后,到配置中心通過自己的 IP 來獲取并訂閱配置,然后進行初始化。Proxy 與后端 Redis 存儲采用長連接,當 Client 并發發送請求到 Proxy 后,Proxy 會將請求進行打包,并發地以 pipeline 的方式批量訪問后端,以提升請求效率。對于多租戶 Proxy,由于不同業務的存儲位置可能不同,因此對每個請求需要進行業務區分,一般有 2 種方式進行區分。
方案 1,按照 key 的 namespace 前綴進行業務區分,比如 Client 分別請求 user、graph、feed 業務下的 key k1,業務 Client 分別構建 {user}k1、{graph}k1、{feed}k1,然后發送給 Proxy,Proxy 解析 key 前綴確定 key 對應的業務。
方案 2,對每個業務分配一個業務端口,不同業務訪問自己的端口,Proxy 會根據端口確定業務類型。這種類型不需要解析 key 前綴,不需要重構請求,性能更為高效。但需要為業務配置端口,增加管理成本,實踐上,由于業務 Redis 資源一般會采用不同端口,所以業務 Proxy 可以采用業務資源分片的最小端口來作為業務端口標志。
Redis 數據存儲
RedisService 中的 Redis 存儲基于 Redis 5.0 擴展,內部稱 wredis,wredis 不存儲 key-slot 映射,只記錄當前實例中存儲的 slot 的 key 計數。wredis 處理任何收到的操作命令,而數據分片訪問的正確性由訪問端確保。在每日低峰時段,clusterManager 對 Redis 存儲進行掃描,發現 slot 存儲是否存在異常。因為微博中有大量的小 value key,如果集群中增加 key-slot 映射,會大大增大存儲成本,通過消除 key-slot 映射等相關優化,部分業務可以減少 20% 以上的存儲容量。
wredis 支持 slot 的同步遷移及異步遷移。同時支持熱升級,可以毫秒級完成組件升級。wredis 也支持全增量復制,支持微博內部擴展的多種數據結構。熱升級、全增量復制、數據結構擴展等,在之前的課時中有介紹,具體可以參考之前講的“Redis 功能擴展”課時的內容。
配置中心 configService
微博的配置中心,內部稱為 configService,是微博內部配置元數據管理的基礎組件。configService 自身也是多 IDC 部署的,配置信息通過多版本數據結構存儲,支持版本回溯。同時配置數據可以通過 merkle hash 樹進行快速一致性驗證。RedisService 中的所有業務、資源、Proxy 的配置都存儲在 configService 中,由 cluster 寫入并變更,Proxy、業務 Client 獲取并訂閱所需的配置數據。configService 在配置節點發生變更時,會只對節點進行事件通知,訂閱者無需獲取全量數據,可以大大減輕配置變更后的獲取開銷。
ClusterManager 是一個運維后臺。主要用于運維工作,如后端資源、Proxy 的實例部署,配置變更,版本升級等。也用于數據的集群管理,clusterManager 內部會存儲業務數據的集群映射,并在必要時進行數據遷移和故障轉移。遷移采用 slot 方式,可以根據負載進行遷移流量控制,同時會探測集群內的節點狀態,如在 wredis 的 master 異常后,從 slave 中選擇一個新的master,并重建主從關系。clusterManager 還支持業務訪問的 Proxy 域名管理,監控集群節點的實例狀態,監控業務的 SLA 指標,對異常進行報警,以便運維及時進行處理。
集群數據同步
RedisService 中的數據存儲在多個區域,每個區域都有多個 IDC。部署方式是核心內網加公有云的方式。使用公有云,主要是由微博的業務特點決定的,在突發事件或熱點事件發生時,很容易形成流量洪峰,讀寫 TPS 大幅增加,利用公有云可以快速、低成本的擴展系統,大幅增加系統處理能力。根據業務特點,wredis 被分為緩存和存儲類型。對于 Redis 緩存主要通過消息總線進行驅動更新,而對于 Redis 存儲則采用主從復制更新。更新方式不同,主要是因為 Redis 作為緩存類型的業務數據,在不同區或者不同 IDC 的熱點數據不同,如果采用主從復制,部署從庫的 IDC,會出現熱數據無法進入緩存,同時冷數據無法淘汰的問題,因為從庫的淘汰也要依賴主庫進行。而對于 Redis 作存儲的業務場景,由于緩存存放全量數據,直接采用主從復制進行數據一致性保障,這樣最便捷。