欧美亚洲韩国_av电影院在线看_久久久久97_台湾佬中文娱乐网欧美电影

站長資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

Redis經(jīng)典技巧之詳解持久化原理

本篇文章給大家?guī)砹岁P(guān)于Redis的相關(guān)知識,其中主要介紹了持久化的相關(guān)問題,可以從幾個(gè)方面介紹一下redis持久化的機(jī)制原理,希望對大家有幫助。

Redis經(jīng)典技巧之詳解持久化原理

推薦學(xué)習(xí):Redis教程

本文將從以下幾個(gè)方面介紹Redis持久化機(jī)制:

Redis經(jīng)典技巧之詳解持久化原理

本文從整體上詳細(xì)介紹Redis的兩種持久化方式,包含工作原理、持久化流程及實(shí)踐策略,以及背后的一些理論知識。上一篇文章僅介紹了RDB持久化,但是Redis持久化是一個(gè)整體,單獨(dú)介紹不成體系,故重新整理。

Redis是一個(gè)內(nèi)存數(shù)據(jù)庫,所有的數(shù)據(jù)將保存在內(nèi)存中,這與傳統(tǒng)的MySQL、Oracle、SqlServer等關(guān)系型數(shù)據(jù)庫直接把數(shù)據(jù)保存到硬盤相比,Redis的讀寫效率非常高。但是保存在內(nèi)存中也有一個(gè)很大的缺陷,一旦斷電或者宕機(jī),內(nèi)存數(shù)據(jù)庫中的內(nèi)容將會全部丟失。為了彌補(bǔ)這一缺陷,Redis提供了把內(nèi)存數(shù)據(jù)持久化到硬盤文件,以及通過備份文件來恢復(fù)數(shù)據(jù)的功能,即Redis持久化機(jī)制。

Redis支持兩種方式的持久化:RDB快照和AOF。

RDB持久化

RDB快照用官方的話來說:RDB持久化方案是按照指定時(shí)間間隔對你的數(shù)據(jù)集生成的時(shí)間點(diǎn)快照(point-to-time snapshot)。它以緊縮的二進(jìn)制文件保存Redis數(shù)據(jù)庫某一時(shí)刻所有數(shù)據(jù)對象的內(nèi)存快照,可用于Redis的數(shù)據(jù)備份、轉(zhuǎn)移與恢復(fù)。到目前為止,仍是官方的默認(rèn)支持方案。

RDB工作原理

既然說RDB是Redis中數(shù)據(jù)集的時(shí)間點(diǎn)快照,那我們先簡單了解一下Redis內(nèi)的數(shù)據(jù)對象在內(nèi)存中是如何存儲與組織的。

默認(rèn)情況下,Redis中有16個(gè)數(shù)據(jù)庫,編號從0-15,每個(gè)Redis數(shù)據(jù)庫使用一個(gè)redisDb對象來表示,redisDb使用hashtable存儲K-V對象。為方便理解,我以其中一個(gè)db為例繪制Redis內(nèi)部數(shù)據(jù)的存儲結(jié)構(gòu)示意圖。 Redis經(jīng)典技巧之詳解持久化原理 時(shí)間點(diǎn)快照也就是某一時(shí)刻Redis內(nèi)每個(gè)DB中每個(gè)數(shù)據(jù)對象的狀態(tài),先假設(shè)在這一時(shí)刻所有的數(shù)據(jù)對象不再改變,我們就可以按照上圖中的數(shù)據(jù)結(jié)構(gòu)關(guān)系,把這些數(shù)據(jù)對象依次讀取出來并寫入到文件中,以此實(shí)現(xiàn)Redis的持久化。然后,當(dāng)Redis重啟時(shí)按照規(guī)則讀取這個(gè)文件中的內(nèi)容,再寫入到Redis內(nèi)存即可恢復(fù)至持久化時(shí)的狀態(tài)。

當(dāng)然,這個(gè)前提時(shí)我們上面的假設(shè)成立,否則面對一個(gè)時(shí)刻變化的數(shù)據(jù)集,我們無從下手。我們知道Redis中客戶端命令處理是單線程模型,如果把持久化作為一個(gè)命令處理,那數(shù)據(jù)集肯定時(shí)處于靜止?fàn)顟B(tài)。另外,操作系統(tǒng)提供的fork()函數(shù)創(chuàng)建的子進(jìn)程可獲得與父進(jìn)程一致的內(nèi)存數(shù)據(jù),相當(dāng)于獲取了內(nèi)存數(shù)據(jù)副本;fork完成后,父進(jìn)程該干嘛干嘛,持久化狀態(tài)的工作交給子進(jìn)程就行了。

很顯然,第一種情況不可取,持久化備份會導(dǎo)致短時(shí)間內(nèi)Redis服務(wù)不可用,這對于高HA的系統(tǒng)來講是無法容忍的。所以,第二種方式是RDB持久化的主要實(shí)踐方式。由于fork子進(jìn)程后,父進(jìn)程數(shù)據(jù)一直在變化,子進(jìn)程并不與父進(jìn)程同步,RDB持久化必然無法保證實(shí)時(shí)性;RDB持久化完成后發(fā)生斷電或宕機(jī),會導(dǎo)致部分?jǐn)?shù)據(jù)丟失;備份頻率決定了丟失數(shù)據(jù)量的大小,提高備份頻率,意味著fork過程消耗較多的CPU資源,也會導(dǎo)致較大的磁盤I/O。

持久化流程

在Redis內(nèi)完成RDB持久化的方法有rdbSave和rdbSaveBackground兩個(gè)函數(shù)方法(源碼文件rdb.c中),先簡單說下兩者差別:

  • rdbSave:是同步執(zhí)行的,方法調(diào)用后就會立刻啟動持久化流程。由于Redis是單線程模型,持久化過程中會阻塞,Redis無法對外提供服務(wù);

  • rdbSaveBackground:是后臺(異步)執(zhí)行的,該方法會fork出子進(jìn)程,真正的持久化過程是在子進(jìn)程中執(zhí)行的(調(diào)用rdbSave),主進(jìn)程會繼續(xù)提供服務(wù);

RDB持久化的觸發(fā)必然離不開以上兩個(gè)方法,觸發(fā)的方式分為手動和自動。手動觸發(fā)容易理解,是指我們通過Redis客戶端人為的對Redis服務(wù)端發(fā)起持久化備份指令,然后Redis服務(wù)端開始執(zhí)行持久化流程,這里的指令有save和bgsave。自動觸發(fā)是Redis根據(jù)自身運(yùn)行要求,在滿足預(yù)設(shè)條件時(shí)自動觸發(fā)的持久化流程,自動觸發(fā)的場景有如下幾個(gè)(摘自這篇文章):

  • serverCron中save m n配置規(guī)則自動觸發(fā);

  • 從節(jié)點(diǎn)全量復(fù)制時(shí),主節(jié)點(diǎn)發(fā)送rdb文件給從節(jié)點(diǎn)完成復(fù)制操作,主節(jié)點(diǎn)會出發(fā)bgsave;

  • 執(zhí)行debug reload命令重新加載redis時(shí);

  • 默認(rèn)情況下(未開啟AOF)執(zhí)行shutdown命令時(shí),自動執(zhí)行bgsave;

結(jié)合源碼及參考文章,我整理了RDB持久化流程來幫助大家有個(gè)整體的了解,然后再從一些細(xì)節(jié)進(jìn)行說明。 Redis經(jīng)典技巧之詳解持久化原理 從上圖可以知道:

  • 自動觸發(fā)的RDB持久化是通過rdbSaveBackground以子進(jìn)程方式執(zhí)行的持久化策略;

  • 手動觸發(fā)是以客戶端命令方式觸發(fā)的,包含save和bgsave兩個(gè)命令,其中save命令是在Redis的命令處理線程以阻塞的方式調(diào)用rdbSave方法完成的。

自動觸發(fā)流程是一個(gè)完整的鏈路,涵蓋了rdbSaveBackground、rdbSave等,接下來我以serverCron為例分析一下整個(gè)流程。

save規(guī)則及檢查

serverCron是Redis內(nèi)的一個(gè)周期性函數(shù),每隔100毫秒執(zhí)行一次,它的其中一項(xiàng)工作就是:根據(jù)配置文件中save規(guī)則來判斷當(dāng)前需要進(jìn)行自動持久化流程,如果滿足條件則嘗試開始持久化。了解一下這部分的實(shí)現(xiàn)。

redisServer中有幾個(gè)與RDB持久化有關(guān)的字段,我從代碼中摘出來,中英文對照著看下:

struct redisServer {  /* 省略其他字段 */      /* RDB persistence */     long long dirty;                /* Changes to DB from the last save              * 上次持久化后修改key的次數(shù) */     struct saveparam *saveparams;   /* Save points array for RDB,              * 對應(yīng)配置文件多個(gè)save參數(shù) */     int saveparamslen;              /* Number of saving points,              * save參數(shù)的數(shù)量 */     time_t lastsave;                /* Unix time of last successful save               * 上次持久化時(shí)間*/     /* 省略其他字段 */ }  /* 對應(yīng)redis.conf中的save參數(shù) */ struct saveparam {     time_t seconds;     /* 統(tǒng)計(jì)時(shí)間范圍 */        int changes;     /* 數(shù)據(jù)修改次數(shù) */ };

saveparams對應(yīng)redis.conf下的save規(guī)則,save參數(shù)是Redis觸發(fā)自動備份的觸發(fā)策略,seconds為統(tǒng)計(jì)時(shí)間(單位:秒), changes為在統(tǒng)計(jì)時(shí)間內(nèi)發(fā)生寫入的次數(shù)。save m n的意思是:m秒內(nèi)有n條寫入就觸發(fā)一次快照,即備份一次。save參數(shù)可以配置多組,滿足在不同條件的備份要求。如果需要關(guān)閉RDB的自動備份策略,可以使用save ""。以下為幾種配置的說明:

# 表示900秒(15分鐘)內(nèi)至少有1個(gè)key的值發(fā)生變化,則執(zhí)行 save 900 1 # 表示300秒(5分鐘)內(nèi)至少有1個(gè)key的值發(fā)生變化,則執(zhí)行 save 300 10 # 表示60秒(1分鐘)內(nèi)至少有10000個(gè)key的值發(fā)生變化,則執(zhí)行 save 60 10000 # 該配置將會關(guān)閉RDB方式的持久化 save ""

serverCron對RDB save規(guī)則的檢測代碼如下所示:

int serverCron(struct aeEventLoop *eventLoop, long long id, void *clientData) {     /* 省略其他邏輯 */          /* 如果用戶請求進(jìn)行AOF文件重寫時(shí),Redis正在執(zhí)行RDB持久化,Redis會安排在RDB持久化完成后執(zhí)行AOF文件重寫,      * 如果aof_rewrite_scheduled為true,說明需要執(zhí)行用戶的請求 */     /* Check if a background saving or AOF rewrite in progress terminated. */     if (hasActiveChildProcess() || ldbPendingChildren())     {         run_with_period(1000) receiveChildInfo();         checkChildrenDone();     } else {         /* 后臺無 saving/rewrite 子進(jìn)程才會進(jìn)行,逐個(gè)檢查每個(gè)save規(guī)則*/         for (j = 0; j < server.saveparamslen; j++) {             struct saveparam *sp = server.saveparams+j;                          /* 檢查規(guī)則有幾個(gè):滿足修改次數(shù),滿足統(tǒng)計(jì)周期,達(dá)到重試時(shí)間間隔或者上次持久化完成*/             if (server.dirty >= sp->changes                  && server.unixtime-server.lastsave > sp->seconds                  &&(server.unixtime-server.lastbgsave_try > CONFIG_BGSAVE_RETRY_DELAY || server.lastbgsave_status == C_OK))             {                 serverLog(LL_NOTICE,"%d changes in %d seconds. Saving...", sp->changes, (int)sp->seconds);                 rdbSaveInfo rsi, *rsiptr;                 rsiptr = rdbPopulateSaveInfo(&rsi);                 /* 執(zhí)行bgsave過程 */                 rdbSaveBackground(server.rdb_filename,rsiptr);                 break;             }         }          /* 省略:Trigger an AOF rewrite if needed. */     }  /* 省略其他邏輯 */ }

如果沒有后臺的RDB持久化或AOF重寫進(jìn)程,serverCron會根據(jù)以上配置及狀態(tài)判斷是否需要執(zhí)行持久化操作,判斷依據(jù)就是看lastsave、dirty是否滿足saveparams數(shù)組中的其中一個(gè)條件。如果有一個(gè)條件匹配,則調(diào)用rdbSaveBackground方法,執(zhí)行異步持久化流程。

rdbSaveBackground

rdbSaveBackground是RDB持久化的輔助性方法,主要工作是fork子進(jìn)程,然后根據(jù)調(diào)用方(父進(jìn)程或者子進(jìn)程)不同,有兩種不同的執(zhí)行邏輯。

  • 如果調(diào)用方是父進(jìn)程,則fork出子進(jìn)程,保存子進(jìn)程信息后直接返回。

  • 如果調(diào)用方是子進(jìn)程則調(diào)用rdbSave執(zhí)行RDB持久化邏輯,持久化完成后退出子進(jìn)程。

int rdbSaveBackground(char *filename, rdbSaveInfo *rsi) {     pid_t childpid;      if (hasActiveChildProcess()) return C_ERR;      server.dirty_before_bgsave = server.dirty;     server.lastbgsave_try = time(NULL);      // fork子進(jìn)程     if ((childpid = redisFork(CHILD_TYPE_RDB)) == 0) {         int retval;          /* Child 子進(jìn)程:修改進(jìn)程標(biāo)題 */         redisSetProcTitle("redis-rdb-bgsave");         redisSetCpuAffinity(server.bgsave_cpulist);         // 執(zhí)行rdb持久化         retval = rdbSave(filename,rsi);         if (retval == C_OK) {             sendChildCOWInfo(CHILD_TYPE_RDB, 1, "RDB");         }         // 持久化完成后,退出子進(jìn)程         exitFromChild((retval == C_OK) ? 0 : 1);     } else {         /* Parent 父進(jìn)程:記錄fork子進(jìn)程的時(shí)間等信息*/         if (childpid == -1) {             server.lastbgsave_status = C_ERR;             serverLog(LL_WARNING,"Can't save in background: fork: %s",                 strerror(errno));             return C_ERR;         }         serverLog(LL_NOTICE,"Background saving started by pid %ld",(long) childpid);         // 記錄子進(jìn)程開始的時(shí)間、類型等。         server.rdb_save_time_start = time(NULL);         server.rdb_child_type = RDB_CHILD_TYPE_DISK;         return C_OK;     }     return C_OK; /* unreached */ }

rdbSave是真正執(zhí)行持久化的方法,它在執(zhí)行時(shí)存在大量的I/O、計(jì)算操作,耗時(shí)、CPU占用較大,在Redis的單線程模型中持久化過程會持續(xù)占用線程資源,進(jìn)而導(dǎo)致Redis無法提供其他服務(wù)。為了解決這一問題Redis在rdbSaveBackground中fork出子進(jìn)程,由子進(jìn)程完成持久化工作,避免了占用父進(jìn)程過多的資源。

需要注意的是,如果父進(jìn)程內(nèi)存占用過大,fork過程會比較耗時(shí),在這個(gè)過程中父進(jìn)程無法對外提供服務(wù);另外,需要綜合考慮計(jì)算機(jī)內(nèi)存使用量,fork子進(jìn)程后會占用雙倍的內(nèi)存資源,需要確保內(nèi)存夠用。通過info stats命令查看latest_fork_usec選項(xiàng),可以獲取最近一個(gè)fork以操作的耗時(shí)。

rdbSave

Redis的rdbSave函數(shù)是真正進(jìn)行RDB持久化的函數(shù),流程、細(xì)節(jié)賊多,整體流程可以總結(jié)為:創(chuàng)建并打開臨時(shí)文件、Redis內(nèi)存數(shù)據(jù)寫入臨時(shí)文件、臨時(shí)文件寫入磁盤、臨時(shí)文件重命名為正式RDB文件、更新持久化狀態(tài)信息(dirty、lastsave)。其中“Redis內(nèi)存數(shù)據(jù)寫入臨時(shí)文件”最為核心和復(fù)雜,寫入過程直接體現(xiàn)了RDB文件的文件格式,本著一圖勝千言的理念,我按照源碼流程繪制了下圖。 Redis經(jīng)典技巧之詳解持久化原理 補(bǔ)充說明一下,上圖右下角“遍歷當(dāng)前數(shù)據(jù)庫的鍵值對并寫入”這個(gè)環(huán)節(jié)會根據(jù)不同類型的Redis數(shù)據(jù)類型及底層數(shù)據(jù)結(jié)構(gòu)采用不同的格式寫入到RDB文件中,不再展開了。我覺得大家對整個(gè)過程有個(gè)直觀的理解就好,這對于我們理解Redis內(nèi)部的運(yùn)作機(jī)制大有裨益。

AOF持久化

上一節(jié)我們知道RDB是一種時(shí)間點(diǎn)(point-to-time)快照,適合數(shù)據(jù)備份及災(zāi)難恢復(fù),由于工作原理的“先天性缺陷”無法保證實(shí)時(shí)性持久化,這對于緩存丟失零容忍的系統(tǒng)來說是個(gè)硬傷,于是就有了AOF。

AOF工作原理

AOF是Append Only File的縮寫,它是Redis的完全持久化策略,從1.1版本開始支持;這里的file存儲的是引起Redis數(shù)據(jù)修改的命令集合(比如:set/hset/del等),這些集合按照Redis Server的處理順序追加到文件中。當(dāng)重啟Redis時(shí),Redis就可以從頭讀取AOF中的指令并重放,進(jìn)而恢復(fù)關(guān)閉前的數(shù)據(jù)狀態(tài)。

AOF持久化默認(rèn)是關(guān)閉的,修改redis.conf以下信息并重啟,即可開啟AOF持久化功能。

# no-關(guān)閉,yes-開啟,默認(rèn)no appendonly yes appendfilename appendonly.aof

AOF本質(zhì)是為了持久化,持久化對象是Redis內(nèi)每一個(gè)key的狀態(tài),持久化的目的是為了在Reids發(fā)生故障重啟后能夠恢復(fù)至重啟前或故障前的狀態(tài)。相比于RDB,AOF采取的策略是按照執(zhí)行順序持久化每一條能夠引起Redis中對象狀態(tài)變更的命令,命令是有序的、有選擇的。把a(bǔ)of文件轉(zhuǎn)移至任何一臺Redis Server,從頭到尾按序重放這些命令即可恢復(fù)如初。舉個(gè)例子:

首先執(zhí)行指令set number 0,然后隨機(jī)調(diào)用incr numberget number 各5次,最后再執(zhí)行一次get number ,我們得到的結(jié)果肯定是5。

因?yàn)樵谶@個(gè)過程中,能夠引起number狀態(tài)變更的只有set/incr類型的指令,并且它們執(zhí)行的先后順序是已知的,無論執(zhí)行多少次get都不會影響number的狀態(tài)。所以,保留所有set/incr命令并持久化至aof文件即可。按照aof的設(shè)計(jì)原理,aof文件中的內(nèi)容應(yīng)該是這樣的(這里是假設(shè),實(shí)際為RESP協(xié)議):

