RedisCluster集羣(轉載)

前言

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

 

 

 

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

其他文章

正文

1. Redis集羣方案

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

1.1 客戶端分區方案

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

 

 

 

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

  • 優點

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

  • 缺點

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

1.2. 代理分區方案

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

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

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

 

 

 

代理分區 主流實現的有方案有 TwemproxyCodis

1.2.1. Twemproxy

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

 

 

 

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

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

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 (維護連接緩存路由表MultiOpPipeline 支持)。Failover 節點的 檢測過慢,不如 中心節點 ZooKeeper 及時。Gossip 消息具有一定開銷。無法根據統計區分 冷熱數據

2. 數據分佈

2.1. 數據分佈理論

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

 

 

 

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

分區方式 特點 相關產品
哈希分區 離散程度好,數據分佈與業務無關,無法順序訪問 Redis Cluster,Cassandra,Dynamo
順序分區 離散程度易傾斜,數據分佈與業務相關,可以順序訪問 BigTable,HBase,Hypertable

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

2.1.1. 節點取餘分區

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

 

 

 

  • 優點

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

  • 缺點

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

2.1.2. 一致性哈希分區

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

 

 

 

  • 優點

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

  • 缺點

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

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

2.1.3. 虛擬槽分區

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

 

 

 

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

  • 節點1: 包含 03276 號哈希槽。
  • 節點2:包含 32776553 號哈希槽。
  • 節點3:包含 65549830 號哈希槽。
  • 節點4:包含 983113107 號哈希槽。
  • 節點5:包含 1310816383 號哈希槽。

這種結構很容易 添加 或者 刪除 節點。如果 增加 一個節點 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 批量操作 支持有限。

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

  • key 事務操作 支持有限。

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

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

不能將一個 大的鍵值 對象如 hashlist 等映射到 不同的節點

  • 不支持 多數據庫空間

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

  • 複製結構 只支持一層

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

3. Redis集羣搭建

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

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

3.1. 準備節點

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

Redis 集羣的節點規劃如下:

節點名稱 端口號 是主是從 所屬主節點
redis-6379 6379 主節點 ---
redis-6389 6389 從節點 redis-6379
redis-6380 6380 主節點 ---
redis-6390 6390 從節點 redis-6380
redis-6381 6381 主節點 ---
redis-6391 6391 從節點 redis-6381

注意:建議爲集羣內 所有節點 統一目錄,一般劃分三個目錄:confdatalog,分別存放 配置數據日誌 相關文件。把 6 個節點配置統一放在 conf 目錄下。

3.1.1. 創建redis各實例目錄

$ 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,以下只是搭建集羣需要的 基本配置,可能需要根據實際情況做修改。

# redis後臺運行
daemonize yes
# 綁定的主機端口
bind 127.0.0.1
# 數據存放目錄
dir /usr/local/redis-cluster/data/redis-6379
# 進程文件
pidfile /var/run/redis-cluster/${自定義}.pid
# 日誌文件
logfile /usr/local/redis-cluster/log/${自定義}.log
# 端口號
port 6379
# 開啓集羣模式,把註釋#去掉
cluster-enabled yes
# 集羣的配置,配置文件首次啓動自動生成
cluster-config-file /usr/local/redis-cluster/conf/${自定義}.conf
# 請求超時,設置10秒
cluster-node-timeout 10000
# aof日誌開啓,有需要就開啓,它會每次寫操作都記錄一條日誌
appendonly yes
複製代碼
  • redis-6379.conf
daemonize yes
bind 127.0.0.1
dir /usr/local/redis-cluster/data/redis-6379
pidfile /var/run/redis-cluster/redis-6379.pid
logfile /usr/local/redis-cluster/log/redis-6379.log
port 6379
cluster-enabled yes
cluster-config-file /usr/local/redis-cluster/conf/node-6379.conf
cluster-node-timeout 10000
appendonly yes
複製代碼
  • redis-6389.conf
daemonize yes
bind 127.0.0.1
dir /usr/local/redis-cluster/data/redis-6389
pidfile /var/run/redis-cluster/redis-6389.pid
logfile /usr/local/redis-cluster/log/redis-6389.log
port 6389
cluster-enabled yes
cluster-config-file /usr/local/redis-cluster/conf/node-6389.conf
cluster-node-timeout 10000
appendonly yes
複製代碼
  • redis-6380.conf
daemonize yes
bind 127.0.0.1
dir /usr/local/redis-cluster/data/redis-6380
pidfile /var/run/redis-cluster/redis-6380.pid
logfile /usr/local/redis-cluster/log/redis-6380.log
port 6380
cluster-enabled yes
cluster-config-file /usr/local/redis-cluster/conf/node-6380.conf
cluster-node-timeout 10000
appendonly yes
複製代碼
  • redis-6390.conf
