精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Redis集群模式搭建與原理詳解

存儲 存儲軟件 Redis
在 Redis 3.0 之前,使用 哨兵(sentinel)機制來監控各個節點之間的狀態。Redis Cluster 是 Redis 的 分布式解決方案,在 3.0 版本正式推出,有效地解決了 Redis 在 分布式 方面的需求。

 前言

在 Redis 3.0 之前,使用 哨兵(sentinel)機制來監控各個節點之間的狀態。Redis Cluster 是 Redis 的 分布式解決方案,在 3.0 版本正式推出,有效地解決了 Redis 在 分布式 方面的需求。當遇到 單機內存、并發、流量 等瓶頸時,可以采用 Cluster 架構方案達到 負載均衡 的目的。

[[276882]]

 

本文將從 集群方案、數據分布、搭建集群、節點通信、集群伸縮、請求路由、故障轉移、集群運維 等幾個方面介紹 Redis Cluster。

正文

1. Redis集群方案

Redis Cluster 集群模式通常具有 高可用、可擴展性、分布式、容錯 等特性。Redis 分布式方案一般有兩種:

1.1 客戶端分區方案

客戶端 就已經決定數據會被 存儲 到哪個 redis 節點或者從哪個 redis 節點 讀取數據。其主要思想是采用 哈希算法 將 Redis 數據的 key 進行散列,通過 hash 函數,特定的 key會 映射 到特定的 Redis 節點上。

客戶端分區方案 的代表為 Redis Sharding,Redis Sharding 是 Redis Cluster 出來之前,業界普遍使用的 Redis 多實例集群 方法。Java 的 Redis 客戶端驅動庫 Jedis,支持 Redis Sharding 功能,即 ShardedJedis 以及 結合緩存池 的 ShardedJedisPool。

優點

不使用 第三方中間件,分區邏輯 可控,配置 簡單,節點之間無關聯,容易 線性擴展,靈活性強。

缺點

客戶端 無法 動態增刪 服務節點,客戶端需要自行維護 分發邏輯,客戶端之間 無連接共享,會造成 連接浪費。

1.2. 代理分區方案

客戶端 發送請求到一個 代理組件,代理 解析 客戶端 的數據,并將請求轉發至正確的節點,最后將結果回復給客戶端。

優點:簡化 客戶端 的分布式邏輯,客戶端 透明接入,切換成本低,代理的 轉發 和 存儲 分離。

缺點:多了一層 代理層,加重了 架構部署復雜度 和 性能損耗。

代理分區 主流實現的有方案有 Twemproxy 和 Codis。

1.2.1. Twemproxy

Twemproxy 也叫 nutcraker,是 twitter 開源的一個 redis 和 memcache 的 中間代理服務器 程序。Twemproxy 作為 代理,可接受來自多個程序的訪問,按照 路由規則,轉發給后臺的各個 Redis 服務器,再原路返回。Twemproxy 存在 單點故障 問題,需要結合 Lvs 和 Keepalived 做 高可用方案。

優點:應用范圍廣,穩定性較高,中間代理層 高可用。

缺點:無法平滑地 水平擴容/縮容,無 可視化管理界面,運維不友好,出現故障,不能 自動轉移。

1.2.2. Codis

Codis 是一個 分布式 Redis 解決方案,對于上層應用來說,連接 Codis-Proxy 和直接連接 原生的 Redis-Server 沒有的區別。Codis 底層會 處理請求的轉發,不停機的進行 數據遷移 等工作。Codis 采用了無狀態的 代理層,對于 客戶端 來說,一切都是透明的。

優點

實現了上層 Proxy 和底層 Redis 的 高可用,數據分片 和 自動平衡,提供 命令行接口 和 RESTful API,提供 監控 和 管理 界面,可以動態 添加 和 刪除 Redis 節點。

缺點

部署架構 和 配置 復雜,不支持 跨機房 和 多租戶,不支持 鑒權管理。

1.3. 查詢路由方案

客戶端隨機地 請求任意一個 Redis 實例,然后由 Redis 將請求 轉發 給 正確 的 Redis 節點。Redis Cluster 實現了一種 混合形式 的 查詢路由,但并不是 直接 將請求從一個 Redis 節點 轉發 到另一個 Redis 節點,而是在 客戶端 的幫助下直接 重定向( redirected)到正確的 Redis 節點。

優點

無中心節點,數據按照 槽 存儲分布在多個 Redis 實例上,可以平滑的進行節點 擴容/縮容,支持 高可用 和 自動故障轉移,運維成本低。

缺點

嚴重依賴 Redis-trib 工具,缺乏 監控管理,需要依賴 Smart Client (維護連接,緩存路由表,MultiOp 和 Pipeline 支持)。Failover 節點的 檢測過慢,不如 中心節點 ZooKeeper 及時。Gossip 消息具有一定開銷。無法根據統計區分 冷熱數據。

2. 數據分布

2.1. 數據分布理論

分布式數據庫 首先要解決把 整個數據集 按照 分區規則 映射到 多個節點 的問題,即把 數據集 劃分到 多個節點 上,每個節點負責 整體數據 的一個 子集。

數據分布通常有 哈希分區 和 順序分區 兩種方式,對比如下:

由于 Redis Cluster 采用 哈希分區規則,這里重點討論 哈希分區。常見的 哈希分區 規則有幾種,下面分別介紹:

2.1.1. 節點取余分區

使用特定的數據,如 Redis 的 鍵 或 用戶 ID,再根據 節點數量 N 使用公式:hash(key)% N 計算出 哈希值,用來決定數據 映射 到哪一個節點上。

優點