set number 0 incr number incr number incr number incr number incr number

最本質(zhì)的原理用“命令重放”四個(gè)字就可以概括。但是,考慮實(shí)際生產(chǎn)環(huán)境的復(fù)雜性及操作系統(tǒng)等方面的限制,Redis所要考慮的工作要比這個(gè)例子復(fù)雜的多:

  • Redis Server啟動后,aof文件一直在追加命令,文件會越來越大。文件越大,Redis重啟后恢復(fù)耗時(shí)越久;文件太大,轉(zhuǎn)移工作就越難;不加管理,可能撐爆硬盤。很顯然,需要在合適的時(shí)機(jī)對文件進(jìn)行精簡。例子中的5條incr指令很明顯的可以替換為為一條set命令,存在很大的壓縮空間。

  • 眾所周知,文件I/O是操作系統(tǒng)性能的短板,為了提高效率,文件系統(tǒng)設(shè)計(jì)了一套復(fù)雜的緩存機(jī)制,Redis操作命令的追加操作只是把數(shù)據(jù)寫入了緩沖區(qū)(aof_buf),從緩沖區(qū)到寫入物理文件在性能與安全之間權(quán)衡會有不同的選擇。

  • 文件壓縮即意味著重寫,重寫時(shí)即可依據(jù)已有的aof文件做命令整合,也可以先根據(jù)當(dāng)前Redis內(nèi)數(shù)據(jù)的狀態(tài)做快照,再把存儲快照過程中的新增的命令做追加。

  • aof備份后的文件是為了恢復(fù)數(shù)據(jù),結(jié)合aof文件的格式、完整性等因素,Redis也要設(shè)計(jì)一套完整的方案做支持。

持久化流程

從流程上來看,AOF的工作原理可以概括為幾個(gè)步驟:命令追加(append)、文件寫入與同步(fsync)、文件重寫(rewrite)、重啟加載(load),接下來依次了解每個(gè)步驟的細(xì)節(jié)及背后的設(shè)計(jì)哲學(xué)。 Redis經(jīng)典技巧之詳解持久化原理

命令追加

當(dāng) AOF 持久化功能處于打開狀態(tài)時(shí),Redis 在執(zhí)行完一個(gè)寫命令之后,會以協(xié)議格式(也就是RESP,即 Redis 客戶端和服務(wù)器交互的通信協(xié)議 )把被執(zhí)行的寫命令追加到 Redis 服務(wù)端維護(hù)的 AOF 緩沖區(qū)末尾。對AOF文件只有單線程的追加操作,沒有seek等復(fù)雜的操作,即使斷電或宕機(jī)也不存在文件損壞風(fēng)險(xiǎn)。另外,使用文本協(xié)議好處多多:

  • 文本協(xié)議有很好的兼容性;

  • 文本協(xié)議就是客戶端的請求命令,不需要二次處理,節(jié)省了存儲及加載時(shí)的處理開銷;

  • 文本協(xié)議具有可讀性,方便查看、修改等處理。

AOF緩沖區(qū)類型為Redis自主設(shè)計(jì)的數(shù)據(jù)結(jié)構(gòu)sds,Redis會根據(jù)命令的類型采用不同的方法(catAppendOnlyGenericCommandcatAppendOnlyExpireAtCommand等)對命令內(nèi)容進(jìn)行處理,最后寫入緩沖區(qū)。

需要注意的是:如果命令追加時(shí)正在進(jìn)行AOF重寫,這些命令還會追加到重寫緩沖區(qū)(aof_rewrite_buffer)。

文件寫入與同步

AOF文件的寫入與同步離不開操作系統(tǒng)的支持,開始介紹之前,我們需要補(bǔ)充一下Linux I/O緩沖區(qū)相關(guān)知識。硬盤I/O性能較差,文件讀寫速度遠(yuǎn)遠(yuǎn)比不上CPU的處理速度,如果每次文件寫入都等待數(shù)據(jù)寫入硬盤,會整體拉低操作系統(tǒng)的性能。為了解決這個(gè)問題,操作系統(tǒng)提供了延遲寫(delayed write)機(jī)制來提高硬盤的I/O性能。 Redis經(jīng)典技巧之詳解持久化原理

傳統(tǒng)的UNIX實(shí)現(xiàn)在內(nèi)核中設(shè)有緩沖區(qū)高速緩存或頁面高速緩存,大多數(shù)磁盤I/O都通過緩沖進(jìn)行。 當(dāng)將數(shù)據(jù)寫入文件時(shí),內(nèi)核通常先將該數(shù)據(jù)復(fù)制到其中一個(gè)緩沖區(qū)中,如果該緩沖區(qū)尚未寫滿,則并不將其排入輸出隊(duì)列,而是等待其寫滿或者當(dāng)內(nèi)核需要重用該緩沖區(qū)以便存放其他磁盤塊數(shù)據(jù)時(shí), 再將該緩沖排入到輸出隊(duì)列,然后待其到達(dá)隊(duì)首時(shí),才進(jìn)行實(shí)際的I/O操作。這種輸出方式就被稱為延遲寫。

延遲寫減少了磁盤讀寫次數(shù),但是卻降低了文件內(nèi)容的更新速度,使得欲寫到文件中的數(shù)據(jù)在一段時(shí)間內(nèi)并沒有寫到磁盤上。當(dāng)系統(tǒng)發(fā)生故障時(shí),這種延遲可能造成文件更新內(nèi)容的丟失。為了保證磁盤上實(shí)際文件系統(tǒng)與緩沖區(qū)高速緩存中內(nèi)容的一致性,UNIX系統(tǒng)提供了sync、fsync和fdatasync三個(gè)函數(shù)為強(qiáng)制寫入硬盤提供支持。

Redis每次事件輪訓(xùn)結(jié)束前(beforeSleep)都會調(diào)用函數(shù)flushAppendOnlyFileflushAppendOnlyFile會把AOF緩沖區(qū)(aof_buf)中的數(shù)據(jù)寫入內(nèi)核緩沖區(qū),并且根據(jù)appendfsync配置來決定采用何種策略把內(nèi)核緩沖區(qū)中的數(shù)據(jù)寫入磁盤,即調(diào)用fsync()。該配置有三個(gè)可選項(xiàng)alwaysnoeverysec,具體說明如下:

  • always:每次都調(diào)用fsync(),是安全性最高、性能最差的一種策略。

  • no:不會調(diào)用fsync()。性能最好,安全性最差。

  • everysec:僅在滿足同步條件時(shí)調(diào)用fsync()。這是官方建議的同步策略,也是默認(rèn)配置,做到兼顧性能和數(shù)據(jù)安全性,理論上只有在系統(tǒng)突然宕機(jī)的情況下丟失1秒的數(shù)據(jù)。

注意:上面介紹的策略受配置項(xiàng)no-appendfsync-on-rewrite的影響,它的作用是告知Redis:AOF文件重寫期間是否禁止調(diào)用fsync(),默認(rèn)是no。

