redis集羣搭建及原理

集羣簡介
-redis集羣架構設計html

  • cluster集羣架構搭建

現狀問題
業務發展過程當中遇到的峯值瓶頸node

  • redis提供的服務ops能夠達到10萬/秒,當前業務ops已經達到20萬/秒
  • 內存單機容量達到256G,當前業務需求內存容量1T

集羣做用redis

  • 分散單臺服務器的訪問壓力,實現負載均衡
  • 分散單臺服務器的存儲壓力,實現可擴展性
  • 下降單臺服務器宕機帶來的業務災難

三版本系列redis開始支持集羣算法

redis集羣搭建及原理

如下摘抄於官網
http://www.redis.cn/topics/cluster-tutorial.html
Redis集羣介紹
Redis 集羣是一個提供在多個Redis間節點間共享數據的程序集。數據庫

Redis集羣並不支持處理多個keys的命令,由於這須要在不一樣的節點間移動數據,從而達不到像Redis那樣的性能,在高負載的狀況下可能會致使不可預料的錯誤.ruby

Redis 集羣經過分區來提供必定程度的可用性,在實際環境中當某個節點宕機或者不可達的狀況下繼續處理命令. Redis 集羣的優點:服務器

自動分割數據到不一樣的節點上。
整個集羣的部分節點失敗或者不可達的狀況下可以繼續處理命令。
Redis 集羣的數據分片
Redis 集羣沒有使用一致性hash, 而是引入了 哈希槽的概念.網絡

Redis 集羣有16384個哈希槽,每一個key經過CRC16校驗後對16384取模來決定放置哪一個槽.集羣的每一個節點負責一部分hash槽,舉個例子,好比當前集羣有3個節點,那麼:架構

節點 A 包含 0 到 5500號哈希槽.
節點 B 包含5501 到 11000 號哈希槽.
節點 C 包含11001 到 16384號哈希槽.
這種結構很容易添加或者刪除節點. 好比若是我想新添加個節點D, 我須要從節點 A, B, C中得部分槽到D上. 若是我想移除節點A,須要將A中的槽移到B和C節點上,而後將沒有任何槽的A節點從集羣中移除便可. 因爲從一個節點將哈希槽移動到另外一個節點並不會中止服務,因此不管添加刪除或者改變某個節點的哈希槽的數量都不會形成集羣不可用的狀態.app

Redis 集羣的主從複製模型
爲了使在部分節點失敗或者大部分節點沒法通訊的狀況下集羣仍然可用,因此集羣使用了主從複製模型,每一個節點都會有N-1個複製品.

在咱們例子中具備A,B,C三個節點的集羣,在沒有複製模型的狀況下,若是節點B失敗了,那麼整個集羣就會覺得缺乏5501-11000這個範圍的槽而不可用.

然而若是在集羣建立的時候(或者過一段時間)咱們爲每一個節點添加一個從節點A1,B1,C1,那麼整個集羣便有三個master節點和三個slave節點組成,這樣在節點B失敗後,集羣便會選舉B1爲新的主節點繼續服務,整個集羣便不會由於槽找不到而不可用了

不過當B和B1 都失敗後,集羣是不可用的.

Redis 一致性保證
Redis 並不能保證數據的強一致性. 這意味這在實際中集羣在特定的條件下可能會丟失寫操做.

第一個緣由是由於集羣是用了異步複製. 寫操做過程:

客戶端向主節點B寫入一條命令.
主節點B向客戶端回覆命令狀態.
主節點將寫操做複製給他得從節點 B1, B2 和 B3.
主節點對命令的複製工做發生在返回命令回覆以後, 由於若是每次處理命令請求都須要等待複製操做完成的話, 那麼主節點處理命令請求的速度將極大地下降 —— 咱們必須在性能和一致性之間作出權衡。 注意:Redis 集羣可能會在未來提供同步寫的方法。 Redis 集羣另一種可能會丟失命令的狀況是集羣出現了網絡分區, 而且一個客戶端與至少包括一個主節點在內的少數實例被孤立。

