濮阳杆衣贸易有限公司

主頁 > 知識(shí)庫 > Redis集群的相關(guān)詳解

Redis集群的相關(guān)詳解

熱門標(biāo)簽:b2b外呼系統(tǒng) 臺(tái)灣電銷 廊坊外呼系統(tǒng)在哪買 高碑店市地圖標(biāo)注app 一個(gè)地圖標(biāo)注多少錢 400電話辦理的口碑 四川穩(wěn)定外呼系統(tǒng)軟件 地圖標(biāo)注工廠入駐 南京手機(jī)外呼系統(tǒng)廠家

注意!要求使用的都是redis3.0以上的版本,因?yàn)?.0以上增加了redis集群的功能。

1.redis介紹

1.1什么是redis

Redis是用C語言開發(fā)的一個(gè)開源的高性能鍵值對(duì)(key-value)的非關(guān)系型數(shù)據(jù)庫。通過多種鍵值數(shù)據(jù)類型來適應(yīng)不同場(chǎng)景下的存儲(chǔ)需求,目前支持的鍵值數(shù)據(jù)類型有:
字符串,散列,列表,集合,有序集合

2.2應(yīng)用場(chǎng)景

緩存(數(shù)據(jù)查詢、短連接、新聞內(nèi)容、商品內(nèi)容等等)。(最多使用)
分布式集群架構(gòu)中的session分離。
聊天室的在線好友列表。
任務(wù)隊(duì)列。(秒殺、搶購(gòu)、12306等等)
應(yīng)用排行榜。
網(wǎng)站訪問統(tǒng)計(jì)。
數(shù)據(jù)過期處理(可以精確到毫秒)

2.Redis集群的介紹

2.1Redis集群的架構(gòu)

Redis 集群中內(nèi)置了 16384 個(gè)哈希槽,redis-cluster把所有的物理節(jié)點(diǎn)映射到[0-16383]slot上,cluster 負(fù)責(zé)維護(hù)。當(dāng)需要在 Redis 集群中放置一個(gè) key-value 時(shí),redis 先對(duì) key 使用 crc16 算法算出一個(gè)結(jié)果,然后把結(jié)果對(duì) 16384 求余數(shù),這樣每個(gè) key 都會(huì)對(duì)應(yīng)一個(gè)編號(hào)在 0-16383 之間的哈希槽,redis 會(huì)根據(jù)節(jié)點(diǎn)數(shù)量大致均等的將哈希槽映射到不同的節(jié)點(diǎn)

2.2 Redis集群的特點(diǎn)

當(dāng)Redis集群?jiǎn)?dòng)后,就自動(dòng)在多個(gè)節(jié)點(diǎn)間做好分片,同時(shí)提供了分片之間的可用性:即當(dāng)一部分redis節(jié)點(diǎn)故障或者網(wǎng)絡(luò)中斷后,集群還有從節(jié)點(diǎn)可以替代主節(jié)點(diǎn)繼續(xù)工作,但如果大面積的節(jié)點(diǎn)故障,那集群就不可用了。
Redis集群提供了:
自動(dòng)將16384個(gè)數(shù)據(jù)槽點(diǎn)切分到多個(gè)Redis節(jié)點(diǎn)中
當(dāng)一部分節(jié)點(diǎn)故障或不可達(dá),集群依然能繼續(xù)工作

2.3 Redis集群的TCP端口

集群的每個(gè)節(jié)點(diǎn)都需要建立兩個(gè)TCP連接,監(jiān)聽這兩個(gè)端口:
客戶端端口(一般是6379):需要對(duì)所有客戶端和集群節(jié)點(diǎn)開放,用于接收客戶端指令,且集群節(jié)點(diǎn)需要通過該端口向客戶端轉(zhuǎn)移數(shù)據(jù)。
集群總線端口(一般是6379+10000):只需要對(duì)集群中的所有節(jié)點(diǎn)開放,用于節(jié)點(diǎn)之間通過二進(jìn)制協(xié)議通信。各節(jié)點(diǎn)通過集群總線檢測(cè)故障節(jié)點(diǎn),更新配置等,而客戶端是不能使用該端口的。