如果appendfsync設(shè)置為alwayseverysec,后臺正在進(jìn)行的BGSAVE或者BGREWRITEAOF消耗過多的磁盤I/O,在某些Linux系統(tǒng)配置下,Redis對fsync()的調(diào)用可能阻塞很長時(shí)間。然而這個(gè)問題還沒有修復(fù),因?yàn)榧词故窃诓煌木€程中執(zhí)行fsync(),同步寫入操作也會被阻塞。

為了緩解此問題,可以使用該選項(xiàng),以防止在進(jìn)行BGSAVEBGREWRITEAOF時(shí)在主進(jìn)程中調(diào)用fsync()。

  • 設(shè)置為yes意味著,如果子進(jìn)程正在進(jìn)行BGSAVEBGREWRITEAOF,AOF的持久化能力就與appendfsync設(shè)置為no有著相同的效果。最糟糕的情況下,這可能會導(dǎo)致30秒的緩存數(shù)據(jù)丟失。

  • 如果你的系統(tǒng)有上面描述的延遲問題,就把這個(gè)選項(xiàng)設(shè)置為yes,否則保持為no

文件重寫

如前面提到的,Redis長時(shí)間運(yùn)行,命令不斷寫入AOF,文件會越來越大,不加控制可能影響宿主機(jī)的安全。

為了解決AOF文件體積問題,Redis引入了AOF文件重寫功能,它會根據(jù)Redis內(nèi)數(shù)據(jù)對象的最新狀態(tài)生成新的AOF文件,新舊文件對應(yīng)的數(shù)據(jù)狀態(tài)一致,但是新文件會具有較小的體積。重寫既減少了AOF文件對磁盤空間的占用,又可以提高Redis重啟時(shí)數(shù)據(jù)恢復(fù)的速度。還是下面這個(gè)例子,舊文件中的6條命令等同于新文件中的1條命令,壓縮效果顯而易見。 Redis經(jīng)典技巧之詳解持久化原理我們說,AOF文件太大時(shí)會觸發(fā)AOF文件重寫,那到底是多大呢?有哪些情況會觸發(fā)重寫操作呢? ** 與RDB方式一樣,AOF文件重寫既可以手動觸發(fā),也會自動觸發(fā)。手動觸發(fā)直接調(diào)用bgrewriteaof命令,如果當(dāng)時(shí)無子進(jìn)程執(zhí)行會立刻執(zhí)行,否則安排在子進(jìn)程結(jié)束后執(zhí)行。自動觸發(fā)由Redis的周期性方法serverCron檢查在滿足一定條件時(shí)觸發(fā)。先了解兩個(gè)配置項(xiàng):

  • auto-aof-rewrite-percentage:代表當(dāng)前AOF文件大小(aof_current_size)和上一次重寫后AOF文件大小(aof_base_size)相比,增長的比例。

  • auto-aof-rewrite-min-size:表示運(yùn)行BGREWRITEAOF時(shí)AOF文件占用空間最小值,默認(rèn)為64MB;

Redis啟動時(shí)把aof_base_size初始化為當(dāng)時(shí)aof文件的大小,Redis運(yùn)行過程中,當(dāng)AOF文件重寫操作完成時(shí),會對其進(jìn)行更新;aof_current_sizeserverCron執(zhí)行時(shí)AOF文件的實(shí)時(shí)大小。當(dāng)滿足以下兩個(gè)條件時(shí),AOF文件重寫就會觸發(fā):

增長比例:(aof_current_size - aof_base_size) / aof_base_size > auto-aof-rewrite-percentage 文件大小:aof_current_size > auto-aof-rewrite-min-size

手動觸發(fā)與自動觸發(fā)的代碼如下,同樣在周期性方法serverCron中:

int serverCron(struct aeEventLoop *eventLoop, long long id, void *clientData) {     /* 省略其他邏輯 */          /* 如果用戶請求進(jìn)行AOF文件重寫時(shí),Redis正在執(zhí)行RDB持久化,Redis會安排在RDB持久化完成后執(zhí)行AOF文件重寫,      * 如果aof_rewrite_scheduled為true,說明需要執(zhí)行用戶的請求 */     if (!hasActiveChildProcess() &&         server.aof_rewrite_scheduled)     {         rewriteAppendOnlyFileBackground();     }      /* Check if a background saving or AOF rewrite in progress terminated. */     if (hasActiveChildProcess() || ldbPendingChildren())     {         run_with_period(1000) receiveChildInfo();         checkChildrenDone();     } else {         /* 省略rdb持久化條件檢查 */          /* AOF重寫條件檢查:aof開啟、無子進(jìn)程運(yùn)行、增長百分比已設(shè)置、當(dāng)前文件大小超過閾值 */         if (server.aof_state == AOF_ON &&             !hasActiveChildProcess() &&             server.aof_rewrite_perc &&             server.aof_current_size > server.aof_rewrite_min_size)         {             long long base = server.aof_rewrite_base_size ?                 server.aof_rewrite_base_size : 1;             /* 計(jì)算增長百分比 */             long long growth = (server.aof_current_size*100/base) - 100;             if (growth >= server.aof_rewrite_perc) {                 serverLog(LL_NOTICE,"Starting automatic rewriting of AOF on %lld%% growth",growth);                 rewriteAppendOnlyFileBackground();             }         }     }     /**/ }

AOF文件重寫的流程是什么?聽說Redis支持混合持久化,對AOF文件重寫有什么影響?

從4.0版本開始,Redis在AOF模式中引入了混合持久化方案,即:純AOF方式、RDB+AOF方式,這一策略由配置參數(shù)aof-use-rdb-preamble(使用RDB作為AOF文件的前半段)控制,默認(rèn)關(guān)閉(no),設(shè)置為yes可開啟。所以,在AOF重寫過程中文件的寫入會有兩種不同的方式。當(dāng)aof-use-rdb-preamble的值是:

  • no:按照AOF格式寫入命令,與4.0前版本無差別;

  • yes:先按照RDB格式寫入數(shù)據(jù)狀態(tài),然后把重寫期間AOF緩沖區(qū)的內(nèi)容以AOF格式寫入,文件前半部分為RDB格式,后半部分為AOF格式。

結(jié)合源碼(6.0版本,源碼太多這里不貼出,可參考aof.c)及參考資料,繪制AOF重寫(BGREWRITEAOF)流程圖: Redis經(jīng)典技巧之詳解持久化原理 結(jié)合上圖,總結(jié)一下AOF文件重寫的流程:

  • rewriteAppendOnlyFileBackground開始執(zhí)行,檢查是否有正在進(jìn)行的AOF重寫或RDB持久化子進(jìn)程:如果有,則退出該流程;如果沒有,則繼續(xù)創(chuàng)建接下來父子進(jìn)程間數(shù)據(jù)傳輸?shù)耐ㄐ殴艿馈?zhí)行fork()操作,成功后父子進(jìn)程分別執(zhí)行不同的流程。

  • 父進(jìn)程:
    • 記錄子進(jìn)程信息(pid)、時(shí)間戳等;

    • 繼續(xù)響應(yīng)其他客戶端請求;

    • 收集AOF重寫期間的命令,追加至aof_rewrite_buffer;

    • 等待并向子進(jìn)程同步aof_rewrite_buffer的內(nèi)容;

  • 子進(jìn)程:
    • 修改當(dāng)前進(jìn)程名稱,創(chuàng)建重寫所需的臨時(shí)文件,調(diào)用rewriteAppendOnlyFile函數(shù);

    • 根據(jù)aof-use-rdb-preamble配置,以RDB或AOF方式寫入前半部分,并同步至硬盤;

    • 從父進(jìn)程接收增量AOF命令,以AOF方式寫入后半部分,并同步至硬盤;

    • 重命名AOF文件,子進(jìn)程退出。

數(shù)據(jù)加載

Redis啟動后通過loadDataFromDisk函數(shù)執(zhí)行數(shù)據(jù)加載工作。這里需要注意,雖然持久化方式可以選擇AOF、RDB或者兩者兼用,但是數(shù)據(jù)加載時(shí)必須做出選擇,兩種方式各自加載一遍就亂套了。

理論上,AOF持久化比RDB具有更好的實(shí)時(shí)性,當(dāng)開啟了AOF持久化方式,Redis在數(shù)據(jù)加載時(shí)優(yōu)先考慮AOF方式。而且,Redis 4.0版本后AOF支持了混合持久化,加載AOF文件需要考慮版本兼容性。Redis數(shù)據(jù)加載流程如下圖所示: Redis經(jīng)典技巧之詳解持久化原理 在AOF方式下,開啟混合持久化機(jī)制生成的文件是“RDB頭+AOF尾”,未開啟時(shí)生成的文件全部為AOF格式。考慮兩種文件格式的兼容性,如果Redis發(fā)現(xiàn)AOF文件為RDB頭,會使用RDB數(shù)據(jù)加載的方法讀取并恢復(fù)前半部分;然后再使用AOF方式讀取并恢復(fù)后半部分。由于AOF格式存儲的數(shù)據(jù)為RESP協(xié)議命令,Redis采用偽客戶端執(zhí)行命令的方式來恢復(fù)數(shù)據(jù)。

