大廠們的 redis 集群方案

来源:https://www.cnblogs.com/me115/archive/2018/05/15/9043420.html
-Advertisement-
Play Games

redis 集群方案主要有兩類,一是使用類 codis 的架構,按組劃分,實例之間互相獨立; 另一套是基於官方的 redis cluster 的方案;下麵分別聊聊這兩種方案; 類 codis 架構 這套架構的特點: 分片演算法:基於 slot hash桶; 分片實例之間相互獨立,每組 一個master ...


redis 集群方案主要有兩類,一是使用類 codis 的架構,按組劃分,實例之間互相獨立;
另一套是基於官方的 redis cluster 的方案;下麵分別聊聊這兩種方案;

類 codis 架構

這套架構的特點:

  • 分片演算法:基於 slot hash桶;
  • 分片實例之間相互獨立,每組 一個master 實例和多個slave;
  • 路由信息存放到第三方存儲組件,如 zookeeper 或etcd
  • 旁路組件探活

使用這套方案的公司:
阿裡雲: ApsaraCache, RedisLabs、京東、百度等

codis

slots 方案:劃分了 1024個slot, slots 信息在 proxy層感知; redis 進程中維護本實例上的所有key的一個slot map;

遷移過程中的讀寫衝突處理:
最小遷移單位為key;
訪問邏輯都是先訪問 src 節點,再根據結果判斷是否需要進一步訪問 target 節點;

  • 訪問的 key 還未被遷移:讀寫請求訪問 src 節點,處理後訪問:
  • 訪問的 key 正在遷移:讀請求訪問 src 節點後直接返回;寫請求無法處理,返回 retry
  • 訪問的 key 已被遷移(或不存在):讀寫請求訪問 src 節點,收到 moved 回覆,繼續訪問 target 節點處理

阿裡雲

AparaCache 的單機版已開源(開源版本中不包含slot等實現),集群方案細節未知;ApsaraCache

百度 BDRP 2.0

主要組件:
proxy,基於twemproxy 改造,實現了動態路由表;
redis內核: 基於2.x 實現的slots 方案;
metaserver:基於redis實現,包含的功能:拓撲信息的存儲 & 探活;
最多支持1000個節點;

slot 方案:
redis 內核中對db劃分,做了16384個db; 每個請求到來,首先做db選擇;

數據遷移實現:
數據遷移的時候,最小遷移單位是slot,遷移中整個slot 處於阻塞狀態,只支持讀請求,不支持寫請求;
對比 官方 redis cluster/ codis 的按key粒度進行遷移的方案:按key遷移對用戶請求更為友好,但遷移速度較慢;這個按slot進行遷移的方案速度更快;

京東

主要組件:
proxy: 自主實現,基於 golang 開發;
redis內核:基於 redis 2.8
configServer(cfs)組件:配置信息存放;
scala組件:用於觸發部署、新建、擴容等請求;
mysql:最終所有的元信息及配置的存儲;
sentinal(golang實現):哨兵,用於監控proxy和redis實例,redis實例失敗後觸發切換;

slot 方案實現:
在記憶體中維護了slots的map映射表;

數據遷移:
基於 slots 粒度進行遷移;
scala組件向dst實例發送命令告知會接受某個slot;
dst 向 src 發送命令請求遷移,src開啟一個線程來做數據的dump,將這個slot的數據整塊dump發送到dst(未加鎖,只讀操作)
寫請求會開闢一塊緩衝區,所有的寫請求除了寫原有數據區域,同時雙寫到緩衝區中。
當一個slot遷移完成後,把這個緩衝區的數據都傳到dst,當緩衝區為空時,更改本分片slot規則,不再擁有該slot,後續再請求這個slot的key返回moved;
上層proxy會保存兩份路由表,當該slot 請求目標實例得到 move 結果後,更新拓撲;

跨機房:跨機房使用主從部署結構;沒有多活,異地機房作為slave;

基於官方 redis cluster 的方案

和上一套方案比,所有功能都集成在 redis cluster 中,路由分片、拓撲信息的存儲、探活都在redis cluster中實現;各實例間通過 gossip 通信;這樣的好處是簡單,依賴的組件少,應對400個節點以內的場景沒有問題(按單實例8w read qps來計算,能夠支持 200 * 8 = 1600w 的讀多寫少的場景);但當需要支持更大的規模時,由於使用 gossip協議導致協議之間的通信消耗太大,redis cluster 不再合適;

