《Redis集群整理!》要點(diǎn):
本文介紹了Redis集群整理!,希望對(duì)您有用。如果有疑問,可以聯(lián)系我們。
一.Redis集群
從實(shí)用性的角度,Redis集群提供以下功能:
1.自動(dòng)把數(shù)據(jù)切分到多個(gè)redis節(jié)點(diǎn)中
2.當(dāng)一部分節(jié)點(diǎn)掛了或弗成達(dá),集群依然能繼續(xù)工作
3.分區(qū)
Redis集群不是使用一致性哈希,而是使用哈希槽.整個(gè)redis集群有16384個(gè)哈希槽,決定一個(gè)key應(yīng)該分配到那個(gè)槽的算法是:計(jì)算該key的CRC16結(jié)果再模 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ī)的.
4.哈希標(biāo)簽
如果key含有大括號(hào)”{}”,則只有大括號(hào)中的字符串會(huì)參與哈希,好比”this{foo}”和”another{foo}”這2個(gè)key會(huì)分配到同一個(gè)哈希槽,所以可以在一個(gè)命令中同時(shí)操作他們. 哈希標(biāo)簽
Redis集群不克不及保證強(qiáng)一致性.一些已經(jīng)向客戶端確認(rèn)寫成功的操作,會(huì)在某些不確定的情況下丟失.
redis集群中的每個(gè)節(jié)點(diǎn)都需要建立2個(gè)tcp連接,監(jiān)聽這2個(gè)端口:一個(gè)端口稱之為“客戶端端口”,用于接受客戶端指令,與客戶端交互,好比6379;另一個(gè)端口稱之為“集群總線端口”,是在客戶端端口號(hào)上加10000,好比16379,用于節(jié)點(diǎn)之間通過(guò)二進(jìn)制協(xié)議通訊.各節(jié)點(diǎn)通過(guò)集群總線檢測(cè)宕機(jī)節(jié)點(diǎn)、更新配置、故障轉(zhuǎn)移驗(yàn)證等.客戶端只能使用客戶端端口,不能使用集群總線端口.
Redis集群混合使用了查詢路由和客戶端分區(qū).
分區(qū)分歧實(shí)現(xiàn)方式
分區(qū)可以由一個(gè)軟件棧的分歧部分完成.
· 客戶端分區(qū):客戶端直接選擇正確節(jié)點(diǎn)讀寫指定鍵.很多Redis客戶實(shí)現(xiàn)了這種分區(qū)方式.
· 代理輔助分區(qū):是指我們的客戶端通過(guò)Redis協(xié)議把哀求發(fā)送給代理,而不是直接發(fā)送給真正的Redis實(shí)例服務(wù)器.這個(gè)代理會(huì)確保我們的哀求根據(jù)配置分區(qū)策略發(fā)送到正確的Redis實(shí)例上,并返回給客戶端.Redis和Memcached的代理都是用Twemproxy (譯者注:這是twitter開源的一個(gè)代理框架)來(lái)實(shí)現(xiàn)代理服務(wù)分區(qū)的.
· 查詢路由:是指你可以把一個(gè)哀求發(fā)送給一個(gè)隨機(jī)的實(shí)例,這時(shí)實(shí)例會(huì)把該查詢轉(zhuǎn)發(fā)給正確的節(jié)點(diǎn).通過(guò)客戶端重定向(客戶端的哀求不用直接從一個(gè)實(shí)例轉(zhuǎn)發(fā)到另一個(gè)實(shí)例,而是被重定向到正確的節(jié)點(diǎn)),Redis集群實(shí)現(xiàn)了一種混合查詢路由.
5.集群配置
集群在redis.conf中的參數(shù).
·
· cluster-enabled <yes/no>: 如果配置”yes”則開啟集群功能,此redis實(shí)例作為集群的一個(gè)節(jié)點(diǎn),不然,它是一個(gè)普通的單一的redis實(shí)例.
· cluster-config-file <filename>: 注意:雖然此配置的名字叫“集群配置文件”,但是此配置文件不能人工編輯,它是集群節(jié)點(diǎn)自動(dòng)維護(hù)的文件,主要用于記錄集群中有哪些節(jié)點(diǎn)、他們的狀態(tài)以及一些持久化參數(shù)等,方便在重啟時(shí)恢復(fù)這些狀態(tài).通常是在收到哀求之后這個(gè)文件就會(huì)被更新.
· cluster-node-timeout<milliseconds>: 這是集群中的節(jié)點(diǎn)能夠失聯(lián)的最大時(shí)間,超過(guò)這個(gè)時(shí)間,該節(jié)點(diǎn)就會(huì)被認(rèn)為故障.如果主節(jié)點(diǎn)超過(guò)這個(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)將停止接收任何哀求.
· cluster-slave-validity-factor <factor>: 如果設(shè)置成0,則無(wú)論從節(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í)間,超過(guò)這個(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)超過(guò)50秒,此從節(jié)點(diǎn)不能成為主節(jié)點(diǎn).注意,如果此參數(shù)配置為非0,將可能出現(xiàn)由于某主節(jié)點(diǎn)失聯(lián)卻沒有從節(jié)點(diǎn)能頂上的情況,從而導(dǎo)致集群不能正常工作,在這種情況下,只有等到本來(lái)的主節(jié)點(diǎn)重新回歸到集群,集群才恢復(fù)運(yùn)作.
· cluster-migration-barrier <count>:主節(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提供讀操作.
6.本身動(dòng)手配置集群(3主3從)
后續(xù)會(huì)繼續(xù)介紹,請(qǐng)存眷!
維易PHP培訓(xùn)學(xué)院每天發(fā)布《Redis集群整理!》等實(shí)戰(zhàn)技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培養(yǎng)人才。
轉(zhuǎn)載請(qǐng)注明本頁(yè)網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/9264.html