舉個例子 假設集羣包含 A 、 B 、 C 、 A1 、 B1 、 C1 六個節點, 其中 A 、B 、C 爲主節點, A1 、B1 、C1 爲A,B,C的從節點, 還有一個客戶端 Z1 假設集羣中發生網絡分區,那麼集羣可能會分爲兩方,大部分的一方包含節點 A 、C 、A1 、B1 和 C1 ,小部分的一方則包含節點 B 和客戶端 Z1 .

Z1仍然可以向主節點B中寫入, 若是網絡分區發生時間較短,那麼集羣將會繼續正常運做,若是分區的時間足夠讓大部分的一方將B1選舉爲新的master,那麼Z1寫入B中得數據便丟失了.

注意, 在網絡分裂出現期間, 客戶端 Z1 能夠向主節點 B 發送寫命令的最大時間是有限制的, 這一時間限制稱爲節點超時時間(node timeout), 是 Redis 集羣的一個重要的配置選項:

redis集羣結構設計

數據存儲設計
redis集羣搭建及原理

redis集羣搭建及原理

當增長新的機器的時候,會將其餘一部分機器的哈希槽分配一部分給新的機器,機器減小一樣道理,會把老機器哈希槽分配給其餘機器,而後移掉減小的機器

redis集羣搭建及原理

當一臺計算機須要經過一個key尋找相應的數據,則會經過key通過他的crc算法及取模找到應的槽位置,若是命中則直接返回,若是沒有,該哈希槽會告知你具體位置,則最多兩次便可命中數據,即一次命中直接返回,一次未命中,告知具體位置

集羣搭建
環境準備,單機多實例,三主三從
一、解壓reis到/opt/redis/,建立conf目錄,建立redis.conf文件

[root@CombCloud-2020110836 conf]# pwd
/opt/redis-5.0.9/conf
[root@CombCloud-2020110836 conf]# ll
total 4
-rw-r--r-- 1 root yanght 287 Jun 10 06:57 redis-6379.conf
[root@CombCloud-2020110836 conf]# cat redis-6379.conf 
port 6379
daemonize no
dir "/data/redis/data"
dbfilename "dump-6379.rdb"
rdbcompression yes
rdbchecksum yes
save 10 2
appendonly yes
appendfsync always
appendfilename "appendonly-6379.aof"
bind 127.0.0.1
cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 10000

cluster-enabled yes 設置加入cluster,成爲期中的節點
cluster-config-file redis cluster配置文件名,該文件屬於自動生成,僅用於快速查找文件並查詢文件內容
cluster-node-time 節點響應服務超時時間,用於斷定該節點是否下線或切換爲從節點
cluster-migration-barrier master鏈接的slave最小數量

[root@CombCloud-2020110836 conf]# sed "s/6379/6380/g" redis-6379.conf > redis-6380.conf    
[root@CombCloud-2020110836 conf]# sed "s/6379/6381/g" redis-6379.conf > redis-6381.conf 
[root@CombCloud-2020110836 conf]# sed "s/6379/6382/g" redis-6379.conf > redis-6382.conf 
[root@CombCloud-2020110836 conf]# sed "s/6379/6383/g" redis-6379.conf > redis-6383.conf  
[root@CombCloud-2020110836 conf]# sed "s/6379/6384/g" redis-6379.conf > redis-6384.conf

二、啓動集羣

[root@CombCloud-2020110836 conf]# /opt/redis-5.0.9/src/redis-server /opt/redis-5.0.9/conf/redis-6379.conf 
[root@CombCloud-2020110836 conf]# /opt/redis-5.0.9/src/redis-server /opt/redis-5.0.9/conf/redis-6380.conf 
[root@CombCloud-2020110836 conf]# /opt/redis-5.0.9/src/redis-server /opt/redis-5.0.9/conf/redis-6381.conf 
[root@CombCloud-2020110836 conf]# /opt/redis-5.0.9/src/redis-server /opt/redis-5.0.9/conf/redis-6382.conf [root@CombCloud-2020110836 conf]# /opt/redis-5.0.9/src/redis-server /opt/redis-5.0.9/conf/redis-6383.conf [root@CombCloud-2020110836 conf]# /opt/redis-5.0.9/src/redis-server /opt/redis-5.0.9/conf/redis-6384.conf

三、查看進程狀態變爲集羣狀態
redis集羣搭建及原理

四、查看已生成集配置文件
redis集羣搭建及原理

