溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Redis內(nèi)存數(shù)據(jù)庫分片的示例分析

發(fā)布時(shí)間:2021-11-12 15:43:09 來源:億速云 閱讀:133 作者:柒染 欄目:關(guān)系型數(shù)據(jù)庫

這篇文章將為大家詳細(xì)講解有關(guān)Redis內(nèi)存數(shù)據(jù)庫分片的示例分析,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對相關(guān)知識(shí)有一定的了解。

軟件下載地址

·       允許用多臺(tái)機(jī)器的內(nèi)存存放更大的數(shù)據(jù)集。如果沒有分片,那么你只能存放單臺(tái)機(jī)器內(nèi)存的最大值的數(shù)據(jù)集。

·       允許用多核和多臺(tái)機(jī)器提高計(jì)算能力和網(wǎng)絡(luò)帶寬。

常見的分片方式:

1、按照范圍分片

2、哈希分片,例如一致性哈希

常見的分片的實(shí)現(xiàn):

①客戶端分片

②在代理中做分片,比如:twemproxy

③查詢路由:就是發(fā)送查詢到一個(gè)隨機(jī)實(shí)例,這個(gè)實(shí)例會(huì)保證轉(zhuǎn)發(fā)你的查詢到正確的節(jié)點(diǎn),redis集群在客戶端的幫助下,實(shí)現(xiàn)了查詢路由的一種混合形式,請求不是直接從redis實(shí)例轉(zhuǎn)發(fā)到另一個(gè)實(shí)例,而是客戶端收到重定向到正確的節(jié)點(diǎn)

④在服務(wù)端進(jìn)行分片,Redis采用哈希槽(hash slot)的方式在服務(wù)器端進(jìn)行分片:

Redis集群有16384個(gè)哈希槽,使用健CrC16對16384取模來計(jì)算一個(gè)鍵所屬的哈希槽

分片的缺點(diǎn)

Redis 的一些特性與分片在一起時(shí)玩轉(zhuǎn)的不是很好:

1、涉及多個(gè)鍵的操作通常不支持。例如,你不能對映射在兩個(gè)不同 Redis 實(shí)例上的鍵執(zhí)行交集(事實(shí)上有辦法做到,但不是直接這么干)。

2、涉及多個(gè)鍵的事務(wù)不能使用。

3、分片的粒度(granularity)是鍵,所以不能使用一個(gè)很大的鍵來分片數(shù)據(jù)集,例如一個(gè)很大的有序集合。

4、當(dāng)使用了分片,數(shù)據(jù)處理變得更復(fù)雜,例如,你需要處理多個(gè) RDB/AOF 文件,備份數(shù)據(jù)時(shí)你需要聚合多個(gè)實(shí)例和主機(jī)的持久化文件。

5、添加和刪除容量也很復(fù)雜。例如,Redis 集群具有運(yùn)行時(shí)動(dòng)態(tài)添加和刪除節(jié)點(diǎn)的能力來支持透明地再均衡數(shù)據(jù),但是其他方式,像客戶端分片和代理都不支持這個(gè)特性。但是,有一種稱為預(yù)分片(Presharding)的技術(shù)在這一點(diǎn)上能幫上忙。

Redis分片的缺點(diǎn)

1、不支持涉及多建的操作,如mget,如果所操作的健都在同一個(gè)節(jié)點(diǎn),就正常執(zhí)行,否則會(huì)提示報(bào)錯(cuò)

2、分片的粒度是健,因此每個(gè)鍵對應(yīng)的值不要太大

3、數(shù)據(jù)備份會(huì)比較麻煩,備份數(shù)據(jù)時(shí)你需要聚合多個(gè)實(shí)例和主機(jī)的持久化文件

4、擴(kuò)容的處理比較麻煩

5、故障的恢復(fù)的處理會(huì)比較麻煩,可能需要重新梳理Master和Slave的關(guān)系,并調(diào)整每個(gè)復(fù)制集里面的數(shù)據(jù)

Redis的預(yù)分片技術(shù)

Redis的預(yù)分片技術(shù)可以按照以下步驟進(jìn)行實(shí)例遷移操作:

 (1)在新機(jī)子上啟動(dòng)新的redis實(shí)例;

 (2)將新redis實(shí)例作為slave將原redis實(shí)例作為master,將數(shù)據(jù)從原redis實(shí)例遷移到新redis實(shí)例上;

 (3)停止客戶端(分片操作在客戶端上時(shí))或代理服務(wù)器(分片操作在代理上)

(4)更新客戶端或者代理服務(wù)器中的配置信息,去掉被遷移的原redis實(shí)例的ip和端口等信息,加上新啟動(dòng)redis實(shí)例的IP地址和端口;

(5)向新啟動(dòng)的redis發(fā)送SLAVEOF NOONE命令,終止新redis實(shí)例對原redis實(shí)例的從屬關(guān)系;

(6)重啟客戶端程序或者代理程序,此時(shí)它們將會(huì)使用新的redis實(shí)例;

 (7)關(guān)掉被遷移走數(shù)據(jù)的原redis實(shí)例;

預(yù)分片

我們已經(jīng)知道分片存在的一個(gè)問題,除非我們使用 Redis 作為緩存,增加和刪除節(jié)點(diǎn)是一件很棘手的事情,使用固定的鍵和實(shí)例映射要簡單得多。