2.4 Redis集群數(shù)據(jù)的分片

Redis集群使用的是哈希槽,有16384個(gè)哈希槽,決定一個(gè)key分配到哪個(gè)槽的算法:計(jì)算該key的CRC16,結(jié)果再模16384.
集群中的每個(gè)節(jié)點(diǎn)負(fù)責(zé)一部分哈希槽,比如集群中有3個(gè)節(jié)點(diǎn),則:

  1. 節(jié)點(diǎn)A存儲(chǔ)的哈希槽范圍是:0 – 5500
  2. 節(jié)點(diǎn)B存儲(chǔ)的哈希槽范圍是:5501 – 11000
  3. 節(jié)點(diǎn)C存儲(chǔ)的哈希槽范圍是:11001 – 16384

這樣的分布方式方便節(jié)點(diǎn)的添加和刪除。比如,需要新增一個(gè)節(jié)點(diǎn)D,只需要把A、B、C中的部分哈希槽數(shù)據(jù)移到D節(jié)點(diǎn)。同樣,如果希望在集群中刪除A節(jié)點(diǎn),只需要把A節(jié)點(diǎn)的哈希槽的數(shù)據(jù)移到B和C節(jié)點(diǎn),當(dāng)A節(jié)點(diǎn)的數(shù)據(jù)全部被移走后,A節(jié)點(diǎn)就可以完全從集群中刪除。

因?yàn)榘压2蹚囊粋€(gè)節(jié)點(diǎn)移到另一個(gè)節(jié)點(diǎn)是不需要停機(jī)的,所以,增加或刪除節(jié)點(diǎn),或更改節(jié)點(diǎn)上的哈希槽,也是不需要停機(jī)的。

如果多個(gè)key都屬于一個(gè)哈希槽,集群支持通過一個(gè)命令(或事務(wù), 或lua腳本)同時(shí)操作這些key。通過“哈希標(biāo)簽”的概念,用戶可以讓多個(gè)key分配到同一個(gè)哈希槽。如果key含有大括號(hào)”{}”,則只有大括號(hào)中的字符串會(huì)參與哈希,比如”this{foo}”和”another{foo}”這2個(gè)key會(huì)分配到同一個(gè)哈希槽,所以可以在一個(gè)命令中同時(shí)操作他們。

2.5 Redis集群的主從模式

每個(gè)哈希槽都有一個(gè)主節(jié)點(diǎn)和多個(gè)從節(jié)點(diǎn)。
舉例:如果有六個(gè)節(jié)點(diǎn),則分A,B,C三個(gè)為主節(jié)點(diǎn),A1,B1,C1三個(gè)為對(duì)應(yīng)的從節(jié)點(diǎn),當(dāng)A發(fā)生故障后,集群會(huì)提升A1為主節(jié)點(diǎn),A1會(huì)繼承A節(jié)點(diǎn)的數(shù)據(jù),其實(shí)A1就相當(dāng)于A的一個(gè)副本,讓集群繼續(xù)工作。

2.5.1 redis-cluster投票:容錯(cuò)

(1)投票過程是集群中所有主節(jié)點(diǎn)參與,如果半數(shù)以上主節(jié)點(diǎn)與故障主節(jié)點(diǎn)通信超過(cluster-node-timeout),認(rèn)為當(dāng)前該主節(jié)點(diǎn)掛掉.
(2):什么時(shí)候整個(gè)集群不可用(cluster_state:fail)?
a:如果集群任意主節(jié)點(diǎn)掛掉,且沒有從節(jié)點(diǎn).集群進(jìn)入fail狀態(tài),也可以理解成集群的slot映射[0-16383]不完成時(shí)進(jìn)入fail狀態(tài).
b:如果集群超過半數(shù)以上主節(jié)點(diǎn)掛掉,無論是否有從節(jié)點(diǎn),集群都進(jìn)入fail狀態(tài).
ps:當(dāng)集群不可用時(shí),所有對(duì)集群的操作做都不可用,收到((error) CLUSTERDOWN The cluster is down)錯(cuò)誤。

