redis,不僅是數(shù)據(jù)存儲(chǔ),更是架構(gòu)的藝術(shù)。從主從到哨兵、再到Cluster,每個(gè)模式都有著獨(dú)特的優(yōu)勢(shì)。而代理模式,則是應(yīng)對(duì)大規(guī)模場(chǎng)景的得力助手。這是一場(chǎng)探險(xiǎn),Redis引領(lǐng)我們穿越在數(shù)據(jù)存儲(chǔ)的未知之旅。本文先簡(jiǎn)略介紹Redis的幾種架構(gòu)模式,后續(xù)合集再逐一進(jìn)行詳細(xì)介紹部署、使用及原理。
一、主從模式
1、簡(jiǎn)介
主從模式是Redis架構(gòu)中最簡(jiǎn)單的模式之一,分為主數(shù)據(jù)庫(kù)master和從數(shù)據(jù)庫(kù)slave兩類(lèi),主要特點(diǎn)如下:
- 主數(shù)據(jù)庫(kù)支持讀寫(xiě)操作,數(shù)據(jù)變化時(shí)自動(dòng)同步給從數(shù)據(jù)庫(kù)。
- 從數(shù)據(jù)庫(kù)通常為只讀,接收主數(shù)據(jù)庫(kù)同步的數(shù)據(jù)。
- 一個(gè)主數(shù)據(jù)庫(kù)可以擁有多個(gè)從數(shù)據(jù)庫(kù),但一個(gè)從數(shù)據(jù)庫(kù)只能對(duì)應(yīng)一個(gè)主數(shù)據(jù)庫(kù)。
- 從數(shù)據(jù)庫(kù)宕機(jī)不影響其他從數(shù)據(jù)庫(kù)和主數(shù)據(jù)庫(kù)的讀操作,重新啟動(dòng)后同步數(shù)據(jù)。
- 主數(shù)據(jù)庫(kù)宕機(jī)不影響從數(shù)據(jù)庫(kù)的讀,但Redis不再提供寫(xiě)服務(wù),重啟后重新提供寫(xiě)服務(wù)。
- 主數(shù)據(jù)庫(kù)宕機(jī)后,不會(huì)在從數(shù)據(jù)庫(kù)中重新選取主數(shù)據(jù)庫(kù)。
2、工作機(jī)制
當(dāng)從數(shù)據(jù)庫(kù)啟動(dòng)時(shí),主動(dòng)向主數(shù)據(jù)庫(kù)發(fā)送SYNC命令。主數(shù)據(jù)庫(kù)接收SYNC命令后,在后臺(tái)保存快照(RDB持久化)和緩存保存快照期間的命令,然后將保存的快照文件和緩存的命令發(fā)送給從數(shù)據(jù)庫(kù)。從數(shù)據(jù)庫(kù)收到后加載快照文件和執(zhí)行緩存的命令。復(fù)制初始化后,主數(shù)據(jù)庫(kù)每次收到寫(xiě)命令都會(huì)同步發(fā)送給從數(shù)據(jù)庫(kù),確保主從數(shù)據(jù)一致性。
缺點(diǎn): 主節(jié)點(diǎn)唯一,主節(jié)點(diǎn)宕機(jī)導(dǎo)致Redis無(wú)法提供寫(xiě)服務(wù)。
二、哨兵模式
1、簡(jiǎn)介
哨兵模式解決主從模式的單點(diǎn)故障問(wèn)題,通過(guò)監(jiān)控Redis集群狀態(tài)實(shí)現(xiàn)高可用性:
- Sentinel模式建立在主從模式基礎(chǔ)上。
- 當(dāng)主節(jié)點(diǎn)宕機(jī),Sentinel選擇一個(gè)從節(jié)點(diǎn)作為新主節(jié)點(diǎn),修改配置文件。
- 主節(jié)點(diǎn)重新啟動(dòng)后成為從節(jié)點(diǎn)。
- Sentinel形成集群,相互監(jiān)控,防止單點(diǎn)故障。
- Sentinel不與Redis部署在同一臺(tái)機(jī)器,以防Redis服務(wù)器宕機(jī)導(dǎo)致Sentinel也宕機(jī)。
2、工作機(jī)制
- 每個(gè)Sentinel每秒向所知的主、從和其他Sentinel實(shí)例發(fā)送PING命令。
- 如果實(shí)例距離上次有效回復(fù)PING超過(guò)設(shè)定時(shí)間,則被標(biāo)記為主觀下線。
- 當(dāng)主觀下線后,所有Sentinel每秒確認(rèn)一次,滿(mǎn)足條件則標(biāo)記為客觀下線。
- Sentinel以10秒一次的頻率向已知的所有主、從發(fā)送INFO命令。
- 主被標(biāo)記為客觀下線后,向下線主的從發(fā)送INFO命令頻率提高。
- 若沒(méi)有足夠Sentinel同意主已下線,客觀下線狀態(tài)移除。
- 若主重新響應(yīng)PING,主觀下線狀態(tài)移除。
3、注意
客戶(hù)端不直接連接Redis,連接Sentinel的IP和端口,由Sentinel提供可用Redis實(shí)例。避免主節(jié)點(diǎn)宕機(jī)時(shí)Sentinel感知并提供新主節(jié)點(diǎn)。
三、Cluster模式
1、簡(jiǎn)介
哨兵模式基本可以滿(mǎn)足一般生產(chǎn)的需求,具備高可用性。但是當(dāng)數(shù)據(jù)量過(guò)大到一臺(tái)服務(wù)器存不下的情況時(shí),主從模式或sentinel模式就不能滿(mǎn)足需求了,這個(gè)時(shí)候需要對(duì)存儲(chǔ)的數(shù)據(jù)進(jìn)行分片,將數(shù)據(jù)存儲(chǔ)到多個(gè)Redis實(shí)力中,cluster模式的出現(xiàn)就是為了解決單機(jī)Redis容量有限的問(wèn)題,將Redis的數(shù)據(jù)根據(jù)一定的規(guī)則分配到多臺(tái)機(jī)器。
2、工作機(jī)制
cluster可以說(shuō)是sentinal和主從模式的結(jié)合體,通過(guò)cluster可以實(shí)現(xiàn)主從和master重選功能,所以如果配置兩個(gè)副本三個(gè)分片的話(huà),就需要六個(gè)Redis實(shí)例。因?yàn)镽edis的數(shù)據(jù)是根據(jù)一定規(guī)則分配到cluster的不同機(jī)器的,當(dāng)數(shù)據(jù)量過(guò)大時(shí),可以新增機(jī)器進(jìn)行擴(kuò)容。
使用集群,只要將redis配置文件中的cluster-enable配置打開(kāi)即可。每個(gè)集群中至少需要3個(gè)主數(shù)據(jù)庫(kù)才能正常運(yùn)行,新增節(jié)點(diǎn)非常方便。
3、cluster集群優(yōu)點(diǎn)
- 多個(gè)Redis節(jié)點(diǎn)網(wǎng)絡(luò)互聯(lián),數(shù)據(jù)共享
- 所有節(jié)點(diǎn)一主一從,支持在線增加、刪除節(jié)點(diǎn)
4、cluster集群缺點(diǎn)
- 不支持同時(shí)處理多個(gè)key(如MSET/MGET),因?yàn)閞edis需要把key均勻分布在各個(gè)節(jié)點(diǎn)上,
- 并發(fā)量很高的情況下同時(shí)創(chuàng)建key-value會(huì)降低性能并導(dǎo)致不可預(yù)測(cè)的行為
四、代理模式
目前比較流行的代理框架如下 :
- twemproxy:快速、輕量級(jí)memcached和redis代理,Twitter推特公司開(kāi)發(fā)
- codis:redis集群代理解決方案,豌豆莢公司開(kāi)發(fā),需要修改redis源碼
- predixy:高性能全特征redis代理,支持Redis Sentinel和Redis Cluster
- Redis-cerberus: Redis Cluster代理
對(duì)比:
1、Twemproxy
(1)工作機(jī)制
Twemproxy是一種代理分片機(jī)制,由Twitter開(kāi)源。Twemproxy作為代理,可接受來(lái)自多個(gè)程序的訪問(wèn),按照路由規(guī)則,轉(zhuǎn)發(fā)給后臺(tái)的各個(gè)Redis服務(wù)器,再原路返回。該方案很好的解決了單個(gè)Redis實(shí)例承載能力的問(wèn)題。通過(guò)Twemproxy可以使用多臺(tái)服務(wù)器來(lái)水平擴(kuò)張redis服務(wù),可以有效的避免單點(diǎn)故障問(wèn)題。
(2)缺點(diǎn)
- Twemproxy本身也是單點(diǎn)(需要用Keepalived做高可用方案)
- 使用Twemproxy需要更多的硬件資源和在redis性能有一定的損失(twitter測(cè)試約20%)
(3)不支持的命令
見(jiàn)https://Github.com/twitter/twemproxy/blob/master/notes/redis.md。
2、Codis
Codis 是一個(gè)分布式 Redis 解決方案, 對(duì)于上層的應(yīng)用來(lái)說(shuō),連接到 Codis Proxy 和連接原生的 RedisServer 沒(méi)有明顯的區(qū)別 (部分命令不支持),上層應(yīng)用可以像使用單機(jī)的 Redis 一樣使用,Codis 底層會(huì)處理請(qǐng)求的轉(zhuǎn)發(fā),不停機(jī)的數(shù)據(jù)遷移等工作,所有后邊的一切事情,對(duì)于前面的客戶(hù)端來(lái)說(shuō)是透明的,可以簡(jiǎn)單的認(rèn)為后邊連接的是一個(gè)內(nèi)存無(wú)限大的 Redis 服務(wù)。
(1)工作機(jī)制
Codis包含如下組件
- Codis Proxy (codis-proxy)
- Codis Manager (codis-config)
- Codis Redis (codis-server)
- ZooKeeper
- codis-proxy:無(wú)縫連接的Redis代理服務(wù)
客戶(hù)端連接的Redis代理服務(wù),實(shí)現(xiàn)了Redis協(xié)議,表現(xiàn)與原生Redis幾乎無(wú)差異(類(lèi)似Twemproxy)。
業(yè)務(wù)可部署多個(gè)codis-proxy,這些代理是無(wú)狀態(tài)的。 - codis-config:Codis的智能管理工具
作為Codis的管理工具,支持諸如添加/刪除Redis節(jié)點(diǎn)、添加/刪除Proxy節(jié)點(diǎn)、發(fā)起數(shù)據(jù)遷移等操作。
內(nèi)置HTTP服務(wù)器,啟動(dòng)一個(gè)Dashboard,用戶(hù)可通過(guò)瀏覽器實(shí)時(shí)觀察Codis集群的運(yùn)行狀態(tài)。 - codis-server:Codis項(xiàng)目的特制Redis分支
基于Redis 2.8.13開(kāi)發(fā),加入了對(duì)slot的支持和原子的數(shù)據(jù)遷移指令。
Codis的上層組件codis-proxy和codis-config只能與這個(gè)特定版本的Redis交互才能正常運(yùn)行。 - Codis項(xiàng)目依賴(lài)ZooKeeper存儲(chǔ)數(shù)據(jù)路由表和codis-proxy節(jié)點(diǎn)的元信息。通過(guò)ZooKeeper,codis-config發(fā)起的命令能夠同步到所有存活的codis-proxy,確保集群的協(xié)同工作。
- Codis不僅僅是一個(gè)擴(kuò)展,更是智能的擴(kuò)展。它支持按照Namespace區(qū)分不同的產(chǎn)品,每個(gè)產(chǎn)品擁有獨(dú)特的product name,配置互不沖突。Codis讓Redis的擴(kuò)展變得輕松而智能
(2)優(yōu)點(diǎn)
Codis項(xiàng)目為Redis提供了智能而強(qiáng)大的擴(kuò)展功能,其顯著特點(diǎn)如下:
- 自動(dòng)平衡:Codis自動(dòng)平衡數(shù)據(jù),確保每個(gè)節(jié)點(diǎn)負(fù)載均衡,提升系統(tǒng)性能。
- 簡(jiǎn)單易用:使用起來(lái)非常簡(jiǎn)單,無(wú)需繁瑣的配置,即可享受Codis的強(qiáng)大功能。
- 圖形化面板和管理工具:Codis提供直觀的圖形化面板和管理工具,使集群管理變得輕松而高效。
- 支持絕大多數(shù)Redis命令:完全兼容twemproxy,支持Redis豐富的命令集,確保平滑遷移。
- Redis原生客戶(hù)端支持:與Redis原生客戶(hù)端完美兼容,保障業(yè)務(wù)的穩(wěn)定連接。
- 安全透明的數(shù)據(jù)移植:數(shù)據(jù)移植安全可靠,輕松添加或刪除節(jié)點(diǎn),保持?jǐn)?shù)據(jù)的穩(wěn)定遷移。
- 命令行接口:提供命令行接口,方便開(kāi)發(fā)人員進(jìn)行更精細(xì)的操作和管理。
- RESTful API:強(qiáng)大的RESTful API,使開(kāi)發(fā)者能夠靈活地進(jìn)行集群管理,提升整體運(yùn)維效率。
(3)不支持的命令
KEYS, MOVE, OBJECT, RENAME, RENAMENX, SORT, SCAN, BITOP,MSETNX, BLPOP, BRPOP,
BRPOPLPUSH, PSUBSCRIBE,PUBLISH, PUNSUBSCRIBE, SUBSCRIBE, UNSUBSCRIBE,
DISCARD, EXEC, MULTI, UNWATCH, WATCH, SCRIPT EXISTS, SCRIPT FLUSH,
SCRIPT KILL, SCRIPT LOAD, AUTH, ECHO, SELECT, BGREWRITEAOF, BGSAVE,
CLIENT KILL, CLIENT LIST, CONFIG GET, CONFIG SET, CONFIG RESETSTAT,
DBSIZE, DEBUG OBJECT, DEBUG SEGFAULT, FLUSHALL, FLUSHDB, INFO, LASTSAVE,
MONITOR, SAVE, SHUTDOWN, SLAVEOF, SLOWLOG, SYNC, TIME
詳情請(qǐng)參考:https://github.com/CodisLabs/codis
https://github.com/CodisLabs/codis/blob/master/doc/tutorial_zh.md。
3、predixy
在Redis3.0版本引入RedisCluster之前,代理層是實(shí)現(xiàn)Redis集群的首選方案。其中,Twemproxy和Codis是兩個(gè)常見(jiàn)的代理工具。然而,Twemproxy存在一些限制,如不支持阻塞命令、事務(wù)、發(fā)布訂閱等,且沒(méi)有直接支持Redis高可用。之后有了 redis cluster后,Predixy是比較靠譜的代理方案。
(1)Predixy工作機(jī)制
Predixy是一個(gè)強(qiáng)大的代理工具,同時(shí)支持Redis Sentinel和Redis Cluster:
- 后端為Redis Sentinel監(jiān)控的一組Redis,功能與原始Redis完全相同。
- 后端為Redis Sentinel監(jiān)控的多組Redis,部分功能受限。
- 后端為Redis Cluster,功能與Redis Cluster相同。
(2)Predixy特點(diǎn)
Predixy擁有多項(xiàng)特點(diǎn),使其成為強(qiáng)大而靈活的代理工具,主要特點(diǎn)如下:
- 高性能且輕量級(jí)。
- 支持多線程。
- 跨平臺(tái)支持:linux、OSX、BSD、windows。
- 兼容Redis Sentinel,可配置一組或多組Redis。
- 兼容Redis Cluster。
- 支持阻塞型命令(blpop、brpop、brpoplpush)。
- 支持scan命令,無(wú)論是單個(gè)Redis還是多個(gè)Redis實(shí)例。
- 多key命令支持:mset/msetnx/mget/del/unlink/touch/exists。
- 支持Redis的多數(shù)據(jù)庫(kù),即可以使用select命令。
- 事務(wù)支持,目前僅限于Redis Sentinel下單一Redis組可用。
- 腳本支持,包括命令:script load、eval、evalsha。
- 支持發(fā)布訂閱機(jī)制,即Pub/Sub系列命令。
- 多數(shù)據(jù)中心支持,讀寫(xiě)分離。
- 擴(kuò)展的AUTH命令,強(qiáng)大的權(quán)限控制和鍵空間限制。
- 日志可按級(jí)別采樣輸出,異步日志記錄避免線程被io阻塞
- 日志文件可以按時(shí)間、大小自動(dòng)切分。
- 豐富的統(tǒng)計(jì)信息,包括CPU、內(nèi)存、請(qǐng)求、響應(yīng)等。
- 延遲監(jiān)控信息,可查看整體延遲以及后端Redis實(shí)例的延遲。
- Predixy的全面特性使其成為一個(gè)強(qiáng)大的選擇,為Redis集群提供了廣泛的支持和靈活的管理
五、小結(jié)
本期為概述內(nèi)容,參考多個(gè)文檔并修改其中錯(cuò)誤內(nèi)容,后續(xù)具體各架構(gòu)詳情將在合集中詳細(xì)演示。