這種方式的突出優點是 簡單性,常用于 數據庫 的 分庫分表規則。一般采用 預分區的方式,提前根據 數據量 規劃好 分區數,比如劃分為 512 或 1024 張表,保證可支撐未來一段時間的 數據容量,再根據 負載情況 將 表 遷移到其他 數據庫 中。擴容時通常采用 翻倍擴容,避免 數據映射 全部被 打亂,導致 全量遷移 的情況。

缺點

當 節點數量 變化時,如 擴容 或 收縮 節點,數據節點 映射關系 需要重新計算,會導致數據的 重新遷移。

2.1.2. 一致性哈希分區

一致性哈希 可以很好的解決 穩定性問題,可以將所有的 存儲節點 排列在 收尾相接的 Hash 環上,每個 key 在計算 Hash 后會 順時針 找到 臨接 的 存儲節點 存放。而當有節點 加入 或 退出 時,僅影響該節點在 Hash 環上 順時針相鄰 的 后續節點。

優點

加入 和 刪除 節點只影響 哈希環 中 順時針方向 的 相鄰的節點,對其他節點無影響。

缺點

加減節點 會造成 哈希環 中部分數據 無法命中。當使用 少量節點 時,節點變化 將大范圍影響 哈希環 中 數據映射,不適合 少量數據節點 的分布式方案。普通 的 一致性哈希分區 在增減節點時需要 增加一倍 或 減去一半 節點才能保證 數據 和 負載的均衡。

注意:因為 一致性哈希分區 的這些缺點,一些分布式系統采用 虛擬槽 對 一致性哈希 進行改進,比如 Dynamo 系統。

2.1.3. 虛擬槽分區

虛擬槽分區 巧妙地使用了 哈希空間,使用 分散度良好 的 哈希函數 把所有數據 映射 到一個 固定范圍 的 整數集合 中,整數定義為 槽(slot)。這個范圍一般 遠遠大于 節點數,比如 Redis Cluster 槽范圍是 0 ~ 16383。槽 是集群內 數據管理 和 遷移 的 基本單位。采用 大范圍槽 的主要目的是為了方便 數據拆分 和 集群擴展。每個節點會負責 一定數量的槽,如圖所示:

當前集群有 5 個節點,每個節點平均大約負責 3276 個 槽。由于采用 高質量 的 哈希算法,每個槽所映射的數據通常比較 均勻,將數據平均劃分到 5 個節點進行 數據分區。Redis Cluster 就是采用 虛擬槽分區。

  • 節點1: 包含 0 到 3276 號哈希槽。
  • 節點2:包含 3277 到 6553 號哈希槽。
  • 節點3:包含 6554 到 9830 號哈希槽。
  • 節點4:包含 9831 到 13107 號哈希槽。
  • 節點5:包含 13108 到 16383 號哈希槽。

這種結構很容易 添加 或者 刪除 節點。如果 增加 一個節點 6,就需要從節點 1 ~ 5 獲得部分 槽 分配到節點 6 上。如果想 移除 節點 1,需要將節點 1 中的 槽 移到節點 2 ~ 5 上,然后將 沒有任何槽 的節點 1 從集群中 移除 即可。

由于從一個節點將 哈希槽 移動到另一個節點并不會 停止服務,所以無論 添加刪除 或者 改變 某個節點的 哈希槽的數量 都不會造成 集群不可用 的狀態.

2.2. Redis的數據分區

Redis Cluster 采用 虛擬槽分區,所有的 鍵 根據 哈希函數 映射到 0~16383 整數槽內,計算公式:slot = CRC16(key)& 16383。每個節點負責維護一部分槽以及槽所映射的 鍵值數據,如圖所示:

2.2.1. Redis虛擬槽分區的特點

  • 解耦 數據 和 節點 之間的關系,簡化了節點 擴容 和 收縮 難度。
  • 節點自身 維護槽的 映射關系,不需要 客戶端 或者 代理服務 維護 槽分區元數據。
  • 支持 節點、槽、鍵 之間的 映射查詢,用于 數據路由、在線伸縮 等場景。

2.3. Redis集群的功能限制

Redis 集群相對 單機 在功能上存在一些限制,需要 開發人員 提前了解,在使用時做好規避。

  • key 批量操作 支持有限。

類似 mset、mget 操作,目前只支持對具有相同 slot 值的 key 執行 批量操作。對于 映射為不同 slot 值的 key 由于執行 mget、mget 等操作可能存在于多個節點上,因此不被支持。

  • key 事務操作 支持有限。

只支持 多 key 在 同一節點上 的 事務操作,當多個 key 分布在 不同 的節點上時 無法 使用事務功能。

  • key 作為 數據分區 的最小粒度

不能將一個 大的鍵值 對象如 hash、list 等映射到 不同的節點。

不支持 多數據庫空間

單機 下的 Redis 可以支持 16 個數據庫(db0 ~ db15),集群模式 下只能使用 一個 數據庫空間,即 db0。

  • 復制結構 只支持一層

從節點 只能復制 主節點,不支持 嵌套樹狀復制 結構。

3. Redis集群搭建

Redis-Cluster 是 Redis 官方的一個 高可用 解決方案,Cluster 中的 Redis 共有 2^14(16384) 個 slot 槽。創建 Cluster 后,槽 會 平均分配 到每個 Redis 節點上。

下面介紹一下本機啟動 6 個 Redis 的 集群服務,并使用 redis-trib.rb 創建 3主3從 的 集群。搭建集群工作需要以下三個步驟:

3.1. 準備節點

Redis 集群一般由 多個節點 組成,節點數量至少為 6 個,才能保證組成 完整高可用 的集群。每個節點需要 開啟配置 cluster-enabled yes,讓 Redis 運行在 集群模式 下。

Redis 集群的節點規劃如下:

注意:建議為集群內 所有節點 統一目錄,一般劃分三個目錄:conf、data、log,分別存放 配置、數據 和 日志 相關文件。把 6 個節點配置統一放在 conf 目錄下。