如果在AOF命令追加過程中發(fā)生宕機(jī),由于延遲寫的技術(shù)特點(diǎn),AOF的RESP命令可能不完整(被截?cái)啵S龅竭@種情況時(shí),Redis會按照配置項(xiàng)aof-load-truncated執(zhí)行不同的處理策略。這個(gè)配置是告訴Redis啟動時(shí)讀取aof文件,如果發(fā)現(xiàn)文件被截?cái)啵ú煌暾r(shí)該如何處理:

  • yes:則盡可能多的加載數(shù)據(jù),并以日志的方式通知用戶;

  • no:則以系統(tǒng)錯(cuò)誤的方式崩潰,并禁止啟動,需要用戶修復(fù)文件后再重啟。

總結(jié)

Redis提供了兩種持久化的選擇:RDB支持以特定的實(shí)踐間隔為數(shù)據(jù)集生成時(shí)間點(diǎn)快照;AOF把Redis Server收到的每條寫指令持久化到日志中,待Redis重啟時(shí)通過重放命令恢復(fù)數(shù)據(jù)。日志格式為RESP協(xié)議,對日志文件只做append操作,無損壞風(fēng)險(xiǎn)。并且當(dāng)AOF文件過大時(shí)可以自動重寫壓縮文件。

當(dāng)然,如果你不需要對數(shù)據(jù)進(jìn)行持久化,也可以禁用Redis的持久化功能,但是大多數(shù)情況并非如此。實(shí)際上,我們時(shí)有可能同時(shí)使用RDB和AOF兩種方式的,最重要的就是我們要理解兩者的區(qū)別,以便合理使用。

RDB vs AOF

RDB優(yōu)點(diǎn)

  • RDB是一個(gè)緊湊壓縮的二進(jìn)制文件,代表Redis在某一個(gè)時(shí)間點(diǎn)上的數(shù)據(jù)快照,非常適合用于備份、全量復(fù)制等場景。

  • RDB對災(zāi)難恢復(fù)、數(shù)據(jù)遷移非常友好,RDB文件可以轉(zhuǎn)移至任何需要的地方并重新加載。

  • RDB是Redis數(shù)據(jù)的內(nèi)存快照,數(shù)據(jù)恢復(fù)速度較快,相比于AOF的命令重放有著更高的性能。

RDB缺點(diǎn)

  • RDB方式無法做到實(shí)時(shí)或秒級持久化。因?yàn)槌志没^程是通過fork子進(jìn)程后由子進(jìn)程完成的,子進(jìn)程的內(nèi)存只是在fork操作那一時(shí)刻父進(jìn)程的數(shù)據(jù)快照,而fork操作后父進(jìn)程持續(xù)對外服務(wù),內(nèi)部數(shù)據(jù)時(shí)刻變更,子進(jìn)程的數(shù)據(jù)不再更新,兩者始終存在差異,所以無法做到實(shí)時(shí)性。

  • RDB持久化過程中的fork操作,會導(dǎo)致內(nèi)存占用加倍,而且父進(jìn)程數(shù)據(jù)越多,fork過程越長。

  • Redis請求高并發(fā)可能會頻繁命中save規(guī)則,導(dǎo)致fork操作及持久化備份的頻率不可控;

  • RDB文件有文件格式要求,不同版本的Redis會對文件格式進(jìn)行調(diào)整,存在老版本無法兼容新版本的問題。

AOF優(yōu)點(diǎn)

  • AOF持久化有更好的實(shí)時(shí)性,我們可以選擇三種不同的方式(appendfsync):no、every second、always,every second作為默認(rèn)的策略具有最好的性能,極端情況下可能會丟失一秒的數(shù)據(jù)。

  • AOF文件只有append操作,無復(fù)雜的seek等文件操作,沒有損壞風(fēng)險(xiǎn)。即使最后寫入數(shù)據(jù)被截?cái)啵埠苋菀资褂?code>redis-check-aof工具修復(fù);

  • 當(dāng)AOF文件變大時(shí),Redis可在后臺自動重寫。重寫過程中舊文件會持續(xù)寫入,重寫完成后新文件將變得更小,并且重寫過程中的增量命令也會append到新文件。

  • AOF文件以已于理解與解析的方式包含了對Redis中數(shù)據(jù)的所有操作命令。即使不小心錯(cuò)誤的清除了所有數(shù)據(jù),只要沒有對AOF文件重寫,我們就可以通過移除最后一條命令找回所有數(shù)據(jù)。

  • AOF已經(jīng)支持混合持久化,文件大小可以有效控制,并提高了數(shù)據(jù)加載時(shí)的效率。

AOF缺點(diǎn)

  • 對于相同的數(shù)據(jù)集合,AOF文件通常會比RDB文件大;

  • 在特定的fsync策略下,AOF會比RDB略慢。一般來講,fsync_every_second的性能仍然很高,fsync_no的性能與RDB相當(dāng)。但是在巨大的寫壓力下,RDB更能提供最大的低延時(shí)保障。

  • 在AOF上,Redis曾經(jīng)遇到一些幾乎不可能在RDB上遇到的罕見bug。一些特殊的指令(如BRPOPLPUSH)導(dǎo)致重新加載的數(shù)據(jù)與持久化之前不一致,Redis官方曾經(jīng)在相同的條件下進(jìn)行測試,但是無法復(fù)現(xiàn)問題。

使用建議

對RDB和AOF兩種持久化方式的工作原理、執(zhí)行流程及優(yōu)缺點(diǎn)了解后,我們來思考下,實(shí)際場景中應(yīng)該怎么權(quán)衡利弊,合理的使用兩種持久化方式。如果僅僅是使用Redis作為緩存工具,所有數(shù)據(jù)可以根據(jù)持久化數(shù)據(jù)庫進(jìn)行重建,則可關(guān)閉持久化功能,做好預(yù)熱、緩存穿透、擊穿、雪崩之類的防護(hù)工作即可。

一般情況下,Redis會承擔(dān)