使用這套方案的有:AWS, 百度貼吧

官方 redis cluster

數據遷移過程:
基於 key粒度的數據遷移;
遷移過程的讀寫衝突處理:
從A 遷移到 B;

  • 訪問的 key 所屬slot 不在節點 A 上時,返回 MOVED 轉向,client 再次請求B;
  • 訪問的 key 所屬 slot 在節點 A 上,但 key 不在 A上, 返回 ASK 轉向,client再次請求B;
  • 訪問的 key 所屬slot 在A上,且key在 A上,直接處理;(同步遷移場景:該 key正在遷移,則阻塞)

AWS ElasticCache

ElasticCache 支持主從和集群版、支持讀寫分離;
集群版用的是開源的Redis Cluster,未做深度定製;

百度貼吧的ksarch-saas:

基於redis cluster + twemproxy 實現;後被 BDRP 吞併;
twemproxy 實現了 smart client 功能;使用 redis cluster後還加一層 proxy的好處:

  1. 對client友好,不需要client都升級為smart client;(否則,所有語言client 都需要支持一遍)
  2. 加一層proxy可以做更多平臺策略;比如在proxy可做 大key、熱key的監控、慢查詢的請求監控、以及接入控制、請求過濾等;

即將發佈的 redis 5.0 中有個 feature,作者計劃給 redis cluster加一個proxy。

ksarch-saas 對 twemproxy的改造已開源:
https://github.com/ksarch-saas/r3proxy


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Grub(GRand Unified Bootloader),統一資源引導器,它的工作是提供一個菜單,允許用戶選擇要啟動的系統或不同的內核版本;把用戶選定的內核裝載到RAM中的特定空間中,然後解壓、展開,而後把系統控制權移交給內核。 Grub目前有兩個版本: 1、GRUB 0.X:Grub Lega ...
  • 用Linux已經有很長一段時間,但主要用於嵌入式開發(用交叉工具鏈進行版本編譯),所以用命令行就可以了,而且敲的最多的命令就是make。最近開始搭建TensorFlow的開發環境,大部分工作都是命令行完成,再加上TensorBoard可以實現web化展示,所以團隊共用一臺機器SSH接入就可以了。但是 ...
  • 目錄管理 ls、cd、pwd、mkdir、rmdir、tree ls(list) 列出,列表 用法: ls -l:長格式 文件類型: -:普通文件 (f) d: 目錄文件 b: 塊設備文件 (block) c: 字元設備文件 (character) l: 符號鏈接文件(symbolic link f ...
  • 為了方便自己快速使用命令,接觸了一下alias。在使用多個命令時,一般有兩種方式。各有不同 根據需求選擇。 直接上代碼: 1.alias Name='(date;pwd;cmd1;cmd2) 寫法簡潔容易。 2.alias da='da(){ date;pwd;who|wc -l;};da' 雖然有 ...
  • 想用中文系統,卻不想用中文文件夾,可以用以下方法: 先把home路徑下的桌面文件夾修改為Desktop 然後在命令行輸入 修改後ctrl -x然後確認修改重啟就行了 ...
  • 重啟網路失敗截圖 從本質上來看出現這樣的問題,是因為拷貝過來的虛擬機重新分配了網卡MAC地址。這樣造成的結果是配置文件中MAC與當前網卡MAC不一致。所以只需要修改一下配置文件即可。 ...
  • 1.安裝mysql客戶端流程: - 登錄navicat官網下載 - 將壓縮包拷貝ubuntu中進行解壓,解壓命令:tar zxvf navicat.tar.gz - 進入解壓目錄,運行命令./start_navicatt - 如果試用是灰色的則進行下一步 - 刪除 .navicat64/ 隱藏文件, ...
  • 一、簡介 MongoDB是一種強大、靈活,且易於擴展的通用型資料庫。他能擴展出非常多的功能。如二級索引(secondary index)、範圍查詢(range query)、排序、聚合(aggregation),以及地理空間索引(geospatial index)。 1、易於使用 MongoDB是一 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...