3.1.1. 創建redis各實例目錄

  1. $ sudo mkdir -p /usr/local/redis-cluster 
  2.  
  3. $ cd /usr/local/redis-cluster 
  4.  
  5. $ sudo mkdir conf data log 
  6.  
  7. $ sudo mkdir -p data/redis-6379 data/redis-6389 data/redis-6380 data/redis-6390 data/redis-6381 data/redis-6391 

3.1.2. redis配置文件管理

根據以下 模板 配置各個實例的 redis.conf,以下只是搭建集群需要的 基本配置,可能需要根據實際情況做修改。

$ sudo mkdir -p /usr/local/redis-cluster

$ cd /usr/local/redis-cluster

$ sudo mkdir conf data log

$ sudo mkdir -p data/redis-6379 data/redis-6389 data/redis-6380 data/redis-6390 data/redis-6381 data/redis-6391

3.1.2. redis配置文件管理

根據以下 模板 配置各個實例的 redis.conf,以下只是搭建集群需要的 基本配置,可能需要根據實際情況做修改。

  1. # redis后臺運行 
  2.  
  3. daemonize yes 
  4.  
  5. # 綁定的主機端口 
  6.  
  7. bind 127.0.0.1 
  8.  
  9. # 數據存放目錄 
  10.  
  11. dir /usr/local/redis-cluster/data/redis-6379 
  12.  
  13. # 進程文件 
  14.  
  15. pidfile /var/run/redis-cluster/${自定義}.pid 
  16.  
  17. # 日志文件 
  18.  
  19. logfile /usr/local/redis-cluster/log/${自定義}.log 
  20.  
  21. # 端口號 
  22.  
  23. port 6379 
  24.  
  25. # 開啟集群模式,把注釋#去掉 
  26.  
  27. cluster-enabled yes 
  28.  
  29. # 集群的配置,配置文件首次啟動自動生成 
  30.  
  31. cluster-config-file /usr/local/redis-cluster/conf/${自定義}.conf 
  32.  
  33. # 請求超時,設置10秒 
  34.  
  35. cluster-node-timeout 10000 
  36.  
  37. # aof日志開啟,有需要就開啟,它會每次寫操作都記錄一條日志 
  38.  
  39. appendonly yes 
  • redis-6379.conf
  1. daemonize yes 
  2.  
  3. bind 127.0.0.1 
  4.  
  5. dir /usr/local/redis-cluster/data/redis-6379 
  6.  
  7. pidfile /var/run/redis-cluster/redis-6379.pid 
  8.  
  9. logfile /usr/local/redis-cluster/log/redis-6379.log 
  10.  
  11. port 6379 
  12.  
  13. cluster-enabled yes 
  14.  
  15. cluster-config-file /usr/local/redis-cluster/conf/node-6379.conf 
  16.  
  17. cluster-node-timeout 10000 
  18.  
  19. appendonly yes 
  • redis-6389.conf
  1. daemonize yes 
  2.  
  3. bind 127.0.0.1 
  4.  
  5. dir /usr/local/redis-cluster/data/redis-6389 
  6.  
  7. pidfile /var/run/redis-cluster/redis-6389.pid 
  8.  
  9. logfile /usr/local/redis-cluster/log/redis-6389.log 
  10.  
  11. port 6389 
  12.  
  13. cluster-enabled yes 
  14.  
  15. cluster-config-file /usr/local/redis-cluster/conf/node-6389.conf 
  16.  
  17. cluster-node-timeout 10000 
  18.  
  19. appendonly yes 
  • redis-6380.conf
  1. daemonize yes 
  2.  
  3. bind 127.0.0.1 
  4.  
  5. dir /usr/local/redis-cluster/data/redis-6380 
  6.  
  7. pidfile /var/run/redis-cluster/redis-6380.pid 
  8.  
  9. logfile /usr/local/redis-cluster/log/redis-6380.log 
  10.  
  11. port 6380 
  12.  
  13. cluster-enabled yes 
  14.  
  15. cluster-config-file /usr/local/redis-cluster/conf/node-6380.conf 
  16.  
  17. cluster-node-timeout 10000 
  18.  
  19. appendonly yes 
  • redis-6390.conf
  1. daemonize yes 
  2.  
  3. bind 127.0.0.1 
  4.  
  5. dir /usr/local/redis-cluster/data/redis-6390 
  6.  
  7. pidfile /var/run/redis-cluster/redis-6390.pid 
  8.  
  9. logfile /usr/local/redis-cluster/log/redis-6390.log 
  10.  
  11. port 6390 
  12.  
  13. cluster-enabled yes 
  14.  
  15. cluster-config-file /usr/local/redis-cluster/conf/node-6390.conf 
  16.  
  17. cluster-node-timeout 10000 
  18.  
  19. appendonly yes 

redis-port 6381.conf

  1. daemonize yes 
  2.  
  3. bind 127.0.0.1 
  4.  
  5. dir /usr/local/redis-cluster/data/redis-6381 
  6.  
  7. pidfile /var/run/redis-cluster/redis-6381.pid 
  8.  
  9. logfile /usr/local/redis-cluster/log/redis-6381.log 
  10.  
  11. port 6381 
  12.  
  13. cluster-enabled yes 
  14.  
  15. cluster-config-file /usr/local/redis-cluster/conf/node-6381.conf 
  16.  
  17. cluster-node-timeout 10000 
  18.  
  19. appendonly yes 