然而,數(shù)據(jù)存儲(chǔ)的需求可能一直在變化。今天我可以接受 10 個(gè) Redis 節(jié)點(diǎn)(實(shí)例),但是明天我可能就需要 50 個(gè)節(jié)點(diǎn)。

因?yàn)?Redis 只有相當(dāng)少的內(nèi)存占用(footprint)而且輕量級(jí)(一個(gè)空閑的實(shí)例只是用 1MB 內(nèi)存),一個(gè)簡單的解決辦法是一開始就開啟很多的實(shí)例。即使你一開始只有一臺(tái)服務(wù)器,你也可以在第一天就決定生活在分布式的世界里,使用分片來運(yùn)行多個(gè) Redis 實(shí)例在一臺(tái)服務(wù)器上。

你一開始就可以選擇很多數(shù)量的實(shí)例。例如,32 或者 64 個(gè)實(shí)例能滿足大多數(shù)的用戶,并且為未來的增長提供足夠的空間。

這樣,當(dāng)你的數(shù)據(jù)存儲(chǔ)需要增長,你需要更多的 Redis 服務(wù)器,你要做的就是簡單地將實(shí)例從一臺(tái)服務(wù)器移動(dòng)到另外一臺(tái)。當(dāng)你新添加了第一臺(tái)服務(wù)器,你就需要把一半的 Redis 實(shí)例從第一臺(tái)服務(wù)器搬到第二臺(tái),如此等等。

使用 Redis 復(fù)制,你就可以在很小或者根本不需要停機(jī)時(shí)間內(nèi)完成移動(dòng)數(shù)據(jù):

·       在你的新服務(wù)器上啟動(dòng)一個(gè)空實(shí)例。

·       移動(dòng)數(shù)據(jù),配置新實(shí)例為源實(shí)例的從服務(wù)。

·       停止你的客戶端。

·       更新被移動(dòng)實(shí)例的服務(wù)器 IP 地址配置。

·       向新服務(wù)器上的從節(jié)點(diǎn)發(fā)送 SLAVEOF NO ONE 命令。

·       以新的更新配置啟動(dòng)你的客戶端。

·       最后關(guān)閉掉舊服務(wù)器上不再使用的實(shí)例。

Redis集群

由于數(shù)據(jù)量過大,單個(gè)復(fù)制集難以承擔(dān),因此需要對多個(gè)復(fù)制集進(jìn)行集群,形成水平擴(kuò)展,每個(gè)復(fù)制集只負(fù)責(zé)存儲(chǔ)數(shù)據(jù)集的一部分,這就是Redis的集群

1、在以前版本中,Redis的集群是依靠客戶端分片來完成,但是這樣會(huì)有很多缺點(diǎn),比如維護(hù)成本高,需要客戶端編碼解決;增加、移除節(jié)點(diǎn)都比較繁瑣等

2、Redis3.0新增的一大特性就是支持集群,在不降低性能的情況下,還提供了網(wǎng)絡(luò)分區(qū)的可訪問性和支持對主數(shù)據(jù)庫故障的恢復(fù)。

3、使用集群后,都只能使用默認(rèn)的0號(hào)數(shù)據(jù)庫

4、每個(gè)redis集群節(jié)點(diǎn)需要兩個(gè)TCP連接打開,正常的TCP端口用來服務(wù)客戶端,例如6379,家10000的端口用作數(shù)據(jù)端口,必須保證防火墻打開這兩個(gè)端口

5、Redis集群不保證強(qiáng)一致性,這意味著在特定的條件下,Redis集群可能會(huì)丟掉一些被系統(tǒng)收到的寫入請求命令(Master傳播命令返回OK后掛掉,slave還沒有收到廣播)

集群的架構(gòu)

1、所有的Redis節(jié)點(diǎn)彼此互聯(lián),內(nèi)部使用二進(jìn)制協(xié)議優(yōu)化傳輸速度和寬帶

2、節(jié)點(diǎn)的fail是通過集群中超過半數(shù)的節(jié)點(diǎn)檢測失效時(shí)才生效

3、客戶端與redis節(jié)點(diǎn)直連,不需要中間的proxy層??蛻舳瞬恍枰B接集群所有節(jié)點(diǎn),連接集群中任何一個(gè)可用節(jié)點(diǎn)即可

4、集群把所有的物理節(jié)點(diǎn)映射到【0-16383】插槽上,集群負(fù)責(zé)維護(hù):節(jié)點(diǎn)—插槽—值 的關(guān)系

集群操作的基本命令

CLUSTER INFO

CLUSTER NODES

CLUSTER MEET  

CLUSTER FORGET

CLUSTER REPLICATE

CLUSTER SAVECONFIG

CLUSTER ADDSLOTS

CLUSTER DELSLOTS

CLUSTER FLUSHSLOTS

CLUSTER SETSLOT  NODE

CLUSTER SETSLOT  MIGRATING

CLUSTER SETSLOT  IMPORTING

CLUSTER SETSLOT  STABLE

CLUSTER KEYSLOT

CLUSTER COUNTKEYSINSLOT

CLUSTER GETKEYSINSLOT

MIGRATE 目的節(jié)點(diǎn)目的節(jié)點(diǎn)鍵名 數(shù)據(jù)庫號(hào)碼 超時(shí)時(shí)間 [copy] [replace]

關(guān)于Redis內(nèi)存數(shù)據(jù)庫分片的示例分析就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI