<meta charset="utf-8">
一粉寞、持久化
1框沟、RDB
save命令會(huì)阻塞當(dāng)前redis服務(wù)吏砂,已經(jīng)廢棄投储。bgsave命令只有在fork子線程的時(shí)候阻塞。
觸發(fā)RDB的操作:
手動(dòng)執(zhí)行bgsave命令淫半;
使用save相關(guān)配置,如“save m n”。表示m秒內(nèi)數(shù)據(jù)集存在n次修改時(shí)蔓钟,自動(dòng)觸發(fā)bgsave;
如果從節(jié)點(diǎn)執(zhí)行全量復(fù)制操作卵贱,主節(jié)點(diǎn)自動(dòng)執(zhí)行bgsave生成RDB文件并發(fā)送給從節(jié)點(diǎn)滥沫;
默認(rèn)情況下執(zhí)行shutdown命令時(shí),如果沒有開啟AOF持久化功能則自動(dòng)執(zhí)行bgsave键俱;
配置
#設(shè)置目錄
config set dir {newDir}
#設(shè)置RDB文件名
config set dbfilename {newFileName}
#采用LZF算法對(duì)生成的RDB文件做壓縮處理兰绣,壓縮后的文件遠(yuǎn)遠(yuǎn)小于內(nèi)存大小,默認(rèn)開啟
config set rdbcompression{yes|no}
RDB特點(diǎn):
RDB壓縮的二進(jìn)制文件编振,適用于備份缀辩,全量復(fù)制等場(chǎng)景。
Redis加載RDB恢復(fù)數(shù)據(jù)遠(yuǎn)遠(yuǎn)快于AOF的方式踪央。
RDB方式數(shù)據(jù)沒辦法做到實(shí)時(shí)持久化/秒級(jí)持久化臀玄。
2、AOF
AOF以獨(dú)立日志的方式記錄每次寫命令畅蹂,重啟時(shí)再重新執(zhí)行AOF文件中的命令達(dá)到恢復(fù)數(shù)據(jù)的目的健无,類似數(shù)據(jù)庫(kù)binlog形式。
開啟AOF功能需要設(shè)置配置:appendonly yes液斜,默認(rèn)不開啟累贤。
AOF文件名通過appendfilename配置設(shè)置,默認(rèn)文件名是appendonly.aof少漆。
1)所有的寫入命令會(huì)追加到aof_buf(緩沖區(qū))中臼膏。
Redis使用單線程響應(yīng)命令,如果每次寫AOF文件命令都直接追加到硬盤检疫,那么性能完全取決于當(dāng)前硬盤負(fù)載讶请。先寫入緩沖區(qū)aof_buf中,還有另一個(gè)好處屎媳,Redis可以提供多種緩沖區(qū)同步硬盤的策略夺溢,在性能和安全性方面做出平衡。
2)AOF緩沖區(qū)根據(jù)對(duì)應(yīng)的策略向硬盤做同步操作烛谊。
?配置為always時(shí)风响,每次寫入都要同步AOF磁盤文件,影響性能丹禀,不建議配置状勤。
?配置為no鞋怀,由于操作系統(tǒng)每次同步AOF文件的周期不可控,而且會(huì)加大每次同步硬盤的數(shù)據(jù)量持搜,雖然提升了性能密似,但數(shù)據(jù)安全性無法保證。
?配置為everysec葫盼,是建議的同步策略残腌,也是默認(rèn)配置,做到兼顧性能和數(shù)據(jù)安全性贫导。
系統(tǒng)調(diào)用write和fsync說明:
?write操作會(huì)觸發(fā)延遲寫(delayed write)機(jī)制抛猫。Linux在內(nèi)核提供頁(yè)緩沖區(qū)用來提高硬盤IO性能。
write操作在寫入系統(tǒng)緩沖區(qū)后直接返回孩灯。同步硬盤操作依賴于系統(tǒng)調(diào)度機(jī)制闺金,
例如:緩沖區(qū)頁(yè)空間寫滿或達(dá)到特定時(shí)間周期。同步文件之前峰档,如果此時(shí)系統(tǒng)故障宕機(jī)败匹,緩沖區(qū)內(nèi)數(shù)據(jù)將丟失。
?fsync針對(duì)單個(gè)文件操作(比如AOF文件)面哥,做強(qiáng)制硬盤同步哎壳,fsync將阻塞直到寫入硬盤完成后返回,保證了數(shù)據(jù)持久化尚卫。
使用everysec策略進(jìn)行AOF的sync時(shí)归榕,當(dāng)系統(tǒng)硬盤資源繁忙時(shí)可能會(huì)阻塞主線程。
1)everysec配置最多可能丟失2秒數(shù)據(jù)吱涉,不是1秒刹泄。
2)如果系統(tǒng)fsync緩慢,將會(huì)導(dǎo)致Redis主線程阻塞影響效率怎爵。
3)隨著AOF文件越來越大特石,需要定期對(duì)AOF文件進(jìn)行重寫,達(dá)到壓縮的目的鳖链。
AOF文件重寫是把Redis進(jìn)程內(nèi)的數(shù)據(jù)轉(zhuǎn)化為寫命令同步到新AOF文件的過程姆蘸。
上圖3.2)由于fork操作運(yùn)用寫時(shí)復(fù)制技術(shù),子進(jìn)程只能共享fork操作時(shí)的內(nèi)存數(shù)據(jù)芙委。由于父進(jìn)程依然響應(yīng)命令逞敷,Redis使用“AOF重寫緩沖區(qū)”保存這部分新數(shù)據(jù),防止新AOF文件生成期間丟失這部分?jǐn)?shù)據(jù)灌侣。
重寫達(dá)到壓縮的原因:
1)進(jìn)程內(nèi)已經(jīng)超時(shí)的數(shù)據(jù)不再寫入文件推捐。
2)舊的AOF文件含有無效命令,如del key1等侧啼。重寫使用進(jìn)程內(nèi)數(shù)據(jù)直接生成牛柒,這樣新的AOF文件只保留最終數(shù)據(jù)的寫入命令堪簿。
3)多條寫命令可以合并為一個(gè),如:lpush list a皮壁、lpushlist b椭更、lpush list c可以轉(zhuǎn)化為:lpush list a b c。
為了防止單條命令過大造成客戶端緩沖區(qū)溢出闪彼,對(duì)于list甜孤、set、hash畏腕、zset等類型操作,以64個(gè)元素為界拆分為多條茉稠。
觸發(fā)時(shí)機(jī):
手動(dòng)觸發(fā):直接調(diào)用bgrewriteaof命令描馅。
自動(dòng)觸發(fā):根據(jù)auto-aof-rewrite-min-size(默認(rèn)64M)和auto-aof-rewrite-percentage參數(shù)確定自動(dòng)觸發(fā)時(shí)機(jī)。
自動(dòng)觸發(fā)時(shí)機(jī)=[(aof_current_size>auto-aof-rewrite-min-size)
&& ((aof_current_size-aof_base_size)/aof_base_size>=auto-aof-rewrite-percentage)]
4)當(dāng)Redis服務(wù)器重啟時(shí)而线,可以加載AOF文件進(jìn)行數(shù)據(jù)恢復(fù)铭污。
3、重啟加載
注意:
雖然fork創(chuàng)建的子進(jìn)程不需要拷貝父進(jìn)程的物理內(nèi)存空間膀篮,但是會(huì)復(fù)制父進(jìn)程的空間內(nèi)存頁(yè)表嘹狞。
例如對(duì)于10GB的Redis進(jìn)程,需要復(fù)制大約20MB的內(nèi)存頁(yè)表誓竿,因此fork操作耗時(shí)跟進(jìn)程總內(nèi)存量息息相關(guān)磅网,
線上建議每個(gè)Redis實(shí)例內(nèi)存控制在10GB以內(nèi)。
或者降低fork操作的頻率筷屡,如適度放寬AOF自動(dòng)觸發(fā)時(shí)機(jī)涧偷,避免不必要的全量復(fù)制等。
二毙死、復(fù)制
1燎潮、配置
建立主從關(guān)系
1)在配置文件中加入slaveof{masterHost}{masterPort}隨Redis啟動(dòng)生效。
2)在redis-server啟動(dòng)命令后加入--slaveof{masterHost}{masterPort}生效扼倘。
3)直接使用命令:slaveof{masterHost}{masterPort}生效确封。
斷開主從:從節(jié)點(diǎn)執(zhí)行slaveof no one命令斷開與主節(jié)點(diǎn)的復(fù)制關(guān)系。
#主節(jié)點(diǎn)6379復(fù)制狀態(tài)信息:
127.0.0.1:6379>info replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6379,state=online,offset=43,lag=0
....
#從節(jié)點(diǎn)6380復(fù)制狀態(tài)信息:
127.0.0.1:6380>info replication
#Replication
role:slave
master_host:127.0.0.1
master_port:6380
master_link_status:up
master_last_io_seconds_ago:4
master_sync_in_progress:0
...
切主操作流程如下:
1)斷開與舊主節(jié)點(diǎn)復(fù)制關(guān)系再菊。2)與新主節(jié)點(diǎn)建立復(fù)制關(guān)系爪喘。3)刪除從節(jié)點(diǎn)當(dāng)前所有數(shù)據(jù)。4)對(duì)新主節(jié)點(diǎn)進(jìn)行復(fù)制操作袄简。切主后從節(jié)點(diǎn)會(huì)清空之前所有的數(shù)據(jù)腥放,線上人工操作時(shí)小心slaveof在錯(cuò)誤的節(jié)點(diǎn)上執(zhí)行或者指向錯(cuò)誤的主節(jié)點(diǎn)。
默認(rèn)情況下绿语,從節(jié)點(diǎn)使用slave-read-only=yes配置為只讀模式秃症。
repl-disable-tcp-node-lay參數(shù)
?當(dāng)關(guān)閉時(shí)候址,主節(jié)點(diǎn)產(chǎn)生的命令數(shù)據(jù)無論大小都會(huì)及時(shí)地發(fā)送給從節(jié)點(diǎn),這樣主從之間延遲會(huì)變小种柑,但增加了網(wǎng)絡(luò)帶寬的消耗岗仑。適用于主從之間的網(wǎng)絡(luò)環(huán)境良好的場(chǎng)景,如同機(jī)架或同機(jī)房部署聚请。 默認(rèn)關(guān)閉
?當(dāng)開啟時(shí)荠雕,主節(jié)點(diǎn)會(huì)合并較小的TCP數(shù)據(jù)包從而節(jié)省帶寬。默認(rèn)發(fā)送時(shí)間間隔取決于Linux的內(nèi)核驶赏,一般默認(rèn)為40毫秒炸卑。這種配置節(jié)省了帶寬但增大主從之間的延遲。適用于主從網(wǎng)絡(luò)環(huán)境復(fù)雜或帶寬緊張的場(chǎng)景煤傍,如跨機(jī)房部署盖文。
主從之間通過長(zhǎng)鏈接彼此發(fā)送心跳命令。
主節(jié)點(diǎn)默認(rèn)每隔10秒對(duì)從節(jié)點(diǎn)發(fā)送ping命令蚯姆,判斷從節(jié)點(diǎn)的存活性和連接狀態(tài)五续。可通過參數(shù)repl-ping-slave-period控制發(fā)送頻率龄恋。
從節(jié)點(diǎn)在主線程中每隔1秒發(fā)送replconf ack{offset}命令疙驾,給主節(jié)點(diǎn)上報(bào)自身當(dāng)前的復(fù)制偏移量。
主節(jié)點(diǎn)根據(jù)replconf命令判斷從節(jié)點(diǎn)超時(shí)時(shí)間郭毕,體現(xiàn)在info replication統(tǒng)計(jì)中的lag信息中它碎,lag表示與從節(jié)點(diǎn)最后一次通信延遲的秒數(shù),正常延遲應(yīng)該在0和1之間铣卡。如果超過repl-timeout配置的值(默認(rèn)60秒)链韭,則判定從節(jié)點(diǎn)下線并斷開復(fù)制客戶端連接。
2煮落、常見拓?fù)?/h1>
image
用于主節(jié)點(diǎn)出現(xiàn)宕機(jī)時(shí)從節(jié)點(diǎn)提供故障轉(zhuǎn)移支持敞峭。當(dāng)應(yīng)用寫命令并發(fā)量較高且需要持久化時(shí),可以只在從節(jié)點(diǎn)上開啟AOF蝉仇,這樣既保證數(shù)據(jù)安全性同時(shí)也避免了持久化對(duì)主節(jié)點(diǎn)的性能干擾旋讹。
注意主節(jié)點(diǎn)宕機(jī)后,先斷開主從復(fù)制關(guān)系轿衔,再重啟主節(jié)點(diǎn)沉迹。
一主多從結(jié)構(gòu)(又稱為星形拓?fù)浣Y(jié)構(gòu))使得應(yīng)用端可以利用多個(gè)從節(jié)點(diǎn)實(shí)現(xiàn)讀寫分離(見圖6-5)。對(duì)于讀占比較大的場(chǎng)景害驹,可以把讀命令發(fā)送到從節(jié)點(diǎn)來分擔(dān)主節(jié)點(diǎn)壓力鞭呕。
但是對(duì)于寫并發(fā)量較高的場(chǎng)景,多個(gè)從節(jié)點(diǎn)會(huì)導(dǎo)致主節(jié)點(diǎn)寫命令的多次發(fā)送從而過度消耗網(wǎng)絡(luò)帶寬宛官,同時(shí)也加重了主節(jié)點(diǎn)的負(fù)載影響服務(wù)穩(wěn)定性葫松⊥吒猓可下面采用樹形結(jié)構(gòu)
當(dāng)主節(jié)點(diǎn)需要掛載多個(gè)從節(jié)點(diǎn)時(shí)為了避免對(duì)主節(jié)點(diǎn)的性能干擾,可以采用樹狀主從結(jié)構(gòu)降低主節(jié)點(diǎn)壓力腋么。
3咕娄、原理
復(fù)制分為全量復(fù)制和部分復(fù)制。
全量復(fù)制:一般用于初次復(fù)制場(chǎng)景珊擂,把主節(jié)點(diǎn)全部數(shù)據(jù)一次性發(fā)送給從節(jié)點(diǎn)圣勒,當(dāng)數(shù)據(jù)量較大時(shí),會(huì)對(duì)主從節(jié)點(diǎn)和網(wǎng)絡(luò)造成很大的開銷摧扇。Redis早期支持的復(fù)制功能只有全量復(fù)制圣贸。
部分復(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ù)制的過高開銷。
主從復(fù)制組件介紹
?主從節(jié)點(diǎn)各自復(fù)制偏移量橙困。
參與復(fù)制的主從節(jié)點(diǎn)都會(huì)維護(hù)自身復(fù)制偏移量瞧掺,用于確定主從之間延遲,進(jìn)行部分復(fù)制
#主
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)復(fù)制積壓緩沖區(qū)凡傅。
復(fù)制積壓緩沖區(qū)是保存在主節(jié)點(diǎn)上的一個(gè)固定長(zhǎng)度的隊(duì)列辟狈,默認(rèn)大小為1MB,當(dāng)主節(jié)點(diǎn)有連接的從節(jié)點(diǎn)(slave)時(shí)被創(chuàng)建夏跷,這時(shí)主節(jié)點(diǎn)(master)響應(yīng)寫命令時(shí)哼转,不但會(huì)把命令發(fā)送給從節(jié)點(diǎn),還會(huì)寫入復(fù)制積壓緩沖區(qū)槽华。
127.0.0.1:6379> info replication
# Replication
role:master...repl_backlog_active:1 // 開啟復(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)度。
?主節(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的主要作用是用來唯一識(shí)別Redis節(jié)點(diǎn),比如從節(jié)點(diǎn)保存主節(jié)點(diǎn)的運(yùn)行ID識(shí)別自己正在復(fù)制的是哪個(gè)主節(jié)點(diǎn)亲雪。需要注意的是Redis關(guān)閉再啟動(dòng)后勇凭,運(yùn)行ID會(huì)隨之改變。
如果只使用ip+port的方式識(shí)別主節(jié)點(diǎn)义辕,那么主節(jié)點(diǎn)重啟變更了整體數(shù)據(jù)集(如替換RDB/AOF文件)虾标,從節(jié)點(diǎn)再基于偏移量復(fù)制數(shù)據(jù)將是不安全的。
# redis-cli -p 6379 info server | grep run_id
run_id:545f7c76183d0798a327591395b030000ee6def9
?psync命令
?如果回復(fù)+FULLRESYNC{runId}{offset}灌砖,那么從節(jié)點(diǎn)將觸發(fā)全量復(fù)制流程璧函。
?如果回復(fù)+CONTINUE傀蚌,從節(jié)點(diǎn)將觸發(fā)部分復(fù)制流程。
?如果回復(fù)+ERR柳譬,說明主節(jié)點(diǎn)版本低于Redis2.8喳张,無法識(shí)別psync命令,從節(jié)點(diǎn)將發(fā)送舊版的sync命令觸發(fā)全量復(fù)制流程美澳。
全量復(fù)制
對(duì)于從節(jié)點(diǎn)開始接收RDB快照到接收完成期間销部,主節(jié)點(diǎn)仍然響應(yīng)讀寫命令,因此主節(jié)點(diǎn)會(huì)把這期間寫命令數(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ù)一致性雨膨。(上圖6步驟)
RDB文件從創(chuàng)建到傳輸完畢消耗的總時(shí)間擂涛,超過repl-timeout所配置的值(默認(rèn)60秒),從節(jié)點(diǎn)將放棄接受RDB文件并清理已經(jīng)下載的臨時(shí)文件聊记,導(dǎo)致全量復(fù)制失敗撒妈。
如果主節(jié)點(diǎn)創(chuàng)建和傳輸RDB的時(shí)間過長(zhǎng),對(duì)于高流量寫入場(chǎng)景非常容易造成主節(jié)點(diǎn)復(fù)制客戶端緩沖區(qū)溢出排监。默認(rèn)配置為client-output-buffer-limit slave256MB64MB60狰右,如果60秒內(nèi)緩沖區(qū)消耗持續(xù)大于64MB或者直接超過256MB時(shí),主節(jié)點(diǎn)將直接關(guān)閉復(fù)制客戶端連接舆床,造成全量同步失敗棋蚌。因此,運(yùn)維人員需要根據(jù)主節(jié)點(diǎn)數(shù)據(jù)量和寫命令并發(fā)量調(diào)整client-output-buffer-limit slave配置挨队,避免全量復(fù)制期間客戶端緩沖區(qū)溢出谷暮。
全量復(fù)制非常耗時(shí)費(fèi)力,它的時(shí)間開銷主要包括:
?主節(jié)點(diǎn)bgsave時(shí)間盛垦。
?RDB文件網(wǎng)絡(luò)傳輸時(shí)間湿弦。
?從節(jié)點(diǎn)清空數(shù)據(jù)時(shí)間。
?從節(jié)點(diǎn)加載RDB的時(shí)間情臭。
?可能的AOF重寫時(shí)間省撑。
部分復(fù)制
部分復(fù)制利用psync{runId}{offset}命令實(shí)現(xiàn)。
當(dāng)從節(jié)點(diǎn)(slave)正在復(fù)制主節(jié)點(diǎn)(master)時(shí)俯在,如果出現(xiàn)網(wǎng)絡(luò)閃斷或者命令丟失等異常情況時(shí)竟秫,從節(jié)點(diǎn)會(huì)向主節(jié)點(diǎn)要求補(bǔ)發(fā)丟失的命令數(shù)據(jù),如果主節(jié)點(diǎn)的復(fù)制積壓緩沖區(qū)(默認(rèn)1M)內(nèi)存在這部分?jǐn)?shù)據(jù)則直接發(fā)送給從節(jié)點(diǎn)跷乐,這樣就可以保持主從節(jié)點(diǎn)復(fù)制的一致性肥败。補(bǔ)發(fā)的這部分?jǐn)?shù)據(jù)一般遠(yuǎn)遠(yuǎn)小于全量數(shù)據(jù),所以開銷很小
4、主從復(fù)制注意的問題
主從數(shù)據(jù)延遲:可以通過監(jiān)控主從偏移量馒稍,超過一定閥值報(bào)警皿哨,并遷移到其他延遲小的從節(jié)點(diǎn)。
讀到過期數(shù)據(jù):
過期的key刪除策略主要有兩種:惰性刪除(讀取key之前檢查是否過期)和定時(shí)刪除(內(nèi)部定時(shí)任務(wù)會(huì)循環(huán)采樣一定數(shù)量的鍵纽谒,當(dāng)發(fā)現(xiàn)采樣的鍵過期時(shí)執(zhí)行del命令)证膨。
由于從節(jié)點(diǎn)不能主動(dòng)刪除key,過期key由主節(jié)點(diǎn)刪除后同步到從節(jié)點(diǎn)鼓黔,因此從節(jié)點(diǎn)可能讀到過期數(shù)據(jù)央勒。
redis3.2之后版本支持從節(jié)點(diǎn)讀取數(shù)據(jù)之前會(huì)檢查鍵的過期時(shí)間來決定是否返回?cái)?shù)據(jù)。
避免全量復(fù)制:
第一次建立復(fù)制(無法避免)
節(jié)點(diǎn)運(yùn)行ID不匹配(手動(dòng)提升從節(jié)點(diǎn)為主節(jié)點(diǎn)或者采用支持自動(dòng)故障轉(zhuǎn)移的哨兵或集群方案)
復(fù)制積壓緩沖區(qū)不足(保證repl_backlog_size>net_break_time*write_size_per_minute澳化,從而避免因復(fù)制積壓緩沖區(qū)不足造成的全量復(fù)制)
規(guī)避復(fù)制風(fēng)暴:
作者:康康不遛貓
鏈接:http://www.reibang.com/p/c723cb3d0483
來源:簡(jiǎn)書
著作權(quán)歸作者所有崔步。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處缎谷。