redis-port 6391.conf

  1. daemonize yes 
  2.  
  3. bind 127.0.0.1 
  4.  
  5. dir /usr/local/redis-cluster/data/redis-6391 
  6.  
  7. pidfile /var/run/redis-cluster/redis-6391.pid 
  8.  
  9. logfile /usr/local/redis-cluster/log/redis-6391.log 
  10.  
  11. port 6391 
  12.  
  13. cluster-enabled yes 
  14.  
  15. cluster-config-file /usr/local/redis-cluster/conf/node-6391.conf 
  16.  
  17. cluster-node-timeout 10000 
  18.  
  19. appendonly yes 

3.2. 環境準備

3.2.1. 安裝Ruby環境

  1. $ sudo brew install ruby 

3.2.2. 準備rubygem redis依賴

  1. $ sudo gem install redis 
  2.  
  3. Password
  4.  
  5. Fetching: redis-4.0.2.gem (100%) 
  6.  
  7. Successfully installed redis-4.0.2 
  8.  
  9. Parsing documentation for redis-4.0.2 
  10.  
  11. Installing ri documentation for redis-4.0.2 
  12.  
  13. Done installing documentation for redis after 1 seconds 
  14.  
  15. 1 gem installed 

3.2.3. 拷貝redis-trib.rb到集群根目錄

redis-trib.rb 是 redis 官方推出的管理 redis 集群 的工具,集成在 redis 的源碼 src 目錄下,將基于 redis 提供的 集群命令 封裝成 簡單、便捷、實用 的 操作工具。

  1. $ sudo cp /usr/local/redis-4.0.11/src/redis-trib.rb /usr/local/redis-cluster 

查看 redis-trib.rb 命令環境是否正確,輸出如下:

  1. $ ./redis-trib.rb 
  2.  
  3. Usage: redis-trib <command> <options> <arguments ...> 
  4.  
  5. create host1:port1 ... hostN:portN 
  6.  
  7. --replicas <arg> 
  8.  
  9. check host:port 
  10.  
  11. info host:port 
  12.  
  13. fix host:port 
  14.  
  15. --timeout <arg> 
  16.  
  17. reshard host:port 
  18.  
  19. --from <arg> 
  20.  
  21. --to <arg> 
  22.  
  23. --slots <arg> 
  24.  
  25. --yes 
  26.  
  27. --timeout <arg> 
  28.  
  29. --pipeline <arg> 
  30.  
  31. rebalance host:port 
  32.  
  33. --weight <arg> 
  34.  
  35. --auto-weights 
  36.  
  37. --use-empty-masters 
  38.  
  39. --timeout <arg> 
  40.  
  41. --simulate 
  42.  
  43. --pipeline <arg> 
  44.  
  45. --threshold <arg> 
  46.  
  47. add-node new_host:new_port existing_host:existing_port 
  48.  
  49. --slave 
  50.  
  51. --master-id <arg> 
  52.  
  53. del-node host:port node_id 
  54.  
  55. set-timeout host:port milliseconds 
  56.  
  57. call host:port command arg arg .. arg 
  58.  
  59. import host:port 
  60.  
  61. --from <arg> 
  62.  
  63. --copy 
  64.  
  65. --replace 
  66.  
  67. help (show this help) 
  68.  
  69. For check, fix, reshard, del-node, set-timeout you can specify the host and port of any working node in the cluster. 

redis-trib.rb 是 redis 作者用 ruby 完成的。redis-trib.rb 命令行工具 的具體功能如下:

3.3. 安裝集群

3.3.1. 啟動redis服務節點

運行如下命令啟動 6 臺 redis 節點:

  1. sudo redis-server conf/redis-6379.conf 
  2.  
  3. sudo redis-server conf/redis-6389.conf 
  4.  
  5. sudo redis-server conf/redis-6380.conf 
  6.  
  7. sudo redis-server conf/redis-6390.conf 
  8.  
  9. sudo redis-server conf/redis-6381.conf 
  10.  
  11. sudo redis-server conf/redis-6391.conf 

啟動完成后,redis 以集群模式啟動,查看各個 redis 節點的進程狀態:

  1. $ ps -ef | grep redis-server 
  2.  
  3. 0 1908 1 0 4:59下午 ?? 0:00.01 redis-server *:6379 [cluster] 
  4.  
  5. 0 1911 1 0 4:59下午 ?? 0:00.01 redis-server *:6389 [cluster] 
  6.  
  7. 0 1914 1 0 4:59下午 ?? 0:00.01 redis-server *:6380 [cluster] 
  8.  
  9. 0 1917 1 0 4:59下午 ?? 0:00.01 redis-server *:6390 [cluster] 
  10.  
  11. 0 1920 1 0 4:59下午 ?? 0:00.01 redis-server *:6381 [cluster] 
  12.  
  13. 0 1923 1 0 4:59下午 ?? 0:00.01 redis-server *:6391 [cluster] 

在每個 redis 節點的 redis.conf 文件中,我們都配置了 cluster-config-file 的文件路徑,集群啟動時,conf 目錄會新生成 集群 節點配置文件。查看文件列表如下:

  1. $ tree -L 3 . 
  2.  
  3.  
  4. ├── appendonly.aof 
  5.  
  6. ├── conf 
  7.  
  8. │ ├── node-6379.conf 
  9.  
  10. │ ├── node-6380.conf 
  11.  
  12. │ ├── node-6381.conf 
  13.  
  14. │ ├── node-6389.conf 
  15.  
  16. │ ├── node-6390.conf 
  17.  
  18. │ ├── node-6391.conf 
  19.  
  20. │ ├── redis-6379.conf 
  21.  
  22. │ ├── redis-6380.conf 
  23.  
  24. │ ├── redis-6381.conf 
  25.  
  26. │ ├── redis-6389.conf 
  27.  
  28. │ ├── redis-6390.conf 
  29.  
  30. │ └── redis-6391.conf 
  31.  
  32. ├── data 
  33.  
  34. │ ├── redis-6379 
  35.  
  36. │ ├── redis-6380 
  37.  
  38. │ ├── redis-6381 
  39.  
  40. │ ├── redis-6389 
  41.  
  42. │ ├── redis-6390 
  43.  
  44. │ └── redis-6391 
  45.  
  46. ├── log 
  47.  
  48. │ ├── redis-6379.log 
  49.  
  50. │ ├── redis-6380.log 
  51.  
  52. │ ├── redis-6381.log 
  53.  
  54. │ ├── redis-6389.log 
  55.  
  56. │ ├── redis-6390.log 
  57.  
  58. │ └── redis-6391.log 
  59.  
  60. └── redis-trib.rb 
  61.  
  62. 9 directories, 20 files 