贊(0)
分享到: 更多 (0)
網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
主站蜘蛛池模板: 美女国产精品 | 自拍偷在线精品自拍偷无码专区 | 玖玖精品视频 | 亚洲国产综合久久 | 中文字幕色片 | 麻豆精品视频免费观看 | 色图av| 亚洲精品午夜aaa久久久 | 性――交――性――乱 | 日本一级做a爱片 | 精品国产一区在线 | 国产顶级毛片 | 精品日韩在线 | 男人的天堂黄色 | av黄色网址 | 久久在线免费观看视频 | 天天综合久久综合 | 免费久久 | 黄色高潮视频 | 一级片一级片一级片一级片 | 日韩在线一二三区 | www.激情网.com| 久久久久久毛片精品免费不卡 | 午夜99 | 午夜一级黄色大片 | 青青草一区二区 | 欧美激情精品久久久久 | 免费观看黄色网址 | 亚洲好骚| 国产一页 | 中文字幕一区二区三区精品 | 男女一区二区三区 | 亚洲黄网站在线观看 | 性大片潘金莲裸体 | 中文字幕av一区二区 | 99精品久久久久久中文字幕 | av视| 中文字幕第9页 | 青青草手机视频在线观看 | 国产精品一区二区三区不卡 | 欧美黄色免费在线观看 | 国产农村妇女aaaaa视频 | 逼逼爱插插网站 | 天天草天天草 | 青青草原伊人 | 亚洲性色av | 成人短视频在线免费观看 | 精品国产一区二区三区av 性色 | 自宅警备员在线观看 | 伊人资源| 这里只有精品9 | 色呦呦免费观看 | 中文字幕 欧美 日韩 | 成人午夜视频在线播放 | 午夜一级黄色片 | 超碰av在线 | 奇米久久 | 一区不卡在线观看 | 午夜影院一级片 | 狠狠操麻豆 | 亚洲精品男女 | 黄色国产在线 | 国产精品xxx在线观看 | 国产网站免费观看 | 色哥网| 男女视频免费看 | 人成在线免费视频 | 男女国产精品 | 高级毛片 | 亚洲欧美一区在线 | 成 年人 黄 色 片 | 中文天堂av| 野花国产精品入口 | www.av视频在线观看 | 久久久久国产精品视频 | 欧美日韩一区二区三 | 日韩精品首页 | 日韩精品免费在线观看 | 久久成人精品视频 | 日韩 在线 | 久久久天堂 | 久久r精品 | 好看的中文字幕第一页 | 三级黄色片免费 | 天天看片天天射 | 日韩黄色免费视频 | 日本性生活一级片 | 伊人艹 | 国产精品欧美一区二区三区 | 激情久久av一区av二区av三区 | 国产成人精品一区二区三区视频 | 就要干就要操 | 国产肥老妇视频 | 三级黄色小视频 | 国产成人精品综合 | 啪啪的网站 | 怡红院毛片 | 黄色高清网站 | 天天看天天爽 | 国产乱码精品一区二区三区精东 | 日本中文字幕免费 | 亚洲三区视频 | 992av | 男女无遮挡网站 | 五月激情六月婷婷 | 中文字幕免费看 | 一久久| 亚洲精品在线视频免费观看 | 在线中文视频 | 神马午夜在线 | 日韩欧美在线观看视频 | 亚洲精品欧美日韩 | 欧美精品五区 | 在线免费观看日本 | 欧美午夜免费 | 黄色国产在线观看 | 国产精品国产三级国产专区53 | 99久久激情 | 中日韩中文字幕 | 伊人天天操 | 天天躁日日躁狠狠躁免费麻豆 | 97人人爽人人爽人人爽 | 亚洲成人久 | а√在线中文网新版地址在线 | 91免费观看视频 | 天天网综合 | 99av视频| 欧美另类xxxx野战 | 三上悠亚中文字幕在线播放 | 高清视频免费在线观看 | 欧美精品hd | 不卡视频免费在线观看 | 日本黄色大片视频 | 毛片123 | 成人黄色免费观看 | 日韩理论片 | 亚洲国产精品国自产拍久久 | 久久99亚洲精品 | 日韩欧美一二三区 | 91色在线视频 | 免费看的av | 69色堂| 国产aa毛片 | 久久久综合精品 | 欧美精品第一页 | 免费亚洲一区 | 久久99久久精品 | 欧美日韩a级| 国产精品久久久久久久久久久新郎 | 国产第二页 | 最好看在线观看视频 | 强行侵犯视频在线观看 | 欧美日韩亚洲成人 | 亚洲a黄| 中文字幕自拍 | 91av亚洲| 亚洲午夜影视 | 亚洲黄色在线播放 | 俄罗斯女人裸体性做爰 | 四虎久久久| 少妇又色又紧又黄又刺激免费 | 亚洲视频网 | 日本欧美日韩 | 在线观看你懂得 | 色午夜视频 | 在线观看wwww| 天堂v在线观看 | 精品美女久久 | 视频区小说区图片区 | 久久伊人热| 日爽夜爽 | 亚洲激情成人网 | 韩国一区在线 | 成年人免费视频观看 | 亚洲综合久久网 | 成人在线视频一区二区 | 中国久久久久 | 黑人巨大精品欧美久久 | 97碰 | 久久国产柳州莫菁门 | 三级黄色免费 | 懂色av,蜜臀av粉嫩av | 亚洲天堂成人在线 | 香蕉短视频免费版 | av桃色 | 久久久久久国产精品视频 | 91av一区二区三区 | 97精品在线视频 | 天天干夜夜爱 | 黄色精品网站在线观看 | 色av网| 欧美另类天堂 | 久久九九国产精品 | 日韩黄色小视频 | av高清在线观看 | 久久综合狠狠综合久久综合88 | 久久精品国产三级 | 日韩在线色 | 毛片网站入口 | 狠狠五月天 | 成人看片黄a免费看视频 | 97超碰网| 女人夜夜春 | 国产成人在线免费观看 | 午夜在线观看一区 | 日韩一级av毛片 | 久久99久久99精品免观看软件 | 亚洲福利网站 | 天堂网av手机版 | 啪啪小视频 | 黄页网站在线播放 | 国产特级黄色录像 | 国产精品久久影院 | 91网站免费在线观看 | 中文字幕乱码日产无人区 | 91精彩视频 | 亚洲精品午夜久久久久久久久久久 | 亚洲 国产 另类 精品 专区 | 这里只有精品999 | 亚洲黄色网页 | 欧美日韩爱爱 | 国产在线一区二区 | 欧美成人日韩 | 日本一二三区不卡 | 一区二区三区四区欧美 | 2024日韩中文字幕 | 亚洲综合视频在线 | 日本在线视频一区二区 | 伦理片一区二区 | 黄色av网址在线观看 | 三上悠亚一区二区 | 青青草原免费观看 | 特一级黄色大片 | 久久岛国 | 色婷婷久久综合 | 亚洲永久精品一区二区三区 | 青娱乐极品视频在线 | 成人在线欧美 | x88av在线| 香蕉国产片一级一级一级一级 | 欧美午夜精品一区二区三区 | 中国国产黄色片 | 亚洲欧美综合乱码精品成人网 | japanesexxx日本乱 | 美女三级视频 | 2019国产精品| 精品久久久久久亚洲综合网站 | www色av| 国产第9页| 久久国产在线观看 | 免费特黄视频 | 中文字幕久久精品 | 成年男女免费视频 | 久久久青青 | 久久久久97国产 | 国产又大又粗又爽 | 操操操插插插 | 爱爱91| 香蕉视频91 | 夜夜草| www.国产精品 | 一本在线 | 国产精品一区免费 | 欧美乱轮视频 | 亚洲aav | 国产素人在线 | 精品动漫一区二区三区的观看方式 | 国产91欧美 | 五月激情丁香婷婷 | 黄色小说视频网站 | 国产在线aaa | 一级欧美一级日韩片 | 国产精品久久网站 | 欧美激情在线 | 黄色理伦片| 国产精品黄色网 | 亚洲精久| 日韩永久 | 奇米777第四色 | 99国产在线观看 | 日本久久久久 | 一级免费毛片 | 91av网址| 欧美日日夜夜 | 欧美性猛交xxxⅹ富婆 | 五月婷婷六月丁香 | 亚洲精品久久久久久久久久久 | 欧美日韩国产成人在线 | 国产欧美中文字幕 | 99国产精品99久久久久久 | 91最新在线 | av免费亚洲 | 超碰p | 久久久久久久999 | 成人免费观看视频 | 国精产品乱码一区一区三区四区 | 国产综合一区二区 | 欧美午夜精品理论片a级按摩 | 色视频免费看 | 亚洲涩涩 | 午夜激情在线播放 | av免费在线观看网站 | 99国产精品99久久久久久 | 夫妻啪啪呻吟x一88av | 成年人性生活视频 | 久久精品波多野结衣 | 2018国产精品 | 永久免费未满男 | 国产欧美日韩另类 | 91娇羞白丝| 中文字幕日本 | 国精产品一区 | 看中国毛片 | 国产高清视频免费 | 国产午夜精品久久久久久久 | 欧美不卡在线 | 污视频在线网站 | 国产一级在线观看视频 | 亚洲激情网站 | 亚a在线 | 亚洲激情免费观看 | 国产精品456 | 亚洲中午字幕 | 亚洲天堂aa| 成人勉费视频 | 国产超薄肉色丝袜足j | 欧美午夜一区二区 | 色二区| 法国性按摩xxx | 亚洲高清视频在线观看免费 | 91免费影片 | 日韩一区二区三区视频 | 中国一及毛片 | 三级av网址 | 亚洲欧美日本在线观看 | 亚洲欧美日韩国产精品一区午夜 | 无毛av | 色爱成人综合 | www.999zyz.com| 色婷婷导航 | 日韩福利片在线观看 | 最新在线观看av | 黄色二级视频 | 久久久久久久久久久久久久久久久久久久 | 亚洲一级一区 | 国产一区一区 | 成人免费一级片 | 免费又黄又爽又猛大片午夜 | 毛片在线免费观看视频 | 日韩欧美精品中文字幕 | 中文字幕亚洲一区二区三区五十路 | 老司机福利精品 | 国产做爰免费视频观看 | 成人av免费看 | 中国一级片黄色一级片黄 | 日韩女女同性aa女同 | 成人黄色a| 色伊人久久 | 亚洲 欧美 成人 | 亚洲黄色三级视频 | 毛片网站视频 | 中国毛片视频 | 精品亚洲国产成av人片传媒 | 日韩欧美一区二区三区四区 | 国产骚b | 牛牛澡牛牛爽一区二区 | 国产精品suv一区 | 日韩最新在线 | 国产伦子伦对白视频 | 成人欧美一区二区三区 | 黄色一级免费网站 | 日韩欧美有码 | 中文字幕第10页 | 亚洲永久在线 | 亚洲a视频在线观看 | 99xav| 中国毛片在线观看 | 天堂av一区二区三区 | 精品自拍一区 | 国产精品自产拍在线观看 | 波多野结衣一区二 | 亚洲人体视频 | 国产日韩精品一区二区三区 | 在线观看免费黄色 | 99一区二区| 91麻豆精品91久久久久同性 | 欧美va天堂 | 精品毛片一区二区三区 | 成人午夜精品一区二区三区 | 国产山村乱淫老妇av | 国产猛男猛女超爽免费视频 | av日日操| 亚洲黄色片在线 | 国产新婚疯狂做爰视频 | 亚洲精品一区二区在线观看 | 欧美在线观看一区二区 | 国产美女黄色 | 完全免费在线视频 | 久久久久久一区 | 五月天综合网 | v天堂在线 | 久久丁香 | 成年人免费在线 | 日韩高清在线播放 | 综合色婷婷 | 日韩中文字幕在线看 | 久婷婷 | 日韩福利一区 | 综合精品一区 | 日日夜夜精品视频 | 久久亚洲成人 | 四虎精品久久 | 日韩在线观看你懂的 | 午夜视频在线观看视频 | 免费国产91| 国产伦精品视频一区二区三区 | 亚洲 国产 另类 精品 专区 | 五月婷婷婷| 国产人人爽| 亚洲欧美不卡 | 美梦视频大全在线观看高清 | 警察高h荡肉呻吟男男 | 字幕网在线观看 | 成人在线观看免费爱爱 | 天堂色综合 | 日韩精品www| 亚洲图片在线视频 | 国产丝袜在线视频 | 欧美日韩国产在线一区 | 91无毒不卡| 五月婷婷在线视频 | 91尤物国产福利在线观看 | 日韩亚洲欧美在线 | 一区二区三区福利视频 | 亚洲欧美精品伊人久久 | 日韩美女少妇 | 色黄视频| 黄色av免费看| 久久久久久久久久久久久av | 国产福利视频在线 | 国产视频中文字幕 | 久久久久久久久久国产 | 在线观看中文字幕2021 | 日韩一级影片 | 制服 丝袜 激情 欧洲 亚洲 | 91成人在线观看高潮 | 国产成人三级在线播放 | 国产aaa级片 | 亚洲精品激情视频 | 97精品在线观看 | 91婷婷色 | 欧美无遮挡 | 亚洲国产播放 | 日日操日日操 | a在线免费| 欧美精品亚洲精品 | 久久1234 | 99精品欧美一区二区三区综合在线 | 欧美涩涩视频 | 香蕉av在线 | 色偷偷资源 | 国产精品久久久久久久久 | 久久综合五月 | 国产欧美一区二区精品性色超碰 | 日日夜夜操av | 性视频免费| 成人导航网站 | 成人在线免费视频播放 | 在线播放少妇奶水过盛 | 欧美一二三级 | 国产色区 | 国产首页 | 久草免费在线色站 | 日韩和的一区二区 | 在线视频 日韩 | 91在线观看欧美日韩 | 日本一二三区不卡 | 三级91| 在线最新av | 久艹视频在线 | 成人免费视频大全 | 精品在线播放视频 | 老鸭窝成人| 黄色a毛片| 日日碰日日摸 | 亚洲www视频| 亚洲精品一二三区久久伦理中文 | 中日韩无砖码一线二线 | 蜜臀视频在线观看 | 国产91免费观看 | 美女高潮黄又色高清视频免费 | 97这里只有精品 | 特级西西444www高清大胆免费看 | 色天天av| 一区二区视频在线观看 | 69产性猛交xxxx乱大交 | 91香蕉在线视频 | 天天干干干 | 欧美一区二区三区激情 | 色偷偷888欧美精品久久久 | 在线观看中文字幕av | 国产一区在线播放 | 成人免费福利视频 | 国产视频91在线 | 青青伊人国产 | 国产精品久久久久久一区二区 | 日韩精品视频网站 | 啪啪免费视频网站 | 久久精品免费看 | 中文文字幕一区二区三三 | 97自拍视频在线 | 免费观看91视频 | 成人性生活免费视频 | 91porn破解版| 夜夜爽天天爽 | 色噜噜av | 亚洲一区中文字幕在线 | 日韩亚洲欧美在线观看 | 亚洲午夜在线视频 | 久久久www成人免费毛片 | 天堂在线免费视频 | 狠狠干狠狠干狠狠 | 成人h视频在线观看 | 色大师在线观看 | 日本性视频网站 | 国产精品111 | 琪琪在线视频 | 91精品国产91久久久久久三级 | 天天摸天天操天天干 | 不卡久久 | 日韩欧美在线一区 | 欧美乱论 | 国产精品视频一二三区 | 久久亚洲天堂 | 日韩精品手机在线 | 国产伦精品一区二区免费 | 黄色在线播放网站 | 国产专区在线播放 | 精品播放 | 亚洲视频在线观看一区二区 | 国产裸体永久免费视频网站 | 国产精品久久久久久久久借妻 | 欧美日韩999 | 99精品在线播放 | 黄瓜视频在线观看污 | 久久久久综合网 | 亚洲视频八区 | 国产成人精品免费视频 | 99爱视频 | 日本一区二区欧美 | av第一页 | 性色av蜜臀 | 国产福利小视频在线 | 亚洲 日本 欧美 中文幕 | 日韩在观看线 | 色人人| 高清黄色一级片 | 在线观看www | 夜夜摸视频网 | 成年人免费看的视频 | 自拍偷拍精品 | 国产日韩视频一区 | 午夜免费影院 | 成人在线激情视频 | 欧美激情一区二区视频 | 亚洲丁香婷婷久久一区二区 | 97色在线| 自拍三区 | 一本色道久久综合亚洲二区三区 | 91在线精品播放 | 日毛片| 亚洲深夜视频 | 黄色免费av | 欧美激情一区二区三区p站 自拍av在线 | 纯爱无遮挡h肉动漫在线播放 | 尤物视频在线观看免费 | 亚洲天堂少妇 | 精品国产一区二区三区av 性色 | 精品亚洲成人 | 久久久精品国产sm调教网站 | 亚洲激情六月 | 精品日韩欧美 | 亚洲黄a | 在线视频亚洲欧美 | 午夜影院污 | 国内外成人免费视频 | 天天干天天爱天天操 | 午夜在线播放 | 欧美视频在线观看免费 | 在线看日韩 | 国产午夜精品久久久久久久 | 午夜视频色 | 99精品一区 | 久久一区二区三 | 色屁屁影院www国产高清麻豆 | 欧美激情精品久久久久 | 国产56页 | 精品少妇一区二区三区视频免付费 | 亚洲国产aⅴ | 天天操天天操天天操天天操 | 欧美日韩免费观看一区=区三区 | 噜噜噜天天躁狠狠躁夜夜精品 | 国产精品主播视频 | 青青草超碰 | 亚洲自拍诱惑 | 欧美毛片在线 | 成人爱爱视频 | 欧美一级高潮片 | 亚洲三级理论 | 精品国产乱码久久久久久蜜柚 | 成人激情视频网 | 新狠狠干 | 亚洲视频免费在线 | 在线视频精品免费 | 在线看一区 | 天天躁日日躁aaaaxxxx | 韩国黄色精品 | 成年人视频在线 | 久久夜靖品2区 | 天堂8中文在线 | 成人综合影院 | 999久久久精品 | 国产成人aⅴ| 黄色片a级| 中文字幕日韩视频 | 久久久片 | 欧美日韩在线视频观看 | 91精彩刺激对白 | 亚洲美女屁股眼交8 | 国产日韩精品在线 | 国产 欧美 精品 | 丰满岳妇乱一区二区三区 | avtt在线观看 | 91av在线免费视频 | 岛国黄色片 | 九九精品久久 | 国产男人搡女人免费视频 | 黄色网页免费观看 | 亚洲乱码国产乱码精品精不卡 | 99re这里只有精品6 | 国产一区二区在线免费观看 | 国产网站免费观看 | 毛片视频在线免费观看 | 亚洲国产一级 | 成人午夜视频免费看 | 成人免费视频播放 | 激情小说欧美色图 | av加勒比 | 日韩性色 | 久久久久久久久久av | 一本色道久久88综合日韩精品 | 日本熟伦人妇xxxx | 欧美射图| 午夜专区 | 一区二区免费高清视频 | 欧美在线播放一区二区 | 国产精品久久久久久一区二区 | 黄色在线免费播放 | 午夜视频久久 | 国产精品300页 | 中文字幕一区二区在线播放 | 中文字幕第一页在线 | 香蕉免费毛片视频 | 黄色一级免费看 | 国产在线视频你懂的 | 精品香蕉99久久久久网站 | 久草视频在线看 | 欧美福利社| 亚洲天堂女人 | 中文字幕在线观看视频网站 | 日韩无遮挡| www.天堂av| 激情网站在线观看 | 色婷婷精品国产一区二区三区 | 中文字幕不卡视频 | 天天爽夜夜爽夜夜爽精品视频 | 我要操婊 | 操操操操操操操操操操 | 高清不卡一区 | 欧美久久一区二区 | 91超碰免费 | 中文有码av| 欧美日韩国产综合在线 | 91亚洲精品一区二区乱码 | 中文字幕亚洲第一 | 天堂av中文在线 | 国内精品国产成人国产三级 | 日韩欧美综合一区 | 天堂伊人 | 国产寡妇xxxxxxxx性开放 | 久久精品国产麻豆 | 91网视频 | 亚洲精品乱码久久久久久蜜桃91 | 中文字幕视频网站 | 欧美h在线观看 | 日韩一级在线视频 | 欧美一级一级 | 99久久精品久久久久久动态片 | 天天摸天天操天天干 | 欧美国产片 | 亚洲精品日韩精品 | 中文字幕永久在线视频 | 男女午夜啪啪 | www.亚洲在线| 免费啪视频在线观看 | 日本激情一区 | 欧美黄色免费网站 | 人人射人人干 | 亚洲第一视频 | 日日插日日操 | 永久久久久久 | 国产xxx在线观看 | 天天天干干干 | 66m—66摸成人免费视频 | 国产精品a成v人在线播放 | 樱花视频在线免费观看 | 香蕉视频一区二区三区 | 天天狠天天插天天透 | 国产精品女同久久久久 | 国产福利精品在线观看 | 成人免费毛片aaaaaa片 | 能看av的网址 | 成人免费网址 | 午夜影院在线 | 成年人免费在线视频 | 午夜激情福利视频 | 成年女人毛片 | 99精品欧美| 国产综合视频在线观看 | 在线亚洲自拍 | 在线观看欧美精品 | 午夜视频在线播放 | 欧美嫩交 | 狠狠躁日日躁夜夜躁2022麻豆 | 亚洲欧美综合 | 中国一级特黄视频 | 国产精品s色 | 亚洲欧美日本在线 | 日批视频在线 | 另类视频在线观看+1080p | 放荡闺蜜高h苏桃情事h | 午夜极品 | 亚洲婷婷免费 | 奇米影视在线观看 | 国产精品夜色7777狼人 | 青青草国产在线视频 | 97精品一区二区 | 性生活视频软件 | 日韩在线视频二区 | 欧亚av| 中文字幕黄色 | 亚洲精品视频免费看 | a级成人毛片| 国产中出视频 | 亚洲第一在线 | www.夜夜 | 美女啪啪动态图 | 肉色欧美久久久久久久免费看 | 亚洲黄色激情 | 午夜激情男女 | 尤物视频在线免费观看 | 涩涩片影院 | 天天天干干干 | 宅男噜噜噜66 | 第一毛片| 国产视频三级 | 1024手机在线观看 | 欧美36p| 久久看片网 | 黑丝av在线 | 日韩中文字幕一区二区三区 | 日韩av免费在线播放 | 亚洲一级在线 | 亚洲国产视 | www.射 | 欧美高清视频一区二区 | 色老久久 | 污污网站免费在线观看 | 中文在线а√在线8 | 久久伊人超碰 | 国产精品久久精品 | 91av视频在线免费观看 | 青娱乐国产盛宴 | 午夜看片网站 | 99久精品| 中文字幕高清一区 | 国产精品成人免费看片 | av色先锋| avtt久久| 影音先锋国产精品 | 720url在线观看免费版 | 欧美黄色一区 | 超碰成人福利 | 精品国产一区二区三区久久久久久 | 午夜寂寞影院在线观看 | 国产又大又粗又硬 | 国产精品第6页 | 成人激情综合 | 国产精品久久久久影院老司 | 欧美69精品久久久久久不卡 | 国产精品一区二区在线播放 | 日本va欧美va欧美va精品 | 亚洲精品中文字幕视频 | 亚洲第一成人久久网站 | 午夜激情福利 | 凹凸日日摸日日碰夜夜 | 日本高清视频在线播放 | 黄图视频在线观看 | 麻豆传媒一区 | 精品aaa| 国产免费叼嘿网站免费 | 日韩一区二区不卡 | 91成人国产综合久久精品 | 奇米色777| 三级黄色片免费 | 在线看中文字幕 | 成人国产片 | 亚洲成人av一区二区 | 91未成人在线观看喷潮 | 色呦呦视频在线观看 | 激情的网站| 总受合集lunjian双性h | www.色呦呦 | 91精品一区二区在线观看 | 色中色av | 久久久久女人精品毛片九一 | 超碰97人人爱 | 91免费看大片 | 91成人黄色| 激情五月婷婷色 | 在线观看国产区 | 欧美日韩免费一区二区三区 | 成人黄色三级视频 | 国产91看片| 欧美在线不卡视频 | 黄色不卡av| 日韩第六页 | 欧美国产日韩在线观看 | 亚洲国产欧美在线 | 国产九色 | 日韩中文字幕在线看 | 最新在线视频 | 亚洲精品一线二线三线 | 草一色| 青娱乐国产精品 | 一级二级三级视频 | 精品日韩视频 | 久久性生活视频 | 日本高清免费aaaaa大片视频 | 国产香蕉久久精品综合网 | 怡红院av在线 | 青青青免费视频观看在线 | 国产原创视频 | 午夜精品网 | 在线精品视频观看 | 假日游船法国满天星 | 亚洲精品一二三 | 毛片视频播放 | 中文字幕性 | 天天视频国产 | 国产一区欧美二区 | 伊人久久精品视频 | 色老头一区二区三区在线观看 | 国产精品99久久99久久久二 | av看片资源| 中文字幕在线观看网址 | 亚洲精品综合在线 | 亚洲狠狠| 潘金莲一级淫片a.aaaaa播放 | 久久久久久久久久久久福利 | 国产精品夫妻 | 久久久黄色 | 中文字幕亚洲一区二区三区五十路 | 亚洲精品一区二区三区区别 | 黄网站在线观看视频 | 手机av网| 久久久久久久福利 | 亚洲最大免费视频 | 亚洲视频网址 | 国产18在线观看 | 中文字幕2区 | 蜜臀av中文字幕 | 免费一级a毛片夜夜看 | 视频二区中文字幕 | 日本特黄视频 | 成人日韩在线 | 日韩欧美视频在线免费观看 | 麻豆中文字幕 | 免费全黄一级裸体片 | 中日韩精品视频在线观看 | 精品视频久久久久 | 国产成人在线免费观看视频 | 先锋资源久久 | 亚洲福利在线观看 | 久久99久久99精品蜜柚传媒 | 蜜桃av一区二区 | 你懂的网址在线观看 | 欧美一级黄色片在线观看 | 国产精品成人国产乱一区 | 欧美黑人性xxx猛交 欧美色欧美色 | 成人免费看片 | 香蕉福利影院 | 日韩视频一二三区 | 日日操夜夜操视频 | 成人激情文学 | 欧美亚洲91 | 午夜啪视频 | 欧美一区二区在线视频 | 国模av| 91在线亚洲 | 欧美成人黑人xx视频免费观看 | 久久久片 | 亚洲综合av网 | 人超碰 | 依人在线 | 久草国产精品视频 | 九热精品 | 婷婷激情网站 | 91人人视频 | 自拍视频第一页 | 亚洲精品毛片一级91精品 | 欧美激情一区二区三区四区 | 成人免费视频网站 | 成人国产视频在线观看 | 美日韩视频| 日本va视频| 粉嫩av一区二区三区免费观看 | 男人的天堂毛片 | 黄色特级大片 | 国内精品久久久久久久影视简单 | 国产久草视频 | 农村末发育av片一区二区 | 正在播放av| 91在线看片 | 欧美夜夜夜 | 欧美xxxbbb| 国产高清二区 | 国产成人毛毛毛片 | 亚洲成人精品一区 | 中文字幕网站免费观看 | 日日夜夜狠狠干 | 亚洲综合激情五月久久 | 欧美精产国品一二三 | 国产21区 | 在线色图 | 中文在线а天堂中文在线新版 | 黄色aaa网站 | 国产精品免费一区二区三区都可以 | 亚洲第十页 | 午夜影院一级片 | 看看屋午夜伦理 | 国产网站视频 | 成人午夜免费福利 | 欧美另类xxxx野战 | 波多野结衣一区二区三区高清 | 免费麻豆国产一区二区三区四区 | 国产二区av| 人人爽人人澡 | 国产精品99久久久久久久 | 亚洲欧洲久久 | 制服av在线 | 中文字幕久久综合 | 黄污视频网站 | 大桥未久av在线 | 亚洲免费久久 | 91亚洲天堂 | 国产精品毛片一区二区三区 | 欧美一区亚洲一区 | 97人人超| 第一章激情艳妇 | 中文字幕一区二区三区四区 | 中文字幕第页 | 中国产一级片 | 国产老妇视频 | 国产乱色精品成人免费视频 | 亚洲熟区| 国产精品一二三 | 麻豆传媒一区 | 日本国产一区 | 香蕉视频一区二区 | 伊人久久五月天 | 日本欧美色 | 国产免费资源 | 红桃成人网 | 国内精品久久久久久影视8 好吊日好吊操 | 视频一区中文字幕 | 中年夫妇大白天啪啪高潮不断 | se日韩| 色成人免费网站 | 99产精品成人啪免费网站 | 国产精品第三页 | 国产女优在线播放 | 国产免费a | 小早川怜子久久精品中文字幕 | 天天射一射 | 国产久操视频 | 香蕉视频在线观看www | 亚色av| 国产欧美自拍 |