一個典型的分布式緩存系統是什么樣的?no.32

分布式 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 作存儲的業務場景,由于緩存存放全量數據,直接采用主從復制進行數據一致性保障,這樣最便捷。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/14884.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/14884.shtml
英文地址,請注明出處:http://en.pswp.cn/web/14884.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

產品推薦 | 基于Xilinx XCKU115的半高PCIe x8 硬件加速卡

一、板卡概述 本板卡系我公司自主研發,采用Xilinx公司的XCKU115-3-FLVF1924-E芯片作為主處理器,主要用于FPGA硬件加速。板卡設計滿足工業級要求。如下圖所示: 二、功能和技術指標 板卡功能 參數內容 主處理器 XCKU115-3-FLVF1924-E 板卡…

UE4/UE5像素流送云推流:多人訪問不穩定、畫面糊、端口占用多等

UE4/UE5想要實現網頁訪問,很多工程師會選擇guan方的像素流送。但這個技術要求在模型開發初期就接入。對于一些已有UE模型是無法進行流化的。雖然也可以解決新UE模型的網頁訪問問題,但在實際的應用中,點量云流也收到很多反饋說,使用…

netty-socketio 集群隨記

實現netty-socketio集群的方式 代碼實例 PostConstructpublic void subscribe() {pubSubStore.subscribe(PubSubType.DISPATCH, new PubSubListener<DispatchMessage>() {Overridepublic void onMessage(DispatchMessage message) {log.debug("subscribe: {}"…

Python爬取B站視頻:封裝一下

&#x1f4da;博客主頁&#xff1a;knighthood2001 ?公眾號&#xff1a;認知up吧 &#xff08;目前正在帶領大家一起提升認知&#xff0c;感興趣可以來圍觀一下&#xff09; &#x1f383;知識星球&#xff1a;【認知up吧|成長|副業】介紹 ??如遇文章付費&#xff0c;可先看…

大數據Hadoop之-工具HIVE(一)

大數據Hadoop之——數據倉庫Hive HIVE介紹Hive是基于Hadoop的一個數據倉庫(Data Aarehouse,簡稱數倉、DW),可以將結構化的數據文件映射為一張數據庫表,并提供類SQL查詢功能。是用于存儲、分析、報告的數據系統。 在Hadoop生態系統中,HDFS用于存儲數據,Yarn用于資源管理…

解釋Spring Bean的生命周期

Spring Bean的生命周期涉及到Bean的創建、配置、使用和銷毀的各個階段。理解這個生命周期對于編寫高效的Spring應用和充分利用框架的功能非常重要。下面是Spring Bean生命周期的主要步驟&#xff1a; 1. 實例化Bean Spring容器首先將使用Bean的定義&#xff08;無論是XML、注…

使用Golang調用騰訊云郵件模版發送郵件

文章目錄 一、騰訊云郵件模版創建1.1 發信域名配置1.2 發信地址設置1.3 發信模版設置 二、通過Golang發送郵件2.1 代碼示例2.2 代碼說明 三、常見問題3.1 UnsupportedRegion3.2 InvalidTemplateID 本文檔介紹了如何使用Golang編寫代碼&#xff0c;通過騰訊云郵件服務&#xff0…

【Linux】中的常見的重要指令(中)

目錄 一、man指令 二、cp指令 三、cat指令 四、mv指令 五、more指令 六、less指令 七、head指令 八、tail指令 一、man指令 Linux的命令有很多參數&#xff0c;我們不可能全記住&#xff0c;我們可以通過查看聯機手冊獲取幫助。訪問Linux手冊頁的命令是 man 語法: m…

白嫖免費圖床!CloudFlare R2太香了!

1 為啥要折騰搭建一個專屬圖床&#xff1f; 技術大佬寫博客都用 md 格式&#xff0c;要在多平臺發布&#xff0c;圖片就得有外鏈后續如博客遷移&#xff0c;國內博客網站如掘金&#xff0c;簡書&#xff0c;語雀等都做了防盜鏈&#xff0c;圖片無法遷移 2 為啥選擇CloudFlare…

對話太醫管家CEO徐晶:數字化技術正在為健康管理行業帶來新平衡丨數字思考者50人...

ITValue 鈦媒體特別專題策劃《數字思考者50人》&#xff1a;探訪中國深刻的數字化思考者群體。我們理解的“TechThinker”&#xff0c;涵蓋了中國數字化浪潮中的技術踐行者、政策制定者與投資決策者。在這場長達10年的乘風破浪中&#xff0c;每個人都在分享技術進步的果實&…

leetcode445-Add Two Numbers II

題目 給你兩個 非空 鏈表來代表兩個非負整數。數字最高位位于鏈表開始位置。它們的每個節點只存儲一位數字。將這兩數相加會返回一個新的鏈表。 你可以假設除了數字 0 之外&#xff0c;這兩個數字都不會以零開頭。 示例1&#xff1a; 輸入&#xff1a;l1 [7,2,4,3], l2 [5,6…

文件系統--軟硬鏈接

文章目錄 現象軟鏈接硬鏈接 現象 建立軟鏈接 建立硬鏈接 // 刪除軟硬鏈接都可以用 unlink 指令 unlink soft-link軟鏈接 軟鏈接是一個獨立的文件&#xff0c;因為有獨立的inode number 軟鏈接的內容&#xff1a;目標文件所對應的路勁字符串如果我們直接查看軟鏈接文件&#…

vue2vue3為什么el-table樹狀表格失效?

上圖所示&#xff0c;后端返回字段中有hasChildren字段。 解決樹狀表格失效方案&#xff1a; 從后端拿到數據后&#xff0c;遞歸去掉該字段&#xff0c;然后就能正常顯示。&#xff08;復制下方代碼&#xff0c;直接用&#xff09; 親測有效&#xff0c;vue2、vue3通用 /**…

如何運用多媒體,打造企業實力展示廳?

企業文化、產品是其長期發展的根本所在&#xff0c;為此越來越多的企業開始選擇運用多媒體互動&#xff0c;來打造企業多媒體展廳的方式&#xff0c;對企業文化、品牌形象、產品進行推廣宣傳&#xff0c;并在多媒體互動裝置的支持下&#xff0c;能讓客戶能夠快速且全面的了解企…

基于SSM的“酒店管理系統”的設計與實現(源碼+數據庫+文檔)

基于SSM的“酒店管理系統”的設計與實現&#xff08;源碼數據庫文檔) 開發語言&#xff1a;Java 數據庫&#xff1a;MySQL 技術&#xff1a;SSM 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系統展示 首頁 管理員登錄頁面 用戶管理頁面 客房信息查詢 酒店詳細信息 后臺…

MySQL入門學習.數據庫組成.存儲引擎

存儲引擎是 MySQL 數據庫的一個重要組成部分&#xff0c;它決定了數據的存儲方式、索引方式、事務支持等特性。MySQL 支持多種存儲引擎&#xff0c;常見的有 InnoDB、MyISAM、Memory 等。 存儲引擎的特點和使用方法&#xff1a; 1. InnoDB&#xff1a; 是 MySQL 默認的存儲引…

APP廣告變現怎么實現的,背后邏輯是什么?

廣告變現的實現主要基于以下幾個關鍵步驟和邏輯&#xff1a; 用戶獲取與留存&#xff1a;首先&#xff0c;APP需要吸引足夠的用戶并確保他們的留存率。只有擁有龐大且活躍的用戶基礎&#xff0c;APP才能吸引廣告商投放廣告。因此&#xff0c;開發者需要通過優化APP質量、提升用…

數字人實訓室解決方案

前言 近年來&#xff0c;政策層面的積極推動為數字人產業鋪設了堅實的基石。2021年&#xff0c;“十四五”規劃將虛擬數字技術納入其中&#xff0c;強調技術創新引領行業應用的革新&#xff0c;加速數字人在各領域的實際應用。緊接著的《“十四五”數字經濟發展規劃》進一步明確…

react封裝Spin重復使用loading效果antd

1. 代碼封裝 import React, { useState } from react; import { Spin } from antd; import ./index.scss;// 自定義Hook useLoadings export const useLoadings () > {// 存儲loading的狀態&#xff0c;key是loading的唯一標識&#xff0c;value是loading的顯示狀態 co…

c#將json字符串轉為對象

c#將json字符串轉為對象&#xff0c;需要加載這個 using Newtonsoft.Json; Rootobject _r JsonConvert.DeserializeObject<Rootobject>(_json);