daemonize yes
bind 127.0.0.1
dir /usr/local/redis-cluster/data/redis-6390
pidfile /var/run/redis-cluster/redis-6390.pid
logfile /usr/local/redis-cluster/log/redis-6390.log
port 6390
cluster-enabled yes
cluster-config-file /usr/local/redis-cluster/conf/node-6390.conf
cluster-node-timeout 10000
appendonly yes
複製代碼
  • redis-6381.conf
daemonize yes
bind 127.0.0.1
dir /usr/local/redis-cluster/data/redis-6381
pidfile /var/run/redis-cluster/redis-6381.pid
logfile /usr/local/redis-cluster/log/redis-6381.log
port 6381
cluster-enabled yes
cluster-config-file /usr/local/redis-cluster/conf/node-6381.conf
cluster-node-timeout 10000
appendonly yes
複製代碼
  • redis-6391.conf
daemonize yes
bind 127.0.0.1
dir /usr/local/redis-cluster/data/redis-6391
pidfile /var/run/redis-cluster/redis-6391.pid
logfile /usr/local/redis-cluster/log/redis-6391.log
port 6391
cluster-enabled yes
cluster-config-file /usr/local/redis-cluster/conf/node-6391.conf
cluster-node-timeout 10000
appendonly yes
複製代碼

3.2. 環境準備

3.2.1. 安裝Ruby環境

$ sudo brew install ruby
複製代碼

3.2.2. 準備rubygem redis依賴

$ sudo gem install redis
Password:
Fetching: redis-4.0.2.gem (100%)
Successfully installed redis-4.0.2
Parsing documentation for redis-4.0.2
Installing ri documentation for redis-4.0.2
Done installing documentation for redis after 1 seconds
1 gem installed
複製代碼

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

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

$ sudo cp /usr/local/redis-4.0.11/src/redis-trib.rb /usr/local/redis-cluster
複製代碼

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

$ ./redis-trib.rb 
Usage: redis-trib <command> <options> <arguments ...>

  create          host1:port1 ... hostN:portN
                  --replicas <arg>
  check           host:port
  info            host:port
  fix             host:port
                  --timeout <arg>
  reshard         host:port
                  --from <arg>
                  --to <arg>
                  --slots <arg>
                  --yes
                  --timeout <arg>
                  --pipeline <arg>
  rebalance       host:port
                  --weight <arg>
                  --auto-weights
                  --use-empty-masters
                  --timeout <arg>
                  --simulate
                  --pipeline <arg>
                  --threshold <arg>
  add-node        new_host:new_port existing_host:existing_port
                  --slave
                  --master-id <arg>
  del-node        host:port node_id
  set-timeout     host:port milliseconds
  call            host:port command arg arg .. arg
  import          host:port
                  --from <arg>
                  --copy
                  --replace
  help            (show this help)

For check, fix, reshard, del-node, set-timeout you can specify the host and port of any working node in the cluster.
複製代碼

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

命令 作用
create 創建集羣
check 檢查集羣
info 查看集羣信息
fix 修復集羣
reshard 在線遷移slot
rebalance 平衡集羣節點slot數量
add-node 將新節點加入集羣
del-node 從集羣中刪除節點
set-timeout 設置集羣節點間心跳連接的超時時間
call 在集羣全部節點上執行命令
import 將外部redis數據導入集羣

3.3. 安裝集羣

3.3.1. 啓動redis服務節點

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

sudo redis-server conf/redis-6379.conf
sudo redis-server conf/redis-6389.conf
sudo redis-server conf/redis-6380.conf
sudo redis-server conf/redis-6390.conf
sudo redis-server conf/redis-6381.conf
sudo redis-server conf/redis-6391.conf
複製代碼

啓動完成後,redis 以集羣模式啓動,查看各個 redis 節點的進程狀態:

$ ps -ef | grep redis-server
    0  1908     1   0  4:59下午 ??         0:00.01 redis-server *:6379 [cluster] 
    0  1911     1   0  4:59下午 ??         0:00.01 redis-server *:6389 [cluster] 
    0  1914     1   0  4:59下午 ??         0:00.01 redis-server *:6380 [cluster] 
    0  1917     1   0  4:59下午 ??         0:00.01 redis-server *:6390 [cluster] 
    0  1920     1   0  4:59下午 ??         0:00.01 redis-server *:6381 [cluster] 
    0  1923     1   0  4:59下午 ??         0:00.01 redis-server *:6391 [cluster] 
複製代碼

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

$ tree -L 3 .
.
├── appendonly.aof
├── conf
│   ├── node-6379.conf
│   ├── node-6380.conf
│   ├── node-6381.conf
│   ├── node-6389.conf
│   ├── node-6390.conf
│   ├── node-6391.conf
│   ├── redis-6379.conf
│   ├── redis-6380.conf
│   ├── redis-6381.conf
│   ├── redis-6389.conf
│   ├── redis-6390.conf
│   └── redis-6391.conf
├── data
│   ├── redis-6379
│   ├── redis-6380
│   ├── redis-6381
│   ├── redis-6389
│   ├── redis-6390
│   └── redis-6391
├── log
│   ├── redis-6379.log
│   ├── redis-6380.log
│   ├── redis-6381.log
│   ├── redis-6389.log
│   ├── redis-6390.log
│   └── redis-6391.log
└── redis-trib.rb