五、建立redis集羣
之前版本的是用redis-trib建立集羣,redis-trib.rb是ruby程序寫的,須要安裝ruby和gem
本人用的是5.0.4,因此是使用redis-cli來建立集羣
./redis-cli --cluster 建立集羣命令參數
create --cluster-replicas 1 後面跟着的1是指1個主帶幾個從,舉例:若是寫了3,即1主3從
最後面輸入主機及IP,最前面三位是Master,最後面三位是slave,即前面master,後面slave

[root@CombCloud-2020110836 src]# pwd
/opt/redis-5.0.9/src
[root@CombCloud-2020110836 src]# ./redis-cli --cluster create --cluster-replicas 1 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384

Performing hash slots allocation on 6 nodes... # 在6個節點上分配哈希插槽分.
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922 # 給三個maste分配哈希槽位置
Master[2] -> Slots 10923 - 16383
Adding replica 127.0.0.1:6383 to 127.0.0.1:6379
Adding replica 127.0.0.1:6384 to 127.0.0.1:6380 # 添加主從,前面從後面主
Adding replica 127.0.0.1:6382 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: 702431a6121e2b6337955b6013790e6c6a33e172 127.0.0.1:6379 # 第一位M即爲master,後面爲ID號
slots:[0-5460] (5461 slots) master # 給master分配的哈希槽
M: 8e60df355d1ad7bb9efedda4160089d41ba7ee87 127.0.0.1:6380
slots:[5461-10922] (5462 slots) master
M: 9e093e46c3111fc1d3776347efeaab47b4a97da0 127.0.0.1:6381
slots:[10923-16383] (5461 slots) master
S: eb7371b52e7a08159b83d8883fcaf4c346621438 127.0.0.1:6382 # s表明slave,後面跟着的是id號,
replicates 9e093e46c3111fc1d3776347efeaab47b4a97da0 # slave沒有哈希槽
S: 2b1154e7b108d895439f14a97db5e9e5eb1ceffc 127.0.0.1:6383
replicates 702431a6121e2b6337955b6013790e6c6a33e172
S: dbeb3765fdee8644f14548d1c754e640275ef867 127.0.0.1:6384
replicates 8e60df355d1ad7bb9efedda4160089d41ba7ee87
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: 702431a6121e2b6337955b6013790e6c6a33e172 127.0.0.1:6379
slots:[0-5460] (5461 slots) master
1 additional replica(s)
S: 2b1154e7b108d895439f14a97db5e9e5eb1ceffc 127.0.0.1:6383
slots: (0 slots) slave
replicates 702431a6121e2b6337955b6013790e6c6a33e172
S: eb7371b52e7a08159b83d8883fcaf4c346621438 127.0.0.1:6382
slots: (0 slots) slave
replicates 9e093e46c3111fc1d3776347efeaab47b4a97da0
S: dbeb3765fdee8644f14548d1c754e640275ef867 127.0.0.1:6384
slots: (0 slots) slave
replicates 8e60df355d1ad7bb9efedda4160089d41ba7ee87
M: 9e093e46c3111fc1d3776347efeaab47b4a97da0 127.0.0.1:6381
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
M: 8e60df355d1ad7bb9efedda4160089d41ba7ee87 127.0.0.1:6380
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
[OK] All nodes agree about slots configuration.
Check for open slots...
Check slots coverage...
[OK] All 16384 slots covered. # 16384個槽已經分配覆蓋完畢

 
   

六、查看集羣配置文件

