1、復(fù)制過(guò)程
復(fù)制過(guò)程大致分為6個(gè)過(guò)程:
流程圖如下:

1)保存主節(jié)點(diǎn)信息
執(zhí)行slaveof后從節(jié)點(diǎn)只保存主節(jié)點(diǎn)的地址信息便直接返回,這時(shí)建立復(fù)制流程還沒(méi)有開(kāi)始,在從節(jié)點(diǎn)執(zhí)行info replication可以看到如下信息:
master_host:xxx
master_port:xxx
master_link_status:down
從統(tǒng)計(jì)信息可以看出,主節(jié)點(diǎn)的ip和port被保存下來(lái),但是主節(jié)點(diǎn)的連接狀態(tài)master_link_status是下線狀態(tài)。執(zhí)行slaveof后Redis會(huì)打印如下日志:
SLAVE OF 127.0.0.1:6379 enabled (user request from 'id=65 addr=127.0.0.1:58090
fd=5 name= age=11 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=
32768 obl=0 oll=0 omem=0 events=r cmd=slaveof')
2)從節(jié)點(diǎn)內(nèi)部通過(guò)每秒運(yùn)行的定時(shí)任務(wù)維護(hù)復(fù)制相關(guān)邏輯,當(dāng)定時(shí)任務(wù)發(fā)現(xiàn)存在新的主節(jié)點(diǎn)后,會(huì)嘗試與該節(jié)點(diǎn)建立網(wǎng)絡(luò)連接。從節(jié)點(diǎn)會(huì)建立一個(gè)socket套接字,專門用于接受主節(jié)點(diǎn)發(fā)送的復(fù)制命令。如連接成功,打印日志如下:
* Connecting to MASTER 127.0.0.1:6379
* MASTER <-> SLAVE sync started
如果從節(jié)點(diǎn)無(wú)法建立連接,定時(shí)任務(wù)會(huì)無(wú)限重試直到連接成功或執(zhí)行slaveof no one取消復(fù)制。
連接失敗,可以在從節(jié)點(diǎn)執(zhí)行info replication查看master_link_down_since_seconds指標(biāo),它會(huì)記錄與主節(jié)點(diǎn)連接失敗的系統(tǒng)時(shí)間。此時(shí)日志如下
# Error condition on socket for SYNC: {socket_error_reason}
3) 發(fā)送ping命令
連接建立成功后從節(jié)點(diǎn)發(fā)送ping請(qǐng)求進(jìn)行首次通信,ping請(qǐng)求主要目的如下:
- 檢測(cè)主從之間網(wǎng)絡(luò)套接字是否可用
- 檢測(cè)主節(jié)點(diǎn)當(dāng)前是否可接受處理命令
如果發(fā)送ping命令后,從節(jié)點(diǎn)沒(méi)有收到主節(jié)點(diǎn)的pong回復(fù)或者超時(shí),比如網(wǎng)絡(luò)超時(shí)或者主節(jié)點(diǎn)正在阻塞無(wú)法響應(yīng)命令,從節(jié)點(diǎn)會(huì)斷開(kāi)復(fù)制鏈接,下次定時(shí)任務(wù)時(shí)任務(wù)會(huì)重連。
從節(jié)點(diǎn)與主節(jié)點(diǎn)建立連接流程如圖

從節(jié)點(diǎn)發(fā)送ping命令流程