3.3.2. redis-trib關聯集群節點

按照 從主到從 的方式 從左到右 依次排列 6 個 redis 節點。

  1. $ sudo ./redis-trib.rb create --replicas 1 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6389 127.0.0.1:6390 127.0.0.1:6391 

集群創建后,redis-trib 會先將 16384 個 哈希槽 分配到 3 個 主節點,即 redis-6379,redis-6380 和 redis-6381。然后將各個 從節點 指向 主節點,進行 數據同步。

  1. >>> Creating cluster 
  2.  
  3. >>> Performing hash slots allocation on 6 nodes... 
  4.  
  5. Using 3 masters: 
  6.  
  7. 127.0.0.1:6379 
  8.  
  9. 127.0.0.1:6380 
  10.  
  11. 127.0.0.1:6381 
  12.  
  13. Adding replica 127.0.0.1:6390 to 127.0.0.1:6379 
  14.  
  15. Adding replica 127.0.0.1:6391 to 127.0.0.1:6380 
  16.  
  17. Adding replica 127.0.0.1:6389 to 127.0.0.1:6381 
  18.  
  19. >>> Trying to optimize slaves allocation for anti-affinity 
  20.  
  21. [WARNING] Some slaves are in the same host as their master 
  22.  
  23. M: ad4b9ffceba062492ed67ab336657426f55874b7 127.0.0.1:6379 
  24.  
  25. slots:0-5460 (5461 slots) master 
  26.  
  27. M: df23c6cad0654ba83f0422e352a81ecee822702e 127.0.0.1:6380 
  28.  
  29. slots:5461-10922 (5462 slots) master 
  30.  
  31. M: ab9da92d37125f24fe60f1f33688b4f8644612ee 127.0.0.1:6381 
  32.  
  33. slots:10923-16383 (5461 slots) master 
  34.  
  35. S: 25cfa11a2b4666021da5380ff332b80dbda97208 127.0.0.1:6389 
  36.  
  37. replicates ad4b9ffceba062492ed67ab336657426f55874b7 
  38.  
  39. S: 48e0a4b539867e01c66172415d94d748933be173 127.0.0.1:6390 
  40.  
  41. replicates df23c6cad0654ba83f0422e352a81ecee822702e 
  42.  
  43. S: d881142a8307f89ba51835734b27cb309a0fe855 127.0.0.1:6391 
  44.  
  45. replicates ab9da92d37125f24fe60f1f33688b4f8644612ee 
  46.  
  47. 然后輸入 yes,redis-trib.rb 開始執行 節點握手 和 槽分配 操作,輸出如下: 
  48.  
  49. Can I set the above configuration? (type 'yes' to accept): yes 
  50.  
  51. >>> Nodes configuration updated 
  52.  
  53. >>> Assign a different config epoch to each node 
  54.  
  55. >>> Sending CLUSTER MEET messages to join the cluster 
  56.  
  57. Waiting for the cluster to join.... 
  58.  
  59. >>> Performing Cluster Check (using node 127.0.0.1:6379) 
  60.  
  61. M: ad4b9ffceba062492ed67ab336657426f55874b7 127.0.0.1:6379 
  62.  
  63. slots:0-5460 (5461 slots) master 
  64.  
  65. 1 additional replica(s) 
  66.  
  67. M: ab9da92d37125f24fe60f1f33688b4f8644612ee 127.0.0.1:6381 
  68.  
  69. slots:10923-16383 (5461 slots) master 
  70.  
  71. 1 additional replica(s) 
  72.  
  73. S: 48e0a4b539867e01c66172415d94d748933be173 127.0.0.1:6390 
  74.  
  75. slots: (0 slots) slave 
  76.  
  77. replicates df23c6cad0654ba83f0422e352a81ecee822702e 
  78.  
  79. S: d881142a8307f89ba51835734b27cb309a0fe855 127.0.0.1:6391 
  80.  
  81. slots: (0 slots) slave 
  82.  
  83. replicates ab9da92d37125f24fe60f1f33688b4f8644612ee 
  84.  
  85. M: df23c6cad0654ba83f0422e352a81ecee822702e 127.0.0.1:6380 
  86.  
  87. slots:5461-10922 (5462 slots) master 
  88.  
  89. 1 additional replica(s) 
  90.  
  91. S: 25cfa11a2b4666021da5380ff332b80dbda97208 127.0.0.1:6389 
  92.  
  93. slots: (0 slots) slave 
  94.  
  95. replicates ad4b9ffceba062492ed67ab336657426f55874b7 
  96.  
  97. [OK] All nodes agree about slots configuration. 
  98.  
  99. >>> Check for open slots... 
  100.  
  101. >>> Check slots coverage... 
  102.  
  103. [OK] All 16384 slots covered. 

執行 集群檢查,檢查各個 redis 節點占用的 哈希槽(slot)的個數以及 slot 覆蓋率。16384 個槽位中,主節點 redis-6379、redis-6380 和 redis-6381 分別占用了 5461、5461 和 5462 個槽位。

3.3.3. redis主節點的日志

