新聞中心
隨著互聯(lián)網(wǎng)技術(shù)的不斷發(fā)展,數(shù)據(jù)存儲(chǔ)和管理的需求也越來越高。在這個(gè)過程中,NoSQL數(shù)據(jù)庫逐漸嶄露頭角。其中,Redis作為一款高性能的NoSQL數(shù)據(jù)庫,已經(jīng)被廣泛應(yīng)用于互聯(lián)網(wǎng)業(yè)界。為滿足業(yè)務(wù)需求,有時(shí)需要將多個(gè)數(shù)據(jù)源保存到不同的數(shù)據(jù)庫中。本文將介紹如何使用。

一、Redis集群概覽
在討論Redis集群實(shí)現(xiàn)多數(shù)據(jù)庫儲(chǔ)存的方案之前,首先需要了解Redis集群的概念。Redis集群是一組相互協(xié)作的Redis節(jié)點(diǎn),通過數(shù)據(jù)自動(dòng)分片實(shí)現(xiàn)數(shù)據(jù)的高可用和橫向擴(kuò)展。Redis集群在運(yùn)行時(shí),自動(dòng)將數(shù)據(jù)分布在不同節(jié)點(diǎn)上,同時(shí)提供一致性哈希算法的支持,確保操作的線性化,保證了系統(tǒng)的高可用性和性能。
二、Redis集群多數(shù)據(jù)庫的方案
Redis集群提供了多個(gè)數(shù)據(jù)庫的支持,通過選擇不同的數(shù)據(jù)庫實(shí)現(xiàn)對(duì)多個(gè)數(shù)據(jù)源的存儲(chǔ)??梢酝ㄟ^在配置文件中指定不同的數(shù)據(jù)庫數(shù)目,然后通過SELECT語句選擇不同的數(shù)據(jù)庫進(jìn)行存儲(chǔ)和查詢。
Redis的SELECT語句支持范圍是0-15,共16個(gè)數(shù)據(jù)庫。例如,通過SELECT 0選擇之一個(gè)數(shù)據(jù)庫進(jìn)行數(shù)據(jù)存儲(chǔ),通過SELECT 1選擇第二個(gè)數(shù)據(jù)庫進(jìn)行數(shù)據(jù)存儲(chǔ),以此類推。
Redis集群的多數(shù)據(jù)庫方案可以使用以下兩種方式進(jìn)行實(shí)現(xiàn):
1. 手動(dòng)分片
手動(dòng)分片是一種最基本的方案。通過將數(shù)據(jù)按照一定規(guī)則映射到多個(gè)節(jié)點(diǎn)中進(jìn)行存儲(chǔ),這種方式能夠滿足基本的多數(shù)據(jù)庫儲(chǔ)存需求。
這種方案的優(yōu)點(diǎn)在于簡(jiǎn)單易實(shí)現(xiàn),適用于小型數(shù)據(jù)量的應(yīng)用。但是,這種分片方案存在著一些缺點(diǎn)。手動(dòng)分片需要對(duì)數(shù)據(jù)進(jìn)行一定的規(guī)則劃分,當(dāng)節(jié)點(diǎn)數(shù)目增加時(shí),規(guī)則的制定和管理會(huì)變得困難。如果有一臺(tái)節(jié)點(diǎn)出現(xiàn)問題,需要進(jìn)行手動(dòng)數(shù)據(jù)遷移,這會(huì)影響系統(tǒng)的可用性。
2. 使用Redis官方內(nèi)置工具cluster
Redis官方提供了內(nèi)置工具cluster,可以自動(dòng)實(shí)現(xiàn)數(shù)據(jù)的分片和遷移。在cluster模式下,Redis將數(shù)據(jù)自動(dòng)劃分為多個(gè)槽,并使用一致性哈希算法將槽映射到不同的節(jié)點(diǎn)進(jìn)行存儲(chǔ)。在cluster模式下,每個(gè)節(jié)點(diǎn)只需要管理一部分的槽,當(dāng)發(fā)生節(jié)點(diǎn)失效、新增節(jié)點(diǎn)等情況時(shí),數(shù)據(jù)會(huì)自動(dòng)進(jìn)行遷移,系統(tǒng)可用性得到保證。
三、Redis集群多數(shù)據(jù)庫方案的應(yīng)用場(chǎng)景
Redis集群多數(shù)據(jù)庫方案的應(yīng)用場(chǎng)景非常廣泛,下面列舉一些常見的場(chǎng)景。
1. 大數(shù)據(jù)量高并發(fā)的應(yīng)用場(chǎng)景。
在高并發(fā)的場(chǎng)景下,單節(jié)點(diǎn)的Redis的容量和性能會(huì)存在瓶頸,在這種情況下,僅僅通過Redis機(jī)器的橫向擴(kuò)展,是被動(dòng)的,或者說可能是難以實(shí)現(xiàn)的。而Redis集群在現(xiàn)實(shí)中得到了廣泛的應(yīng)用。Redis集群架構(gòu)可以通過自動(dòng)數(shù)據(jù)分片、數(shù)據(jù)分散,實(shí)現(xiàn)大容量的請(qǐng)求數(shù)量,同時(shí)還保證了高可用性。
2. 面向服務(wù)的多數(shù)據(jù)庫架構(gòu)
面向服務(wù)的多數(shù)據(jù)庫架構(gòu)在現(xiàn)今的互聯(lián)網(wǎng)應(yīng)用場(chǎng)景中被廣泛應(yīng)用。例如,在一些大型企業(yè)的網(wǎng)站應(yīng)用中,不同的業(yè)務(wù)使用需要不同的數(shù)據(jù)源,而這些數(shù)據(jù)源可能是由不同的Redis服務(wù)器提供的,通過Redis集群多數(shù)據(jù)庫方案,可以將不同的數(shù)據(jù)源存儲(chǔ)到不同的Redis database中,并通過SELECT語句進(jìn)行區(qū)分。
3. 日志收集和分析系統(tǒng)。
在日志收集和分析系統(tǒng)中,日志數(shù)量巨大,傳統(tǒng)的存儲(chǔ)結(jié)構(gòu)可能會(huì)導(dǎo)致大量數(shù)據(jù)拆分和存儲(chǔ)。Redis集群多數(shù)據(jù)庫方案可以將不同的日志存儲(chǔ)到不同的數(shù)據(jù)庫中,并通過SELECT語句進(jìn)行區(qū)分,同時(shí)保證了存儲(chǔ)效率和可用性。
四、Redis集群多數(shù)據(jù)庫架構(gòu)方案的優(yōu)勢(shì)
Redis集群多數(shù)據(jù)庫架構(gòu)方案的優(yōu)勢(shì)在于高可用性、自動(dòng)分片和易擴(kuò)展。
1. 高可用性
Redis集群中的每個(gè)節(jié)點(diǎn)都有自己的主從復(fù)制機(jī)制,因此如果有節(jié)點(diǎn)出現(xiàn)問題,其他節(jié)點(diǎn)會(huì)自動(dòng)進(jìn)行遷移工作,以確保數(shù)據(jù)的可用性。
2. 自動(dòng)分片
自動(dòng)分片是Redis集群的核心能力之一,集群自動(dòng)將數(shù)據(jù)分布在不同的節(jié)點(diǎn)上,可以有效地提高系統(tǒng)的容量和性能。
3. 易擴(kuò)展性
Redis集群架構(gòu)可以通過配置文件或者命令行進(jìn)行節(jié)點(diǎn)的添加或刪除,對(duì)于集群的擴(kuò)容或縮容非常方便。
Redis集群多數(shù)據(jù)庫方案是為了應(yīng)對(duì)大數(shù)據(jù)量、高并發(fā)的場(chǎng)景而提供的解決方案。Redis集群使用一致性哈希算法對(duì)數(shù)據(jù)進(jìn)行自動(dòng)劃分和平衡,以實(shí)現(xiàn)高可用性和高性能的數(shù)據(jù)存儲(chǔ)。在實(shí)際應(yīng)用中,使用Redis集群多數(shù)據(jù)庫方案可以提高數(shù)據(jù)存取的效率,同時(shí)減少了維護(hù)成本。相信在未來的發(fā)展中,Redis集群在多數(shù)據(jù)庫儲(chǔ)存方案的應(yīng)用中將會(huì)得到更加廣泛的應(yīng)用。
相關(guān)問題拓展閱讀:
- 玩轉(zhuǎn)Redis的高可用(主從、哨兵、集群)
玩轉(zhuǎn)Redis的高可用(主從、哨兵、集群)
所謂的高可用,也叫 HA(High Availability),是分布式系統(tǒng)架構(gòu)設(shè)計(jì)中必須考慮的因素之一,它是保證系統(tǒng)SLA的重要指標(biāo)。Redis 高可用的主要有三種模式:
主從模式
,
哨兵模式和集群模式
。
Redis 提供了 Redis 提供了復(fù)制(replication)功能,當(dāng)一臺(tái) redis 數(shù)據(jù)庫中的數(shù)據(jù)發(fā)生了變化,這個(gè)變化會(huì)被自動(dòng)地同步到其他的 redis 機(jī)器上去。
Redis 多機(jī)器部署時(shí),這些機(jī)器節(jié)點(diǎn)會(huì)被分成兩類,一類是主節(jié)點(diǎn)(master 節(jié)點(diǎn)),一類是從節(jié)點(diǎn)(slave 節(jié)點(diǎn))。一般
主節(jié)點(diǎn)可以進(jìn)行讀、寫操作
,而
從節(jié)點(diǎn)只能進(jìn)行讀操作
。一個(gè)主節(jié)點(diǎn)可以有多個(gè)從節(jié)點(diǎn),但是一個(gè)從節(jié)點(diǎn)只會(huì)有一個(gè)主節(jié)點(diǎn),也就是所謂的
一主多從結(jié)構(gòu)
。
· 支持主從復(fù)制,主機(jī)會(huì)自動(dòng)將數(shù)據(jù)同步到從機(jī),可以進(jìn)行讀寫分離;
· Master 是以非阻塞的方式為主 Slaves 提供服務(wù)。所以在 Master-Slave 同步期間,客戶端仍然可以提交查詢或修改請(qǐng)求;
· Slave 同樣是以非阻塞的方式完成數(shù)據(jù)同步。在同步期間,如果有客戶端提交查詢請(qǐng)求,Redis 則返回同步之前的數(shù)據(jù)。
· Redis 不具備自動(dòng)容錯(cuò)和恢復(fù)功能,主機(jī)從機(jī)的宕機(jī)都會(huì)導(dǎo)致前端部分讀寫請(qǐng)求失敗,需要等待機(jī)器重啟或者手動(dòng)切換前端的 IP 才能恢復(fù);
· 主機(jī)宕機(jī),宕機(jī)前有部分?jǐn)?shù)據(jù)未能及時(shí)同步到從機(jī),切換 IP 后面還會(huì)引入數(shù)據(jù)不一致的問題,降低了系統(tǒng)的可用性;
· Redis 較難支持在線擴(kuò)容,在集群容量達(dá)到上限時(shí)在線擴(kuò)容會(huì)變得很復(fù)雜;
· Redis 的主節(jié)點(diǎn)和從節(jié)點(diǎn)中的數(shù)據(jù)是一樣的,降低的內(nèi)存的可用性
實(shí)際生產(chǎn)中,我們優(yōu)先考慮哨兵模式。這種模式下,master 宕機(jī),哨兵會(huì)自動(dòng)選舉 master 并將其他的 slave 指向新的 master。
在主從模式下,redis 同時(shí)提供了哨兵命令 redis-sentinel ,哨兵是一個(gè)獨(dú)立的進(jìn)程,作為進(jìn)程,它會(huì)獨(dú)立運(yùn)行。其原理是哨兵進(jìn)程向所有的 redis 機(jī)器人發(fā)送命令,等待 Redis 服務(wù)器響應(yīng),從而監(jiān)控運(yùn)行的多個(gè) Redis 實(shí)例。一般為了便于決策選舉,使用
奇數(shù)個(gè)哨兵
。多個(gè)哨兵構(gòu)成一個(gè)哨兵集群,哨兵直接也會(huì)相互通信,檢查哨兵是否正常運(yùn)行,同時(shí)發(fā)現(xiàn) master 戰(zhàn)機(jī)哨兵之間會(huì)進(jìn)行決策選舉新的 master
哨兵模式的作用:
· 通過發(fā)送命令,讓 Redis 服務(wù)器返回監(jiān)控其運(yùn)行狀態(tài),包括主服務(wù)器和從服務(wù)器;
· 然而一個(gè)哨兵進(jìn)程對(duì) Redis 服務(wù)器進(jìn)行監(jiān)控,也可能會(huì)出現(xiàn)問題,為此,我們可以使用多個(gè)哨兵進(jìn)行監(jiān)控。各個(gè)哨兵之間還會(huì)進(jìn)行監(jiān)控,這樣就形成了多種哨兵模式。
哨兵很像 kafka 集群中的 zookeeper 的功能。
· 哨兵模式是基于主從模式的,所有主從的優(yōu)點(diǎn),哨兵模式都具有。
· 主從可以自動(dòng)切換,系統(tǒng)更健壯,可用性更高。
· 具有主從模式的缺點(diǎn),每臺(tái)機(jī)器上的數(shù)據(jù)是一樣的,內(nèi)存的可用性較低。
· Redis 較難支持在線擴(kuò)容,在集群容量達(dá)到上限時(shí)在線擴(kuò)容會(huì)變得很復(fù)雜。
Redis 集群模式本身沒有使用一致性 hash 算法,而是使用 slots 插槽
。
Redis 哨兵模式基本已經(jīng)可以實(shí)現(xiàn)高可用,讀寫分離 ,但是在這種模式下每臺(tái) Redis 服務(wù)器都存儲(chǔ)相同的數(shù)據(jù),很浪費(fèi)內(nèi)存,所以在 redis3.0 上加入了 Cluster 集群模式,實(shí)現(xiàn)了 Redis 的分布式存儲(chǔ),對(duì)數(shù)據(jù)進(jìn)行分片,也就是說每臺(tái) Redis 節(jié)點(diǎn)上存儲(chǔ)不同的內(nèi)容;每個(gè)節(jié)點(diǎn)都會(huì)通過集群總線(cluster bus),與其他的節(jié)點(diǎn)進(jìn)行通信。
通訊時(shí)使用特殊的端口號(hào),即對(duì)外服務(wù)端口號(hào)加 10000。例如如果某個(gè) node 的端口號(hào)是 6379,那么它與其它 nodes 通信的端口號(hào)是 16379。nodes 之間的通信采用特殊的二進(jìn)制協(xié)議。
對(duì)客戶端來說,整個(gè) cluster 被看做是一個(gè)整體,客戶端可以連接任意一個(gè) node 進(jìn)行操作,就像操作單一 Redis 實(shí)例一樣,
當(dāng)客戶端操作的時(shí)候 key 沒有分配到該 node 上時(shí),Redis 會(huì)返回轉(zhuǎn)向指令,指向正確的 node,這有點(diǎn)兒像瀏覽器頁面的 302 redirect 跳轉(zhuǎn)。
根據(jù)官方推薦,集群部署至少要 3 臺(tái)以上的 master 節(jié)點(diǎn),更好使用 3 主 3 從六個(gè)節(jié)點(diǎn)的模式。
在 Redis 的每一個(gè)節(jié)點(diǎn)上,都有這么兩個(gè)東西,
一個(gè)是插槽(slot),它的的取值范圍是:,
可以從上面 redis-trib.rb 執(zhí)行的結(jié)果看到這個(gè) slot 在三個(gè) master 上的分布。還有一個(gè)就是 cluster,可以理解為是一個(gè)集群管理的插件,類似的哨兵。
當(dāng)我們的存取的 Key 到達(dá)的時(shí)候,Redis 會(huì)根據(jù)
crc16
的算法對(duì)計(jì)算后得出一個(gè)結(jié)果,然后把結(jié)果和求余數(shù),這樣每個(gè) key 都會(huì)對(duì)應(yīng)一個(gè)編號(hào)在之間的哈希槽,通過這個(gè)值,去找到對(duì)應(yīng)的插槽所對(duì)應(yīng)的節(jié)點(diǎn),然后直接自動(dòng)跳轉(zhuǎn)到這個(gè)對(duì)應(yīng)的節(jié)點(diǎn)上進(jìn)行存取操作。
為了保證高可用,
redis-cluster 集群引入了主從模式
,一個(gè)主節(jié)點(diǎn)對(duì)應(yīng)一個(gè)或者多個(gè)從節(jié)點(diǎn)。當(dāng)其它主節(jié)點(diǎn) ping 主節(jié)點(diǎn) master 1 時(shí),如果半數(shù)以上的主節(jié)點(diǎn)與 master 1 通信超時(shí),那么認(rèn)為 master 1 宕機(jī)了,就會(huì)啟用 master 1 的從節(jié)點(diǎn) slave 1,將 slave 1 變成主節(jié)點(diǎn)繼續(xù)提供服務(wù)。
如果 master 1 和它的從節(jié)點(diǎn) slave 1 都宕機(jī)了,整個(gè)集群就會(huì)進(jìn)入 fail 狀態(tài),因?yàn)榧旱?slot 映射不完整。
如果集群超過半數(shù)以上的 master 掛掉,無論是否有 slave,集群都會(huì)進(jìn)入 fail 狀態(tài)。
redis-cluster
采用去中心化的思想
,沒有中心節(jié)點(diǎn)的說法,客戶端與 Redis 節(jié)點(diǎn)直連,不需要中間代理層,客戶端不需要連接集群所有節(jié)點(diǎn),連接集群中任何一個(gè)可用節(jié)點(diǎn)即可。
對(duì) redis 集群的擴(kuò)容就是向集群中添加機(jī)器,縮容就是從集群中刪除機(jī)器,并重新將個(gè) slots 分配到集群中的節(jié)點(diǎn)上(數(shù)據(jù)遷移)。
擴(kuò)縮容也是使用集群管理工具 redis-tri.rb。
擴(kuò)容時(shí),先使用 redis-tri.rb add-node 將新的機(jī)器加到集群中,這是新機(jī)器雖然已經(jīng)在集群中了,但是沒有分配 slots,依然是不起做用的。在使用 redis-tri.rb reshard 進(jìn)行分片重哈希(數(shù)據(jù)遷移),將舊節(jié)點(diǎn)上的 slots 分配到新節(jié)點(diǎn)上后,新節(jié)點(diǎn)才能起作用。
縮容時(shí),先要使用 redis-tri.rb reshard 移除的機(jī)器上的 slots,然后使用 redis-tri.rb add-del 移除機(jī)器。
采用去中心化思想,數(shù)據(jù)按照 slot 存儲(chǔ)分布在多個(gè)節(jié)點(diǎn),節(jié)點(diǎn)間數(shù)據(jù)共享,可動(dòng)態(tài)調(diào)整數(shù)據(jù)分布;
可擴(kuò)展性:可線性擴(kuò)展到 1000 多個(gè)節(jié)點(diǎn),節(jié)點(diǎn)可動(dòng)態(tài)添加或刪除;
高可用性:部分節(jié)點(diǎn)不可用時(shí),集群仍可用。通過增加 Slave 做 standby 數(shù)據(jù)副本,能夠?qū)崿F(xiàn)故障自動(dòng) failover,節(jié)點(diǎn)之間通過 gossip 協(xié)議交換狀態(tài)信息,用投票機(jī)制完成 Slave 到 Master 的角色提升;
降低運(yùn)維成本,提高系統(tǒng)的擴(kuò)展性和可用性。
1.Redis Cluster 是無中心節(jié)點(diǎn)的集群架構(gòu),依靠 Goss 協(xié)議(謠言傳播)協(xié)同自動(dòng)化修復(fù)集群的狀態(tài)。但 GosSIp 有消息延時(shí)和消息冗余的問題,在集群節(jié)點(diǎn)數(shù)量過多的時(shí)候,節(jié)點(diǎn)之間需要不斷進(jìn)行 PING/PANG 通訊,不必須要的流量占用了大量的網(wǎng)絡(luò)資源。雖然 Reds4.0 對(duì)此進(jìn)行了優(yōu)化,但這個(gè)問題仍然存在。
2.數(shù)據(jù)遷移問題
Redis Cluster 可以進(jìn)行節(jié)點(diǎn)的動(dòng)態(tài)擴(kuò)容縮容,這一過程,在目前實(shí)現(xiàn)中,還處于半自動(dòng)狀態(tài),需要人工介入。在擴(kuò)縮容的時(shí)候,需要進(jìn)行數(shù)據(jù)遷移。
而 Redis 為了保證遷移的一致性,遷移所有操作都是同步操作
,執(zhí)行遷移時(shí),兩端的 Redis 均會(huì)進(jìn)入時(shí)長不等的阻塞狀態(tài),對(duì)于小 Key,該時(shí)間可以忽略不計(jì),但如果一旦 Key 的內(nèi)存使用過大,嚴(yán)重的時(shí)候會(huì)接觸發(fā)集群內(nèi)的故障轉(zhuǎn)移,造成不必要的切換。
主從模式:master 節(jié)點(diǎn)掛掉后,需要手動(dòng)指定新的 master,可用性不高,基本不用。
哨兵模式:master 節(jié)點(diǎn)掛掉后,哨兵進(jìn)程會(huì)主動(dòng)選舉新的 master,可用性高,但是每個(gè)節(jié)點(diǎn)存儲(chǔ)的數(shù)據(jù)是一樣的,浪費(fèi)內(nèi)存空間。數(shù)據(jù)量不是很多,集群規(guī)模不是很大,需要自動(dòng)容錯(cuò)容災(zāi)的時(shí)候使用。
集群模式:數(shù)據(jù)量比較大,QPS 要求較高的時(shí)候使用。
Redis Cluster 是 Redis 3.0 以后才正式推出,時(shí)間較晚,目前能證明在大規(guī)模生產(chǎn)環(huán)境下成功的案例還不是很多,需要時(shí)間檢驗(yàn)。
關(guān)于redis集群 多數(shù)據(jù)庫的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
成都網(wǎng)站推廣找創(chuàng)新互聯(lián),老牌網(wǎng)站營銷公司
成都網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)(www.cdcxhl.com)專注高端網(wǎng)站建設(shè),網(wǎng)頁設(shè)計(jì)制作,網(wǎng)站維護(hù),網(wǎng)絡(luò)營銷,SEO優(yōu)化推廣,快速提升企業(yè)網(wǎng)站排名等一站式服務(wù)。IDC基礎(chǔ)服務(wù):云服務(wù)器、虛擬主機(jī)、網(wǎng)站系統(tǒng)開發(fā)經(jīng)驗(yàn)、服務(wù)器租用、服務(wù)器托管提供四川、成都、綿陽、雅安、重慶、貴州、昆明、鄭州、湖北十堰機(jī)房互聯(lián)網(wǎng)數(shù)據(jù)中心業(yè)務(wù)。
網(wǎng)站標(biāo)題:Redis集群實(shí)現(xiàn)多數(shù)據(jù)庫儲(chǔ)存的高效方案 (redis集群 多數(shù)據(jù)庫)
文章鏈接:http://fisionsoft.com.cn/article/dpcdocs.html


咨詢
建站咨詢