4)權(quán)限驗(yàn)證
如果主節(jié)點(diǎn)設(shè)置了requirepass參數(shù),則需要密碼驗(yàn)證,從節(jié)點(diǎn)必須配置masterauth參數(shù)保證與主節(jié)點(diǎn)相同的密碼才能通過(guò)驗(yàn)證;如果驗(yàn)證失敗復(fù)制將終止,從節(jié)點(diǎn)重新發(fā)起復(fù)制流程。
5)同步數(shù)據(jù)集
主從復(fù)制鏈接正常通信后,對(duì)于首次建立復(fù)制的場(chǎng)景,主節(jié)點(diǎn)會(huì)把持有的數(shù)據(jù)全部發(fā)送給從節(jié)點(diǎn),這部分是耗時(shí)最長(zhǎng)的步驟。Redis在2.8版本以后采用新復(fù)制命令psync進(jìn)行數(shù)據(jù)同步,原來(lái)的sync命令也同樣支持,為了新舊版本的兼容性。新同步劃分為兩種情況:全量同步和部分同步。
6)命令持續(xù)復(fù)制
當(dāng)主節(jié)點(diǎn)把當(dāng)前數(shù)據(jù)同步給從節(jié)點(diǎn)或,便完成了復(fù)制的建立流程,接下來(lái)主節(jié)點(diǎn)會(huì)持續(xù)地把寫(xiě)命令發(fā)送給從節(jié)點(diǎn),保證主從數(shù)據(jù)一致性。
2、數(shù)據(jù)同步
Redis在2.8及以上版本使用psync命令完成主從數(shù)據(jù)同步,同步過(guò)程分為全量復(fù)制和部分復(fù)制。
全量復(fù)制:一般用于初次復(fù)制場(chǎng)景,Redis早期支持的復(fù)制功能只有全量復(fù)制,它會(huì)把從節(jié)點(diǎn)全部數(shù)據(jù)一次性發(fā)送給從節(jié)點(diǎn),當(dāng)數(shù)據(jù)較大時(shí),會(huì)對(duì)主從節(jié)點(diǎn)和網(wǎng)絡(luò)造成很大的開(kāi)銷。
部分復(fù)制:用于處理在主從復(fù)制中因網(wǎng)絡(luò)閃斷等原因造成的數(shù)據(jù)丟失場(chǎng)景,當(dāng)從節(jié)點(diǎn)再次連上主節(jié)點(diǎn)后,如果條件允許,主節(jié)點(diǎn)會(huì)補(bǔ)發(fā)丟失數(shù)據(jù)給從節(jié)點(diǎn)。因?yàn)檠a(bǔ)發(fā)的數(shù)據(jù)遠(yuǎn)遠(yuǎn)小于全量數(shù)據(jù),可以有效避免全量復(fù)制的開(kāi)銷。
部分復(fù)制是對(duì)老版復(fù)制的重大優(yōu)化,有效避免了不必要的全量復(fù)制操作。因此當(dāng)使用復(fù)制功能時(shí),盡量采用2.8以上版本的Redis。
psync命令運(yùn)行需要以下組件支持:
- 主從節(jié)點(diǎn)各自復(fù)制偏移量
- 主節(jié)點(diǎn)復(fù)制積壓緩沖區(qū)
- 主節(jié)點(diǎn)運(yùn)行id
1)復(fù)制偏移量
參與復(fù)制的主從節(jié)點(diǎn)都會(huì)維護(hù)自身復(fù)制偏移量,主節(jié)點(diǎn)處理完寫(xiě)入命令后,會(huì)把命令的字節(jié)長(zhǎng)度做累加記錄,統(tǒng)計(jì)信息在info replication中的master_repl_offset指標(biāo)中。
從節(jié)點(diǎn)每秒上報(bào)自身的復(fù)制偏移量給主節(jié)點(diǎn),因此主節(jié)點(diǎn)也會(huì)保存從節(jié)點(diǎn)的復(fù)制偏移量。均可以通過(guò)info replication查看。
127.0.0.1:6379> info replication
# Replication
role:master
...
master_repl_offset:1055130
------------------------------------
127.0.0.1:6379> info replication
connected_slaves:1
slave0:ip=127.0.0.1,port=6380,state=online,offset=1055214,lag=1
從節(jié)點(diǎn)在接收到主節(jié)點(diǎn)發(fā)送的命令后,也會(huì)累加記錄自身的偏移量。統(tǒng)計(jì)信息在info replication中的slave_repl_offset指標(biāo)中:
127.0.0.1:6380> info replication
# Replication
role:slave
...
slave_repl_offset:1055214
通過(guò)對(duì)比主從節(jié)點(diǎn)的復(fù)制偏移量,可以判斷主從節(jié)點(diǎn)數(shù)據(jù)是否一致。
提示:可以通過(guò)主節(jié)點(diǎn)的統(tǒng)計(jì)信息,計(jì)算出master_repl_offset - slave_offset字節(jié)量,判斷主從節(jié)點(diǎn)復(fù)制相差的數(shù)據(jù)量,根據(jù)這個(gè)差值判定當(dāng)前復(fù)制的健康度。
2)復(fù)制積壓緩沖區(qū)
復(fù)制積壓緩沖區(qū)是保存在主節(jié)點(diǎn)上的一個(gè)固定長(zhǎng)度的隊(duì)列,默認(rèn)大小為1MB,當(dāng)主節(jié)點(diǎn)有連接的從節(jié)點(diǎn)時(shí)被創(chuàng)建,這時(shí)主節(jié)點(diǎn)響應(yīng)寫(xiě)命令時(shí),不但會(huì)把命令發(fā)送給從節(jié)點(diǎn),還會(huì)寫(xiě)入復(fù)制積壓緩沖區(qū)。
由于緩沖區(qū)本質(zhì)上是先進(jìn)先出的定長(zhǎng)隊(duì)列,所以能實(shí)現(xiàn)保存最近已復(fù)制數(shù)據(jù)的功能,用于部分復(fù)制和復(fù)制命令丟失的數(shù)據(jù)補(bǔ)救。復(fù)制緩沖區(qū)相關(guān)統(tǒng)計(jì)信息也保存在主節(jié)點(diǎn)的info replication中:
127.0.0.1:6379> info replication
# Replication
role:master
...
repl_backlog_active:1 // 開(kāi)啟復(fù)制緩沖區(qū)
repl_backlog_size:1048576 // 緩沖區(qū)最大長(zhǎng)度
repl_backlog_first_byte_offset:7479 // 起始偏移量,計(jì)算當(dāng)前緩沖區(qū)可用范圍
repl_backlog_histlen:1048576 // 已保存數(shù)據(jù)的有效長(zhǎng)度。
3)主節(jié)點(diǎn)運(yùn)行ID
每個(gè)Redis節(jié)點(diǎn)啟動(dòng)后都會(huì)動(dòng)態(tài)分配一個(gè)40位的十六進(jìn)制字符串作為運(yùn)行ID。運(yùn)行ID的主要作用是用來(lái)唯一識(shí)別Redis節(jié)點(diǎn),比如從節(jié)點(diǎn)保存主節(jié)點(diǎn)的運(yùn)行ID識(shí)別自己正在復(fù)制的是哪個(gè)主節(jié)點(diǎn)。如果只使用ip+port的方式識(shí)別主節(jié)點(diǎn),那么主節(jié)點(diǎn)重啟變更了整體數(shù)據(jù)集(如替換RDB/AOF),從節(jié)點(diǎn)再基于偏移量復(fù)制數(shù)據(jù)將是不安全的,因此當(dāng)運(yùn)行ID變化后從節(jié)點(diǎn)將做全量復(fù)制。可以運(yùn)行info server命令查看當(dāng)前節(jié)點(diǎn)的運(yùn)行ID:
127.0.0.1:6379> info server
# Server
redis_version:3.0.7
...
run_id:545f7c76183d0798a327591395b030000ee6def9
需要注意的是Redis關(guān)閉再啟動(dòng)后,運(yùn)行ID會(huì)隨之改變。Redis不改變ID重啟,可以使用redis-cli debug reload
注意:debug reload命令會(huì)阻塞當(dāng)前Redis節(jié)點(diǎn)主線程,阻塞期間會(huì)生成本地RDB快照并清空數(shù)據(jù)之后再加載RDB文件,因此對(duì)于大數(shù)據(jù)量的節(jié)點(diǎn)和無(wú)法容忍阻塞的應(yīng)用場(chǎng)景,謹(jǐn)慎使用。
4)psync命令
從節(jié)點(diǎn)使用psync命令完成部分復(fù)制和全量復(fù)制功能,命令格式:psync {runid} {offset}
- runid:從節(jié)點(diǎn)所復(fù)制主節(jié)點(diǎn)的運(yùn)行id
- offset:當(dāng)前從節(jié)點(diǎn)已復(fù)制的數(shù)據(jù)偏移量
psync運(yùn)行流程