[root@CombCloud-2020110836 data]# pwd
/data/redis/data
[root@CombCloud-2020110836 data]# cat nodes-6379.conf 
702431a6121e2b6337955b6013790e6c6a33e172 127.0.0.1:6379@16379 myself,master - 0 1591793969000 1 connected 0-5460 # myself表示他自已,分配了0-5460個槽
2b1154e7b108d895439f14a97db5e9e5eb1ceffc 127.0.0.1:6383@16383 slave 702431a6121e2b6337955b6013790e6c6a33e172 0 1591793968000 5 connected
eb7371b52e7a08159b83d8883fcaf4c346621438 127.0.0.1:6382@16382 slave 9e093e46c3111fc1d3776347efeaab47b4a97da0 0 1591793969000 4 connected
dbeb3765fdee8644f14548d1c754e640275ef867 127.0.0.1:6384@16384 slave 8e60df355d1ad7bb9efedda4160089d41ba7ee87 0 1591793968000 6 connected
9e093e46c3111fc1d3776347efeaab47b4a97da0 127.0.0.1:6381@16381 master - 0 1591793967705 3 connected 10923-16383
8e60df355d1ad7bb9efedda4160089d41ba7ee87 127.0.0.1:6380@16380 master - 0 1591793969709 2 connected 5461-10922  # 第二個主槽的分配狀況
vars currentEpoch 6 lastVoteEpoch 0
[root@CombCloud-2020110836 data]# cat nodes-6380.conf   
8e60df355d1ad7bb9efedda4160089d41ba7ee87 127.0.0.1:6380@16380 myself,master - 0 1591793969000 2 connected 5461-10922
9e093e46c3111fc1d3776347efeaab47b4a97da0 127.0.0.1:6381@16381 master - 0 1591793972000 3 connected 10923-16383
eb7371b52e7a08159b83d8883fcaf4c346621438 127.0.0.1:6382@16382 slave 9e093e46c3111fc1d3776347efeaab47b4a97da0 0 1591793971583 3 connected
2b1154e7b108d895439f14a97db5e9e5eb1ceffc 127.0.0.1:6383@16383 slave 702431a6121e2b6337955b6013790e6c6a33e172 0 1591793970000 1 connected
dbeb3765fdee8644f14548d1c754e640275ef867 127.0.0.1:6384@16384 slave 8e60df355d1ad7bb9efedda4160089d41ba7ee87 0 1591793972584 6 connected
702431a6121e2b6337955b6013790e6c6a33e172 127.0.0.1:6379@16379 master - 0 1591793971000 1 connected 0-5460
vars currentEpoch 6 lastVoteEpoch 0
[root@CombCloud-2020110836 data]# cat nodes-6383.conf  
2b1154e7b108d895439f14a97db5e9e5eb1ceffc 127.0.0.1:6383@16383 myself,slave  702431a6121e2b6337955b6013790e6c6a33e172 0 1591793968000 5 connected
9e093e46c3111fc1d3776347efeaab47b4a97da0 127.0.0.1:6381@16381 master - 0 1591793967000 3 connected 10923-16383
8e60df355d1ad7bb9efedda4160089d41ba7ee87 127.0.0.1:6380@16380 master - 0 1591793969000 2 connected 5461-10922
702431a6121e2b6337955b6013790e6c6a33e172 127.0.0.1:6379@16379 master - 0 1591793969000 1 connected 0-5460
dbeb3765fdee8644f14548d1c754e640275ef867 127.0.0.1:6384@16384 slave 8e60df355d1ad7bb9efedda4160089d41ba7ee87 0 1591793968000 6 connected
eb7371b52e7a08159b83d8883fcaf4c346621438 127.0.0.1:6382@16382 slave 9e093e46c3111fc1d3776347efeaab47b4a97da0 0 1591793969412 4 connected

七、再次查看redis6379實例啓動日誌
redis集羣搭建及原理

八、再查看6383實例的redis日誌輸出可看到在連master6379
redis集羣搭建及原理

九、集羣客戶端交互須要加-c參數
redis集羣搭建及原理
可看到重定現到6380實例的5798槽

redis集羣搭建及原理
在6384實例登錄,get可查看到重定到6380查詢

故障轉移過程 演示
關閉從6384端口
redis集羣搭建及原理

查看主標記斷開鏈接
redis集羣搭建及原理

重新啓動從斷開主
redis集羣搭建及原理
能夠看到從數據庫日誌輸出
同步失敗消記錄,還有集羣狀態從失敗到正常

登錄交互式查看集羣狀態
redis集羣搭建及原理
6381是一個已經失敗的集羣狀態
6382成爲master

再次啓動6381看到在鏈接6382master
redis集羣搭建及原理
查看集羣節點6381已成爲從
redis集羣搭建及原理

cluster節點操做命令查看集羣節點信息cluster nodes進入一個從節點redis,切換其主節點cluster replicate <master-id>發現一個新節點,新增主點點cluster meet ip:port忽略一個沒有solf的節點cluster forget <id>手動故障轉移cluster failover

相關文章
相關標籤/搜索