2.6 Redis集群的一致性保證

Redis集群不能保證強(qiáng)一致性。一些已經(jīng)向客戶端確認(rèn)寫成功的操作,會(huì)在某些不確定的情況下丟失。

產(chǎn)生寫操作丟失的第一個(gè)原因,是因?yàn)橹鲝墓?jié)點(diǎn)之間使用了異步的方式來同步數(shù)據(jù)。

一個(gè)寫操作是這樣一個(gè)流程:

  1. 1)客戶端向主節(jié)點(diǎn)B發(fā)起寫的操作
  2. 2)主節(jié)點(diǎn)B回應(yīng)客戶端寫操作成功
  3. 3)主節(jié)點(diǎn)B向它的從節(jié)點(diǎn)B1,B2,B3同步該寫操作

從上面的流程可以看出來,主節(jié)點(diǎn)B并沒有等從節(jié)點(diǎn)B1,B2,B3寫完之后再回復(fù)客戶端這次操作的結(jié)果。所以,如果主節(jié)點(diǎn)B在通知客戶端寫操作成功之后,但同步給從節(jié)點(diǎn)之前,主節(jié)點(diǎn)B故障了,其中一個(gè)沒有收到該寫操作的從節(jié)點(diǎn)會(huì)晉升成主節(jié)點(diǎn),該寫操作就這樣永遠(yuǎn)丟失了。

節(jié)點(diǎn)超時(shí)(node timeout):對(duì)集群來說非常重要,當(dāng)達(dá)到了這個(gè)節(jié)點(diǎn)超時(shí)的時(shí)間之后,主節(jié)點(diǎn)被認(rèn)為已經(jīng)宕機(jī),可以用它的一個(gè)從節(jié)點(diǎn)來代替。同樣,在節(jié)點(diǎn)超時(shí)時(shí),如果主節(jié)點(diǎn)依然不能聯(lián)系到其他主節(jié)點(diǎn),它將進(jìn)入錯(cuò)誤狀態(tài),不再接受寫操作。

2.7 Redis集群的參數(shù)配置

在redis.conf中的一些參數(shù)說明:

cluster-enabled yes/no>:
如果配置”yes”則開啟集群功能,此redis實(shí)例作為集群的一個(gè)節(jié)點(diǎn),否則,它是一個(gè)普通的單一的redis實(shí)例。

cluster-config-file :
注意:雖然此配置的名字叫“集群配置文件”,但是此配置文件不能人工編輯,它是集群節(jié)點(diǎn)自動(dòng)維護(hù)的文件,主要用于記錄集群中有哪些節(jié)點(diǎn)、他們的狀態(tài)以及一些持久化參數(shù)等,方便在重啟時(shí)恢復(fù)這些狀態(tài)。通常是在收到請(qǐng)求之后這個(gè)文件就會(huì)被更新。

cluster-node-timeout :
這是集群中的節(jié)點(diǎn)能夠失聯(lián)的最大時(shí)間,超過這個(gè)時(shí)間,該節(jié)點(diǎn)就會(huì)被認(rèn)為故障。如果主節(jié)點(diǎn)超過這個(gè)時(shí)間還是不可達(dá),則用它的從節(jié)點(diǎn)將啟動(dòng)故障遷移,升級(jí)成主節(jié)點(diǎn)。注意,任何一個(gè)節(jié)點(diǎn)在這個(gè)時(shí)間之內(nèi)如果還是沒有連上大部分的主節(jié)點(diǎn),則此節(jié)點(diǎn)將停止接收任何請(qǐng)求。