9 directories, 20 files
複製代碼

3.3.2. redis-trib關聯集羣節點

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

$ 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-6379redis-6380redis-6381。然後將各個 從節點 指向 主節點,進行 數據同步

>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
127.0.0.1:6379
127.0.0.1:6380
127.0.0.1:6381
Adding replica 127.0.0.1:6390 to 127.0.0.1:6379
Adding replica 127.0.0.1:6391 to 127.0.0.1:6380
Adding replica 127.0.0.1:6389 to 127.0.0.1:6381
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: ad4b9ffceba062492ed67ab336657426f55874b7 127.0.0.1:6379
   slots:0-5460 (5461 slots) master
M: df23c6cad0654ba83f0422e352a81ecee822702e 127.0.0.1:6380
   slots:5461-10922 (5462 slots) master
M: ab9da92d37125f24fe60f1f33688b4f8644612ee 127.0.0.1:6381
   slots:10923-16383 (5461 slots) master
S: 25cfa11a2b4666021da5380ff332b80dbda97208 127.0.0.1:6389
   replicates ad4b9ffceba062492ed67ab336657426f55874b7
S: 48e0a4b539867e01c66172415d94d748933be173 127.0.0.1:6390
   replicates df23c6cad0654ba83f0422e352a81ecee822702e
S: d881142a8307f89ba51835734b27cb309a0fe855 127.0.0.1:6391
   replicates ab9da92d37125f24fe60f1f33688b4f8644612ee
複製代碼

然後輸入 yesredis-trib.rb 開始執行 節點握手槽分配 操作,輸出如下:

Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join....
>>> Performing Cluster Check (using node 127.0.0.1:6379)
M: ad4b9ffceba062492ed67ab336657426f55874b7 127.0.0.1:6379
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
M: ab9da92d37125f24fe60f1f33688b4f8644612ee 127.0.0.1:6381
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)
S: 48e0a4b539867e01c66172415d94d748933be173 127.0.0.1:6390
   slots: (0 slots) slave
   replicates df23c6cad0654ba83f0422e352a81ecee822702e
S: d881142a8307f89ba51835734b27cb309a0fe855 127.0.0.1:6391
   slots: (0 slots) slave
   replicates ab9da92d37125f24fe60f1f33688b4f8644612ee
M: df23c6cad0654ba83f0422e352a81ecee822702e 127.0.0.1:6380
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
S: 25cfa11a2b4666021da5380ff332b80dbda97208 127.0.0.1:6389
   slots: (0 slots) slave
   replicates ad4b9ffceba062492ed67ab336657426f55874b7
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
複製代碼

執行 集羣檢查,檢查各個 redis 節點佔用的 哈希槽slot)的個數以及 slot 覆蓋率16384 個槽位中,主節點 redis-6379redis-6380redis-6381 分別佔用了 546154615462 個槽位。

3.3.3. redis主節點的日誌

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

$ cat log/redis-6379.log 
1907:C 05 Sep 16:59:52.960 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1907:C 05 Sep 16:59:52.961 # Redis version=4.0.11, bits=64, commit=00000000, modified=0, pid=1907, just started
1907:C 05 Sep 16:59:52.961 # Configuration loaded
1908:M 05 Sep 16:59:52.964 * Increased maximum number of open files to 10032 (it was originally set to 256).
1908:M 05 Sep 16:59:52.965 * No cluster configuration found, I'm ad4b9ffceba062492ed67ab336657426f55874b7
1908:M 05 Sep 16:59:52.967 * Running mode=cluster, port=6379.
1908:M 05 Sep 16:59:52.967 # Server initialized
1908:M 05 Sep 16:59:52.967 * Ready to accept connections
1908:M 05 Sep 17:01:17.782 # configEpoch set to 1 via CLUSTER SET-CONFIG-EPOCH
1908:M 05 Sep 17:01:17.812 # IP address for this node updated to 127.0.0.1
1908:M 05 Sep 17:01:22.740 # Cluster state changed: ok
1908:M 05 Sep 17:01:23.681 * Slave 127.0.0.1:6389 asks for synchronization
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')
1908:M 05 Sep 17:01:23.681 * Starting BGSAVE for SYNC with target: disk
1908:M 05 Sep 17:01:23.682 * Background saving started by pid 1952
1952:C 05 Sep 17:01:23.683 * DB saved on disk
1908:M 05 Sep 17:01:23.749 * Background saving terminated with success
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 命令只需要給出集羣中 任意一個節點地址 就可以完成 整個集羣檢查工作,命令如下:

$ ./redis-trib.rb check 127.0.0.1:6379
複製代碼

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

[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
複製代碼

小結

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


轉載
鏈接:https://juejin.im/post/5b8fc5536fb9a05d2d01fb11

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章