可以發現,通過 BGSAVE 命令,從節點 redis-6389 在 后臺 異步地從 主節點redis-6379 同步數據。

  1. $ cat log/redis-6379.log 
  2.  
  3. 1907:C 05 Sep 16:59:52.960 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo 
  4.  
  5. 1907:C 05 Sep 16:59:52.961 # Redis version=4.0.11, bits=64, commit=00000000, modified=0, pid=1907, just started 
  6.  
  7. 1907:C 05 Sep 16:59:52.961 # Configuration loaded 
  8.  
  9. 1908:M 05 Sep 16:59:52.964 * Increased maximum number of open files to 10032 (it was originally set to 256). 
  10.  
  11. 1908:M 05 Sep 16:59:52.965 * No cluster configuration found, I'm ad4b9ffceba062492ed67ab336657426f55874b7 
  12.  
  13. 1908:M 05 Sep 16:59:52.967 * Running mode=cluster, port=6379. 
  14.  
  15. 1908:M 05 Sep 16:59:52.967 # Server initialized 
  16.  
  17. 1908:M 05 Sep 16:59:52.967 * Ready to accept connections 
  18.  
  19. 1908:M 05 Sep 17:01:17.782 # configEpoch set to 1 via CLUSTER SET-CONFIG-EPOCH 
  20.  
  21. 1908:M 05 Sep 17:01:17.812 # IP address for this node updated to 127.0.0.1 
  22.  
  23. 1908:M 05 Sep 17:01:22.740 # Cluster state changed: ok 
  24.  
  25. 1908:M 05 Sep 17:01:23.681 * Slave 127.0.0.1:6389 asks for synchronization 
  26.  
  27. 1908:M 05 Sep 17:01:23.681 * Partial resynchronization not accepted: Replication ID mismatch (Slave asked for '4c5afe96cac51cde56039f96383ea7217ef2af41', my replication IDs are '037b661bf48c80c577d1fa937ba55367a3692921' and '0000000000000000000000000000000000000000'
  28.  
  29. 1908:M 05 Sep 17:01:23.681 * Starting BGSAVE for SYNC with target: disk 
  30.  
  31. 1908:M 05 Sep 17:01:23.682 * Background saving started by pid 1952 
  32.  
  33. 1952:C 05 Sep 17:01:23.683 * DB saved on disk 
  34.  
  35. 1908:M 05 Sep 17:01:23.749 * Background saving terminated with success 
  36.  
  37. 1908:M 05 Sep 17:01:23.752 * Synchronization with slave 127.0.0.1:6389 succeeded 

3.3.4. redis集群完整性檢測

使用 redis-trib.rb check 命令檢測之前創建的 兩個集群 是否成功,check 命令只需要給出集群中 任意一個節點地址 就可以完成 整個集群 的 檢查工作,命令如下:

  1. $ ./redis-trib.rb check 127.0.0.1:6379 

當最后輸出如下信息,提示集群 所有的槽 都已分配到節點:

  1. [OK] All nodes agree about slots configuration. 
  2.  
  3. >>> Check for open slots... 
  4.  
  5. >>> Check slots coverage... 
  6.  
  7. [OK] All 16384 slots covered. 

小結

本文介紹了 Redis 集群解決方案,數據分布 和 集群搭建。集群方案包括 客戶端分區 方案,代理分區 方案 和 查詢路由 方案。數據分布 部分簡單地對 節點取余 分區,一致性哈希 分區以及 虛擬槽 分區進行了闡述和對比。最后對使用 Redis-trib 搭建了一個 三主三從 的 虛擬槽 集群示例。

責任編輯:武曉燕 來源: 博客園
相關推薦

2020-04-21 22:59:50

Redis搭建選舉

2020-04-14 21:12:42

Redis集群Linux

2015-05-06 13:34:14

MySQL集群搭建

2021-03-16 11:10:37

Redis數據庫命令

2023-04-09 19:54:52

2017-02-27 21:55:04

LinuxCentOS 7.0Redis

2021-01-07 10:18:03

Redis數據庫環境搭建

2024-03-07 16:03:56

RedisDocker

2019-10-23 09:20:11

Redis集群主從復制

2023-04-27 07:52:56

Redis集群模式

2018-10-30 09:38:55

Redis集群實現

2017-07-11 13:30:12

RedisDockerLinux

2021-04-06 06:04:36

Redis 6.X C集群搭建操作系統

2024-04-03 00:00:00

Redis集群代碼

2023-04-07 08:28:14

2022-05-31 08:04:03

Redis高可用集群

2023-06-10 23:09:40

Redis場景內存

2010-08-12 13:15:26

MySQL集群

2010-08-12 15:30:10

MySQL集群

2020-06-01 16:05:17

MongoDB復制集數據庫
點贊
收藏

51CTO技術棧公眾號

蜜桃av乱码一区二区三区| 国产成人亚洲精品| 制服下的诱惑暮生| 香蕉久久aⅴ一区二区三区| 狠狠色丁香久久婷婷综| zzjj国产精品一区二区| 少妇高潮一69aⅹ| 美洲精品一卡2卡三卡4卡四卡| 成人av网站在线观看免费| 91av国产在线| 日本在线观看网址| 亚洲精品一区二区三区中文字幕| 五月婷婷激情综合| 色一情一乱一伦一区二区三区 | 国产欧美日韩电影| 亚洲五码中文字幕| 欧美一区2区三区4区公司二百| 真实新婚偷拍xxxxx| 一区二区中文字| 亚洲国产精品资源| 在线免费观看视频黄| 羞羞视频在线观看不卡| 91免费视频观看| 欧美一级片久久久久久久| 国产精品久久综合av爱欲tv| 成人不卡免费视频| 182午夜在线观看| 人妻互换一区二区激情偷拍| 亚洲码欧美码一区二区三区| 日本精品视频一区二区三区| 日韩精品手机在线观看| 精品美女视频在线观看免费软件 | 91免费在线观看网站| 日韩在线播放中文字幕| 亚洲综合专区| 亚洲人成网站777色婷婷| 国产不卡的av| 日韩成人影音| 婷婷国产在线综合| 色爽爽爽爽爽爽爽爽| 久草视频在线看| 成人av综合在线| 91九色综合久久| 精品成人久久久| 中文字幕av亚洲精品一部二部| 亚洲欧洲日本专区| 国产一级免费片| 精品国产第一国产综合精品| 欧洲精品一区二区| 日韩精品视频一区二区在线观看| 亚洲wwwww| 国产区在线观看成人精品 | 亚洲天天综合网| 国产亚洲在线| 国内成人精品一区| 九九热视频精品| 91久久电影| 综合国产在线观看| 中国女人特级毛片| 欧美男gay| 亚洲黄一区二区| 精品人妻二区中文字幕| 欧美日一区二区三区| 午夜精品国产更新| 欧美中文字幕在线观看视频| 99re热久久这里只有精品34| 久久精品亚洲乱码伦伦中文| 久久久久天天天天| 色婷婷综合视频| av在线这里只有精品| 成人欧美视频在线| 亚洲第一页综合| 国产成+人+日韩+欧美+亚洲| 91中文在线视频| 中文字幕日本人妻久久久免费| 久久精品日韩欧美| 国产精品成人国产乱一区 | 欧美精品丝袜中出| 在线能看的av网站| 成人在线精品| 精品国产一区久久| mm131丰满少妇人体欣赏图| 日韩av在线中文字幕| 蜜臀久久99精品久久久久久宅男 | 久久精品五月婷婷| 国产九九在线| 亚洲精品水蜜桃| 成人免费在线小视频| 成人免费一区| 亚洲福利小视频| 麻豆视频免费在线播放| 亚洲视频碰碰| 国产精品久久久久999| www.黄色小说.com| 久久一夜天堂av一区二区三区| 亚洲aⅴ天堂av在线电影软件| 国产一二三区在线观看| 精品欧美aⅴ在线网站| 国产又大又黄又粗又爽| 一区二区三区在线资源| 亚洲人成网站999久久久综合| 久艹在线观看视频| 欧美专区一区二区三区| 成人在线一区二区| 九色网友自拍视频手机在线| 亚洲视频免费在线观看| 国产综合免费视频| 欧美电影院免费观看| 亚洲系列中文字幕| 久久久久久久99| 久久er精品视频| 欧美精品人人做人人爱视频| 欧美寡妇性猛交xxx免费| 91成人免费在线| 亚洲中文字幕无码一区| 天天做天天爱天天综合网2021| 欧美在线观看网址综合| 亚洲第一色视频| 18成人在线视频| 999香蕉视频| 欧美精品中文| 欧美另类在线播放| 国产精品色综合| 中文字幕成人av| 农村妇女精品一二区| 爱高潮www亚洲精品| zzjj国产精品一区二区| www.久久网| 久久久久久亚洲综合影院红桃| 99er在线视频| 视频一区国产| 久久久精品网站| 在线观看免费中文字幕| 久久精品一区二区| aⅴ在线免费观看| 日本三级久久| 国外成人在线视频| 亚洲美女性生活| 亚洲一区二区欧美| 黑人巨大猛交丰满少妇| 欧美在线资源| 亚洲伊人第一页| jizz性欧美| 日韩欧美色电影| 精国产品一区二区三区a片| 国产精品影视在线| 四虎精品欧美一区二区免费| 99er精品视频| 欧美尺度大的性做爰视频| 国产精品一区二区黑人巨大| 综合久久久久综合| 亚洲一二三不卡| 亚洲男女av一区二区| 亚洲一区免费网站| 尤物视频在线看| 欧美大片在线观看| 久草精品视频在线观看| 99re视频精品| aⅴ在线免费观看| 超碰成人久久| 成人免费视频网址| 亚洲七七久久综合桃花剧情介绍| 欧美v国产在线一区二区三区| 亚洲欧美一区二区三区四区五区| 国产美女av一区二区三区| 大地资源网在线观看免费官网| 亚洲精品国产九九九| 97婷婷涩涩精品一区| 国产精品毛片一区二区三区四区| 欧美色手机在线观看| 国产67194| 成人免费看视频| 欧美一级黄色影院| 久久久久电影| 好吊妞www.84com只有这里才有精品 | 欧美国产97人人爽人人喊| 中文字幕22页| 亚洲图片在线| 日韩国产欧美精品| 日韩成人18| 欧洲中文字幕国产精品| 色开心亚洲综合| 精品99一区二区| 午夜视频网站在线观看| 一区二区三区四区视频精品免费 | 久久久精品三级| 亚洲电影影音先锋| 国产精品一 二 三| 亚洲日本在线观看视频| 久久99久久99精品免观看粉嫩 | 欧美一级视频在线播放| 精品视频97| yellow视频在线观看一区二区| 欧美大片免费高清观看| 欧美精品中文字幕一区| 国产午夜在线视频| 日韩精品一区二区三区视频| 中文字幕在线观看视频免费| 亚洲蜜臀av乱码久久精品 | 亚洲国产网址| 91网在线免费观看| 电影网一区二区| 欧美日韩国产第一页| 国产免费永久在线观看| 精品国产乱码久久久久久牛牛| 中文字幕欧美在线观看| 精品久久久久久国产91| 欧美 日韩 国产 一区二区三区| 91蝌蚪porny| 国产在线观看免费播放| 俺来俺也去www色在线观看| 成人av在线观| 五月天激情播播| 国产农村妇女精品一区二区| 免费看日b视频| 四虎成人精品永久免费av九九| 麻豆传媒一区二区| h视频久久久| 91久久久久久| 国产极品嫩模在线观看91精品| 欧美影院在线播放| 国产乱妇乱子在线播视频播放网站| 最近中文字幕2019免费| 免费毛片在线| 亚洲激情中文字幕| 亚洲奶汁xxxx哺乳期| 日韩一本二本av| 国产一区二区视频免费观看| 欧美综合欧美视频| 久久人人爽人人爽人人片av免费| 欧美日韩激情美女| 在线观看国产亚洲| 午夜视频一区二区| 激情综合网五月婷婷| 亚洲综合成人在线| 麻豆精品国产免费| 1区2区3区欧美| www.av成人| 亚洲欧洲美洲综合色网| 国产又粗又猛又爽又黄的视频四季| 久久久久久9999| 女女互磨互喷水高潮les呻吟| 久久影院午夜片一区| 中文字幕免费看| 久久久精品免费网站| 不卡一区二区在线观看| 久久综合狠狠综合| 天天躁日日躁aaaxxⅹ| 久久久久久久久久久黄色| 中文字幕免费高清| 国产色婷婷亚洲99精品小说| 午夜时刻免费入口| 欧美激情一区不卡| 日本美女黄色一级片| 亚洲欧美中日韩| 好吊日在线视频| 一区二区三区产品免费精品久久75| 欧美精品99久久久| 婷婷亚洲久悠悠色悠在线播放| 欧美bbbbbbbbbbbb精品| 色综合色狠狠天天综合色| 日本免费精品视频| 欧美精品一卡两卡| 亚洲欧美国产高清va在线播放| 99热播精品免费| 久久91精品国产91久久跳| 午夜伦理在线视频| 97婷婷涩涩精品一区| 人人视频精品| 国产色视频一区| 亚洲视频精选| 蜜桃传媒一区二区| 日韩国产综合| 国产一二三四区在线观看| 激情文学一区| 成人免费观看毛片| 精品一区二区成人精品| 国产精久久久久| 久久九九国产精品| 日本精品在线免费观看| 亚洲一区二区欧美| 日本三级一区二区三区| 欧美一区二区播放| 五月婷婷在线播放| www.久久久久| 欧美在线极品| 91老司机精品视频| 日韩有码中文字幕在线| 一区精品视频| 国产精品日本欧美一区二区三区| 欧美日韩在线观看不卡| 国产成人午夜高潮毛片| 国产一级久久久久毛片精品| 亚洲一区av在线| 国产日韩在线免费观看| 亚洲电影免费观看高清完整版在线| 国产女主播在线写真| 欧美激情一区二区三区久久久| 向日葵视频成人app网址| 亚洲综合小说区| 国产成人调教视频在线观看| 狠狠精品干练久久久无码中文字幕| 久久精品一区二区三区中文字幕| 亚洲av无一区二区三区久久| 久久日韩精品一区二区五区| 好吊色视频在线观看| 欧美色视频在线观看| 人成在线免费视频| 久久久久久久97| 白嫩亚洲一区二区三区| 欧美第一黄网| 99国产精品99久久久久久粉嫩| 天天综合天天添夜夜添狠狠添| wwwwxxxxx欧美| 久久无码精品丰满人妻| 欧美精品乱码久久久久久按摩 | 亚洲成人1区| 欧美日韩亚洲一区二区三区在线观看| 欧美激情偷拍| 国产一区二区在线观看免费视频| 久久久www免费人成精品| 人人干人人干人人干| 精品嫩草影院久久| 国产在线二区| 91日韩在线播放| 日韩一区欧美| www.激情小说.com| 一二三区精品| 精品国产三级a在线观看| 日本人视频jizz页码69| 成人综合激情网| 国产高潮流白浆| 欧美日韩国产影片| 激情小说 在线视频| 国产精品高潮呻吟久久| 国产精品96久久久久久| 国产精品高清无码| 精品国产青草久久久久福利| 国产福利在线播放麻豆| 91精品久久久久久久久青青| 欧美专区一区| 久久久999成人| 亚洲第一会所001| 欧美久久在线| 久久午夜激情| 中文字幕av久久爽一区| 色婷婷激情综合| 国产综合视频一区二区三区免费| 久久久噜噜噜久久| 久久久久免费看| 偷拍一区二区| 日韩av中文字幕在线播放| 久久午夜夜伦鲁鲁片| 高清日韩中文字幕| 99se婷婷在线视频观看| 欧美.www| 涩视频在线观看| 午夜精品福利一区二区三区av| 亚洲av激情无码专区在线播放| 57pao国产成人免费| 精品一区毛片| 欧美一级二级三级九九九| 免费成人动漫| 欧洲一区二区在线| 免费久久99精品国产| 疯狂撞击丝袜人妻| 日韩一区二区三区视频在线| 国产精品久久国产精品| 性国裸体高清亚洲| 色老头一区二区三区在线观看| 日本精品网站| 亚洲小说欧美另类激情| 国产精品一卡二| 亚洲日本韩国在线| 国产亚洲一区二区在线| 不卡精品视频| 亚洲美免无码中文字幕在线| 久久影视一区二区| 国产情侣在线播放| 久久久久久久久久婷婷| 国产综合久久久| 国产黄色一区二区三区 | 日本视频一区在线观看| 久久99日本精品| 自拍偷拍欧美亚洲| 色悠悠久久88| 国产主播性色av福利精品一区| 日本女优爱爱视频| 亚洲黄色小视频| 国产在线一二三| 97人人做人人人难人人做| 麻豆九一精品爱看视频在线观看免费| 免费成人美女女在线观看| 亚洲精品一区二区在线观看| 日韩制服诱惑| www.av中文字幕| 1024成人网| 国产小视频在线观看| 国产高清不卡av| 美女视频黄久久|