Redis哨兵集羣模式,每一個節點都保存全量同步數據,冗餘的數據比較多;而在Redis Cluster模式中集羣中採用分片集羣模式,能夠減小冗餘數據,缺點就是構建該集羣模式成本很是高node
Redis 集羣沒有使用一致性hash, 而是引入了 哈希槽的概念.redis
Redis3.0開始官方推出了集羣模式 RedisCluster,原理採用hash槽的概念,預先分配16384個卡槽,而且將該卡槽分配給具體服務的節點;經過key進行crc16(key)%16384 獲取餘數,餘數就是對應的卡槽的位置,一個卡槽能夠存放多個不一樣的key,從而將讀或者寫轉發到該卡槽的服務的節點。 最大的有點:動態擴容、縮容。服務器
摘要:2018年10月 Redis 發佈了最新穩定版本 5.0 版本,推出了各類新特性,其中一點是放棄 Ruby的集羣方式,改成使用 C語言編寫的 redis-cli的方式,使集羣的構建方式複雜度大大下降。架構
咱們先來看一下redis-cluster架構圖,以下圖所示。能夠看到Redis集羣是沒有統一入口的,採用的是去中心化設計思想,客戶端連集羣中的哪臺設備都行,集羣中各個設備之間都定時進行交互,以便知道節點是否還正常工做。ui
環境搭建開始:spa
一、安裝Redis5.0 安裝Redis5.0連接:Linux下安裝Redis.net
二、建立 redis-cluster目錄,方便咱們管理建立的六個redis實例,並複製一份以前搭建好的redis,重命名爲rediscluster設計
mkdir rediscluster3d
cd rediscluster/code
mkdir redis7000 redis7001 redis7002 redis7003 redis7004 redis7005
3.在文件夾 7000 至 7005 中, 各建立一個 redis.conf 文件,記得將配置中的端口號從 7000 改成與文件夾名字相同的號碼。
每一個配置文件內容
daemonize yes #後臺啓動
protected-mode no ; ## 容許外部訪問
port 7005 #修改端口號,從7000到7005
cluster-enabled yes #開啓cluster,去掉註釋
cluster-config-file 7000nodes.conf #自動生成
cluster-node-timeout 15000 #節點通訊時間
logfile /usr/rediscluster/redis7005/redis.log
- cluster-enabled
<yes/no>
:若是yes:則在特定的Redis實例中啓用Redis Cluster支持。no:該實例將像往常同樣做爲獨立實例啓動。- cluster-config-file
<filename>
:請注意,儘管有此選項的名稱,但它不是用戶可編輯的配置文件,而是Redis Cluster節點每次發生更改時都會自動持久保存集羣配置的文件(狀態,基本上是狀態),爲了可以在啓動時從新閱讀它。該文件列出了諸如羣集中其餘節點之類的內容,它們的狀態,持久變量等等。一般,因爲收到某些消息,此文件將被重寫並刷新到磁盤上。- cluster-node-timeout
<milliseconds>
:Redis羣集節點不可用的最長時間(不將其視爲失敗)。若是主節點沒法訪問的時間超過指定的時間長度,則它的從節點將對其進行故障轉移。此參數控制Redis Cluster中的其餘重要事項。值得注意的是,在指定的時間內沒法到達大多數主節點的每一個節點都將中止接受查詢。- cluster-slave-validity-factor
<factor>
:若是設置爲零,則從服務器將始終嘗試對主服務器進行故障轉移,而無論主服務器和從服務器之間的連接保持斷開狀態的時間長短。若是該值爲正,則將最大斷開時間計算爲節點超時值乘以此選項提供的係數,若是節點是從節點,則若是斷開主連接的時間超過指定的時間,它將不會嘗試啓動故障轉移。例如,若是節點超時設置爲5秒,而有效性因子設置爲10,則從服務器與主服務器斷開鏈接超過50秒將不會嘗試對其主服務器進行故障轉移。請注意,若是沒有從屬可以對其進行故障轉移,則任何非零的值均可能致使Redis羣集在主服務器發生故障後不可用。在這種狀況下,只有當原始主服務器從新加入集羣后,集羣纔會返回可用狀態。- cluster-migration-barrier
<count>
:一個主機將保持鏈接的最小數量的從機,以便另外一個從機遷移到再也不被任何從機覆蓋的主機。有關更多信息,請參見本教程中有關副本遷移的相應部分。- cluster-require-full-coverage
<yes/no>
:若是設置爲yes,默認狀況下,若是某個節點未覆蓋必定比例的密鑰空間,集羣將中止接受寫入。若是該選項設置爲no,即便僅能夠處理有關密鑰子集的請求,羣集仍將提供查詢。
4.啓動咱們的redis
/usr/redis/bin/redis-server /usr/rediscluster/redis7000/redis.conf /usr/redis/bin/redis-server /usr/rediscluster/redis7001/redis.conf /usr/redis/bin/redis-server /usr/rediscluster/redis7002/redis.conf /usr/redis/bin/redis-server /usr/rediscluster/redis7003/redis.conf /usr/redis/bin/redis-server /usr/rediscluster/redis7004/redis.conf /usr/redis/bin/redis-server /usr/rediscluster/redis7005/redis.conf |
鏈接一個redis
/usr/redis/bin/redis-cli -h 127.0.0.1 -p 7000 |
(error) CLUSTERDOWN Hash slot not served 說明沒有分配hash槽
分配咱們hash槽操做:
/usr/redis/bin/redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 --cluster-replicas 1
/usr/redis/bin/redis-cli -h 127.0.0.1 -p 7000 |
修改成Redis的集羣方式鏈接/usr/redis/bin/redis-cli -h 127.0.0.1 -p 7000 –c