流程說(shuō)明:
1)從節(jié)點(diǎn)發(fā)送psync命令給主節(jié)點(diǎn),參數(shù)runid是當(dāng)前從節(jié)點(diǎn)保存的主節(jié)點(diǎn)運(yùn)行ID,參數(shù)offset是當(dāng)前從節(jié)點(diǎn)保存的復(fù)制偏移量,如果是第一次復(fù)制則為-1。
2)主節(jié)點(diǎn)根據(jù)psync參數(shù)和自身數(shù)據(jù)情況決定響應(yīng)結(jié)果:
- 如果回復(fù) FULLRESYNC {runid} {offset},那么從節(jié)點(diǎn)觸發(fā)全量復(fù)制
- 如果回復(fù)CONTINUE,從節(jié)點(diǎn)將觸發(fā)部分復(fù)制流程
- 如果回復(fù)ERR,說(shuō)明主節(jié)點(diǎn)版本低于2.8,無(wú)法識(shí)別psync命令,從節(jié)點(diǎn)將發(fā)送舊版的sync命令觸發(fā)全量復(fù)制流程。
3、全量復(fù)制
全量復(fù)制是Redis最早支持的復(fù)制方式,也是主從第一次建立復(fù)制時(shí)必須經(jīng)歷的階段。觸發(fā)全量復(fù)制的命令是sync和psync。
全量復(fù)制流程:

流程說(shuō)明:
1)發(fā)送psync命令進(jìn)行數(shù)據(jù)同步,由于是第一次進(jìn)行復(fù)制,從節(jié)點(diǎn)沒(méi)有復(fù)制偏移量和主節(jié)點(diǎn)的運(yùn)行ID,所有發(fā)送psync-1
2)主節(jié)點(diǎn)根據(jù)psync-1解析出當(dāng)前為全量復(fù)制,回復(fù)+FULLRESYNC響應(yīng)。
3)從節(jié)點(diǎn)接收主節(jié)點(diǎn)的響應(yīng)數(shù)據(jù)保存運(yùn)行ID和偏移量offset,執(zhí)行到當(dāng)前步驟時(shí)從節(jié)點(diǎn)打印如下日志:
Partial resynchronization not possible (no cached master)
Full resync from master: 92d1cb14ff7ba97816216f7beb839efe036775b2:216789
4)主節(jié)點(diǎn)執(zhí)行bgsave保存RDB文件到本地,主節(jié)點(diǎn)bgsave相關(guān)日志如下:
M * Full resync requested by slave 127.0.0.1:6380
M * Starting BGSAVE for SYNC with target: disk
C * Background saving started by pid 32618
C * RDB: 0 MB of memory used by copy-on-write
M * Background saving terminated with success
提示:Redis 3.0之后在輸出的日志開(kāi)頭會(huì)有MSC等標(biāo)識(shí),對(duì)應(yīng)的含義是:M=當(dāng)前為主節(jié)點(diǎn)日志,S=當(dāng)前為從節(jié)點(diǎn)日志,C=子進(jìn)程日志。
save和bgsave的區(qū)別:save直接調(diào)用 rdbSave ,阻塞 Redis 主進(jìn)程,直到保存完成為止。在主進(jìn)程阻塞期間,服務(wù)器不能處理客戶端的任何請(qǐng)求。BGSAVE 則 fork 出一個(gè)子進(jìn)程,子進(jìn)程負(fù)責(zé)調(diào)用 rdbSave ,并在保存完成之后向主進(jìn)程發(fā)送信號(hào),通知保存已完成。因?yàn)?rdbSave 在子進(jìn)程被調(diào)用,所以 Redis 服務(wù)器在BGSAVE 執(zhí)行期間仍然可以繼續(xù)處理客戶端的請(qǐng)求。
5)主節(jié)點(diǎn)發(fā)送RDB文件給從節(jié)點(diǎn),從節(jié)點(diǎn)把接收的RDB文件保存在本地并直接作為從節(jié)點(diǎn)的數(shù)據(jù)文件,接收完RDB后從節(jié)點(diǎn)可以在日志中查看主節(jié)點(diǎn)發(fā)送的數(shù)據(jù)量:
16:24:03.057 * MASTER <-> SLAVE sync: receiving 24777842 bytes from master
注意:對(duì)于數(shù)據(jù)量大的主節(jié)點(diǎn),比如生成的RDB文件超過(guò)6GB以上傳輸文件這一步操作非常耗時(shí),速度取決于主從節(jié)點(diǎn)之間的網(wǎng)絡(luò)帶寬,針對(duì)數(shù)據(jù)量較大的節(jié)點(diǎn),建議調(diào)大repl-timeout參數(shù)防止出現(xiàn)全量同步數(shù)據(jù)超時(shí)。
關(guān)于無(wú)盤(pán)復(fù)制:為了降低主節(jié)點(diǎn)的磁盤(pán)開(kāi)銷,Redis支持無(wú)盤(pán)復(fù)制,生成的RDB文件不保存到硬盤(pán)而是直接通過(guò)網(wǎng)絡(luò)發(fā)送給從節(jié)點(diǎn),通過(guò)repl-diskless-sync參數(shù)控制,默認(rèn)關(guān)閉。無(wú)盤(pán)復(fù)制適用于主節(jié)點(diǎn)所在機(jī)器磁盤(pán)性能較差但網(wǎng)絡(luò)帶寬較充裕的場(chǎng)景。注意無(wú)盤(pán)復(fù)制目前依然處于試驗(yàn)階段。
6)對(duì)于從節(jié)點(diǎn)開(kāi)始接收RDB快照到接收完成期間,主節(jié)點(diǎn)仍然響應(yīng)讀寫(xiě)命令,因此主節(jié)點(diǎn)會(huì)把這期間寫(xiě)命令數(shù)據(jù)保存在復(fù)制客戶端緩沖區(qū)內(nèi),當(dāng)從節(jié)點(diǎn)加載完RDB文件后,主節(jié)點(diǎn)再把緩沖區(qū)內(nèi)的數(shù)據(jù)發(fā)送給從節(jié)點(diǎn),保證主從之間數(shù)據(jù)一致性。如果主節(jié)點(diǎn)創(chuàng)建和傳輸RDB的時(shí)間過(guò)長(zhǎng),對(duì)于高流量寫(xiě)入場(chǎng)景非常容易造成主節(jié)點(diǎn)復(fù)制客戶端緩沖區(qū)溢出。默認(rèn)配置為client-output-buffer-limit slave 256MB 64MB 60.如果60秒內(nèi)緩沖區(qū)消耗持續(xù)大于64MB或者直接超過(guò)356MB時(shí),主節(jié)點(diǎn)將直接關(guān)閉復(fù)制客戶端連接,造成全量同步失敗,日志如下:
M 27 May 12:13:33.669 # Client id=2 addr=127.0.0.1:24555 age=1 idle=1 flags=S
qbuf=0 qbuf-free=0 obl=18824 oll=21382 omem=268442640 events=r cmd=psync
scheduled to be closed ASAP for overcoming of output buffer limits.
因此需要根據(jù)主節(jié)點(diǎn)數(shù)據(jù)量和寫(xiě)命令并發(fā)量調(diào)整client-output-buffer-limit slave配置,避免全量復(fù)制期間客戶端緩沖區(qū)溢出。
7)從節(jié)點(diǎn)接收完主節(jié)點(diǎn)傳送來(lái)的全部數(shù)據(jù)后清空自身舊數(shù)據(jù),該步驟對(duì)應(yīng)如下日志:
16:24:02.234 * MASTER <-> SLAVE sync: Flushing old data
8)從節(jié)點(diǎn)清空數(shù)據(jù)后開(kāi)始加載RDB文件,對(duì)于較大的RDB依然耗時(shí)。對(duì)于讀寫(xiě)分離的場(chǎng)景,可以設(shè)置slave-serve-stale-data參數(shù)為no,關(guān)閉命令執(zhí)行,在完成同步前不響應(yīng)讀命令。
9)從節(jié)點(diǎn)成功加載完RDB后,如果當(dāng)前節(jié)點(diǎn)開(kāi)啟了AOF持久化功能,它會(huì)立刻做bgrewriteaof操作,為了保證全量復(fù)制后AOF持久化文件立刻可用。
RDB和AOF區(qū)別:RDB是將Redis某一時(shí)刻的數(shù)據(jù)持久化到磁盤(pán)上,類似于快照;AOF是將redis執(zhí)行過(guò)的所有寫(xiě)指令記錄下來(lái),在下次redis重新啟動(dòng)時(shí),只要把這些寫(xiě)指令從前到后再重復(fù)執(zhí)行一遍,就可以實(shí)現(xiàn)數(shù)據(jù)恢復(fù),默認(rèn)每秒鐘fsync一次。
4、部分復(fù)制
部分復(fù)制主要是Redis針對(duì)全量復(fù)制的過(guò)高開(kāi)銷做出的一種優(yōu)化措施,使用psync {runid} {offset}命令實(shí)現(xiàn),當(dāng)從節(jié)點(diǎn)正在復(fù)制主節(jié)點(diǎn)時(shí),如果出現(xiàn)異常情況,從節(jié)點(diǎn)要求補(bǔ)發(fā)丟失的命令數(shù)據(jù),如果主節(jié)點(diǎn)的復(fù)制積壓緩沖區(qū)內(nèi)存在這部分?jǐn)?shù)據(jù)則直接發(fā)送給從節(jié)點(diǎn),這樣就可以保持主從節(jié)點(diǎn)復(fù)制的一致性。
部分復(fù)制過(guò)程:

流程說(shuō)明:
1)當(dāng)主從節(jié)點(diǎn)之間網(wǎng)絡(luò)出現(xiàn)中斷時(shí),如果超過(guò)repl-timeout時(shí)間,主節(jié)點(diǎn)會(huì)認(rèn)為從節(jié)點(diǎn)故障并中斷復(fù)制鏈接。
2)主從連接中斷期間主節(jié)點(diǎn)依然響應(yīng)命令,寫(xiě)命令保存在復(fù)制積壓緩沖區(qū),默認(rèn)最大緩存1MB。
3)當(dāng)主從節(jié)點(diǎn)網(wǎng)絡(luò)恢復(fù)后,從節(jié)點(diǎn)會(huì)再次連接主節(jié)點(diǎn)。
4)連接恢復(fù)后,由于從節(jié)點(diǎn)保存了自身已復(fù)制的偏移量和主節(jié)點(diǎn)的運(yùn)行ID,因此會(huì)把他們當(dāng)做psync參數(shù)發(fā)送給主節(jié)點(diǎn),要求進(jìn)行部分復(fù)制操作。
5)主節(jié)點(diǎn)接收到psync命令后首先核對(duì)參數(shù)runid,如果一致,說(shuō)明之前復(fù)制的是當(dāng)前主節(jié)點(diǎn),之后根據(jù)參數(shù)offset在自身復(fù)制積壓緩沖區(qū)查找,找到發(fā)送+CONTINUE響應(yīng)。
6)主節(jié)點(diǎn)根據(jù)偏移量把復(fù)制積壓緩沖區(qū)里的數(shù)據(jù)發(fā)送給從節(jié)點(diǎn),保證主從復(fù)制進(jìn)入正常狀態(tài)。
5、哨兵模式
Redis Sentinel通過(guò)三個(gè)定時(shí)監(jiān)控任務(wù)完成對(duì)各個(gè)節(jié)點(diǎn)的發(fā)現(xiàn)和控制:
1)每隔10秒,每個(gè)sentinel節(jié)點(diǎn)會(huì)向主節(jié)點(diǎn)和從節(jié)點(diǎn)發(fā)送info命令獲取最新的拓?fù)浣Y(jié)構(gòu)。通過(guò)解析info replication可以找到相應(yīng)的從節(jié)點(diǎn)。此定時(shí)任務(wù)作用于三個(gè)方面:
- 通過(guò)向主節(jié)點(diǎn)執(zhí)行info命令,獲取從節(jié)點(diǎn)的信息。
- 當(dāng)有新的節(jié)點(diǎn)加入時(shí),可以立刻感知出來(lái)。
- 節(jié)點(diǎn)不可達(dá)或者故障轉(zhuǎn)移后,可以通過(guò)info命令實(shí)時(shí)更新節(jié)點(diǎn)拓?fù)湫畔ⅰ?/span>
2)每隔2秒,每隔sentinel節(jié)點(diǎn)會(huì)向Redis數(shù)據(jù)節(jié)點(diǎn)的__sentinel__:hello頻道上發(fā)送該sentinel節(jié)點(diǎn)對(duì)于主節(jié)點(diǎn)的判斷以及當(dāng)前sentinel節(jié)點(diǎn)的信息,同時(shí)每隔sentinel節(jié)點(diǎn)也會(huì)訂閱該頻道,來(lái)了解其他sentinel節(jié)點(diǎn)以及他們對(duì)主節(jié)點(diǎn)的判斷,因此此任務(wù)主要作用如下:
- 發(fā)現(xiàn)新的sentinel節(jié)點(diǎn)
- sentinel節(jié)點(diǎn)之間交換主節(jié)點(diǎn)的狀態(tài),作為后面客觀下線以及領(lǐng)導(dǎo)者選舉的依據(jù)。
3)每隔1秒,每隔sentinel節(jié)點(diǎn)會(huì)向主節(jié)點(diǎn)、從節(jié)點(diǎn)、其他sentinel節(jié)點(diǎn)發(fā)送一條ping命令做一次心跳檢測(cè)。
6、Redis集群
6.1 數(shù)據(jù)分布
Redis Cluster把數(shù)據(jù)集劃分到多個(gè)節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)負(fù)責(zé)整體數(shù)據(jù)的一個(gè)子集。Redis Cluster槽范圍是0~16383,槽是集群內(nèi)數(shù)據(jù)管理和遷移的基本單位。采用大范圍槽的主要目的是為了方便數(shù)據(jù)拆分和集群擴(kuò)展,每個(gè)節(jié)點(diǎn)會(huì)負(fù)責(zé)一定數(shù)量的槽。
6.2 集群功能限制
1)key批量操作支持有限。如mset、mget,目前只支持具有相同slot值的key執(zhí)行批量操作。對(duì)于映射為不同slot值的key不被支持。
2)key事務(wù)操作支持有限。同理只支持多key在同一節(jié)點(diǎn)上的事務(wù)操作,當(dāng)多個(gè)key分布在不同的節(jié)點(diǎn)上時(shí)無(wú)法使用事務(wù)功能。
3)key作為數(shù)據(jù)分區(qū)的最小粒度,因此不能將一個(gè)大的鍵值對(duì)象如hash、list等映射到不同的節(jié)點(diǎn)。
4)不支持多數(shù)據(jù)空間。單機(jī)支持16個(gè)數(shù)據(jù)庫(kù),集群只有db0。
5)復(fù)制結(jié)構(gòu)只支持一層。
浙公網(wǎng)安備 33010602011771號(hào)