cluster-slave-validity-factor :
如果設(shè)置成0,則無論從節(jié)點(diǎn)與主節(jié)點(diǎn)失聯(lián)多久,從節(jié)點(diǎn)都會(huì)嘗試升級(jí)成主節(jié)點(diǎn)。如果設(shè)置成正數(shù),則cluster-node-timeout乘以cluster-slave-validity-factor得到的時(shí)間,是從節(jié)點(diǎn)與主節(jié)點(diǎn)失聯(lián)后,此從節(jié)點(diǎn)數(shù)據(jù)有效的最長(zhǎng)時(shí)間,超過這個(gè)時(shí)間,從節(jié)點(diǎn)不會(huì)啟動(dòng)故障遷移。假設(shè)cluster-node-timeout=5,cluster-slave-validity-factor=10,則如果從節(jié)點(diǎn)跟主節(jié)點(diǎn)失聯(lián)超過50秒,此從節(jié)點(diǎn)不能成為主節(jié)點(diǎn)。注意,如果此參數(shù)配置為非0,將可能出現(xiàn)由于某主節(jié)點(diǎn)失聯(lián)卻沒有從節(jié)點(diǎn)能頂上的情況,從而導(dǎo)致集群不能正常工作,在這種情況下,只有等到原來的主節(jié)點(diǎn)重新回歸到集群,集群才恢復(fù)運(yùn)作。

cluster-migration-barrier
:主節(jié)點(diǎn)需要的最小從節(jié)點(diǎn)數(shù),只有達(dá)到這個(gè)數(shù),主節(jié)點(diǎn)失敗時(shí),它從節(jié)點(diǎn)才會(huì)進(jìn)行遷移。更詳細(xì)介紹可以看本教程后面關(guān)于副本遷移到部分。

cluster-require-full-coverage
yes/no>:在部分key所在的節(jié)點(diǎn)不可用時(shí),如果此參數(shù)設(shè)置為”yes”(默認(rèn)值),
則整個(gè)集群停止接受操作;如果此參數(shù)設(shè)置為”no”,則集群依然為可達(dá)節(jié)點(diǎn)上的key提供讀操作。

以上所述是小編給大家介紹的Redis集群的相關(guān)詳解整合,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

您可能感興趣的文章:
  • Springboot2.X集成redis集群(Lettuce)連接的方法
  • 基于redis集群設(shè)置密碼的實(shí)例
  • Redis集群與SSM整合使用方法
  • 詳細(xì)分析Redis集群故障
  • Redis集群搭建全記錄
  • Laravel框架實(shí)現(xiàn)redis集群的方法分析
  • redis集群搭建教程及遇到的問題處理
  • Windows環(huán)境部署Redis集群
  • CentOS 7下安裝 redis 3.0.6并配置集群的過程詳解
  • 簡(jiǎn)單注解實(shí)現(xiàn)集群同步鎖(spring+redis+注解)

標(biāo)簽:甘南 拉薩 定州 南寧 泰州 畢節(jié) 河源 伊春

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Redis集群的相關(guān)詳解》,本文關(guān)鍵詞  Redis,集群,的,相關(guān),詳解,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Redis集群的相關(guān)詳解》相關(guān)的同類信息!
  • 本頁收集關(guān)于Redis集群的相關(guān)詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    泉州市| 宜兴市| 黄浦区| 古浪县| 永寿县| 儋州市| 隆昌县| 鱼台县| 北辰区| 永昌县| 勃利县| 武定县| 徐州市| 方山县| 凤山市| 雷山县| 吴堡县| 忻州市| 莲花县| 咸丰县| 九龙县| 恭城| 泸西县| 湟中县| 彭阳县| 新河县| 洞口县| 二连浩特市| 上犹县| 东辽县| 南华县| 长汀县| 拜城县| 沂南县| 玛曲县| 榆中县| 大洼县| 得荣县| 黔南| 逊克县| 浦城县|