一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數(shù)據(jù)庫技術(shù)|

服務(wù)器之家 - 數(shù)據(jù)庫 - Redis - Redis 持久化是如何做的?一文聊聊 RDB和AOF對比分析

Redis 持久化是如何做的?一文聊聊 RDB和AOF對比分析

2021-06-01 00:57民工哥技術(shù)之路 Redis

這篇文章我們先介紹Redis的高可用保障的基礎(chǔ):數(shù)據(jù)持久化。因為Redis的主從復(fù)制和自動故障恢復(fù),都需要依賴Redis持久化相關(guān)的東西。

Redis 持久化是如何做的?一文聊聊 RDB和AOF對比分析

這篇文章我們來介紹Redis高可用相關(guān)的機制。Redis要想實現(xiàn)高可用,主要有以下方面來保證:

  •  數(shù)據(jù)持久化
  •  主從復(fù)制
  •  自動故障恢復(fù)
  •  集群化

這篇文章我們先介紹Redis的高可用保障的基礎(chǔ):數(shù)據(jù)持久化。因為Redis的主從復(fù)制和自動故障恢復(fù),都需要依賴Redis持久化相關(guān)的東西。同時,Redis的數(shù)據(jù)持久化也可以用來做數(shù)據(jù)備份,用來保障數(shù)據(jù)的安全性。

Redis是一個內(nèi)存數(shù)據(jù)庫,它的數(shù)據(jù)都保存在內(nèi)存中,如果實例宕機,那么數(shù)據(jù)則全部丟失。如何保證數(shù)據(jù)的完整性和安全性也是提高服務(wù)高可用的重要機制之一。

Redis提供了完善的持久化機制,可以把內(nèi)存中的數(shù)據(jù)持久化到磁盤上,方便我們進行備份數(shù)據(jù)和快速恢復(fù)數(shù)據(jù)。

這篇文章我們就來分析Redis的數(shù)據(jù)持久化是如何實現(xiàn)的?我們經(jīng)常聽的RDB和AOF有什么區(qū)別?以及它們不同的使用場景。

持久化方式

 

Redis提供的數(shù)據(jù)持久化方式主要有2種:

  •  RDB:產(chǎn)生一個數(shù)據(jù)快照文件
  •  AOF:實時追加命令的日志文件

它們分別對應(yīng)了不同的使用場景,下面我們就來依次分析。

RDB

 

介紹

RDB全稱 Redis Database Backup file(Redis數(shù)據(jù)備份文件),也被叫做 Redis 數(shù)據(jù)快照。

我們可以通過執(zhí)行save或bgsave命令讓 Redis 在本地生成RDB快照文件,這個RDB文件包含了整個實例接近完整的數(shù)據(jù)內(nèi)容。

Redis 持久化是如何做的?一文聊聊 RDB和AOF對比分析

它的優(yōu)點如下:

  •  RDB文件數(shù)據(jù)是被壓縮寫入的,因此RDB文件的體積要比整個實例內(nèi)存要小
  •  當(dāng)實例宕機恢復(fù)時,加載RDB文件的速度很快,能夠在很短時間內(nèi)迅速恢復(fù)文件中的數(shù)據(jù)

它的缺點也很明顯:

  •  由于是某一時刻的數(shù)據(jù)快照,因此它的數(shù)據(jù)并不全
  •  生成 RDB 文件的代價是比較大的,它會消耗大量的 CPU 和內(nèi)存資源

因此RDB比較適用于以下場景:

  •  主從全量同步數(shù)據(jù)
  •  數(shù)據(jù)庫備份
  •  對于丟失數(shù)據(jù)不敏感的業(yè)務(wù)場景,實例宕機后快速恢復(fù)數(shù)據(jù)

Redis主從全量同步數(shù)據(jù)就是使用RDB文件進行的,我們會在后面的文章詳細講到。

由此可以看出,RDB非常適合做數(shù)據(jù)備份,我們可以定時讓Redis生成RDB文件,然后備份這個快照文件即可。

定時生成RDB

 

Redis也提供了定時觸發(fā)生成RDB文件的配置項:

  1. # 最近15分鐘內(nèi) 至少產(chǎn)生1次寫入  
  2. save 900 1  
  3. # 最近5分鐘內(nèi) 至少產(chǎn)生10次寫入  
  4. save 300 10  
  5. # 最近1分鐘內(nèi) 至少產(chǎn)生10000次寫入  
  6. save 60 10000 

如果達到以上任意條件,則Redis會自動生成新的RDB文件,降低RDB數(shù)據(jù)內(nèi)容與實例數(shù)據(jù)的差異。

Copy On Write

 

在Redis上執(zhí)行save和bgsave命令都可以生成RDB文件,但前者是在前臺執(zhí)行的,也就是說在生成RDB文件時,會阻塞整個實例,在RDB未生成之前,任何請求都是無法處理的,對于內(nèi)存很大的實例,生成RDB文件非常耗時,顯然這是我們不能接受的。

所以通常我們會選擇執(zhí)行bgsave讓Redis在后臺生成RDB文件,這樣Redis依舊可以處理客戶端請求,不會阻塞整個實例。

但不是說后臺生成RDB就是沒有代價的,Redis為了實現(xiàn)后臺把內(nèi)存數(shù)據(jù)的快照寫入文件,采用了操作系統(tǒng)提供的Copy On Write技術(shù),也就是我們熟知的fork系統(tǒng)調(diào)用。

fork 系統(tǒng)調(diào)用會產(chǎn)生一個子進程,它與父進程共享相同的內(nèi)存地址空間,這樣子進程在這一時刻就能擁有與父進程的相同的內(nèi)存數(shù)據(jù)。

雖然子進程與父進程共享同一塊內(nèi)存地址空間,但在fork子進程時,操作系統(tǒng)需要拷貝父進程的內(nèi)存頁表給子進程,如果整個Redis實例內(nèi)存占用很大,那么它的內(nèi)存頁表也會很大,在拷貝時就會比較耗時,同時這個過程會消耗大量的CPU資源。在完成拷貝之前父進程也處于阻塞狀態(tài),無法處理客戶端請求。

fork執(zhí)行完之后,子進程就可以掃描自身所有的內(nèi)存數(shù)據(jù),然后把全部數(shù)據(jù)寫入到RDB文件中。

之后父進程依舊處理客戶端的請求,當(dāng)在處理寫命令時,父進程會重新分配新的內(nèi)存地址空間,從操作系統(tǒng)申請新的內(nèi)存使用,不再與子進程共享,這個過程就是Copy On Write(寫實復(fù)制)名字的由來。這樣父子進程的內(nèi)存就會逐漸分離,父進程申請新的內(nèi)存空間并更改內(nèi)存數(shù)據(jù),子進程的內(nèi)存數(shù)據(jù)不受影響。

由此可以看出,在生成RDB文件時,不僅消耗CPU資源,還有需要占用最多一倍的內(nèi)存空間。

我們在 Redis 執(zhí)行info命令,可以看到fork子進程的耗時,可以通過這個耗時來評估fork時間是否符合預(yù)期。同時我們應(yīng)該保證Redis機器擁有足夠的CPU和內(nèi)存資源,并合理設(shè)置生成RDB的時機。

AOF

 

介紹

AOF全稱為Append Only File(追加日志文件)。它與RDB不同的是,AOF中記錄的是每一個命令的詳細信息,包括完整的命令類型、參數(shù)等。只要產(chǎn)生寫命令,就會實時寫入到AOF文件中。

Redis 持久化是如何做的?一文聊聊 RDB和AOF對比分析

我們可以通過配置文件開啟AOF:

  1. # 開啟AOF  
  2. appendonly yes  
  3. # AOF文件名  
  4. appendfilename "appendonly.aof"  
  5. # 文件刷盤方式  
  6. appendfsync everysec 

刷盤方式

 

開啟AOF后,Redis會把每個寫操作的命令記錄到文件并持久化到磁盤中,為了保證數(shù)據(jù)文件的安全性,Redis還提供了文件刷盤的時機:

  •  appendfsync always:每次寫入都刷盤,對性能影響最大,占用磁盤IO比較高,數(shù)據(jù)安全性最高
  •  appendfsync everysec:1秒刷一次盤,對性能影響相對較小,節(jié)點宕機時最多丟失1秒的數(shù)據(jù)
  •  appendfsync no:按照操作系統(tǒng)的機制刷盤,對性能影響最小,數(shù)據(jù)安全性低,節(jié)點宕機丟失數(shù)據(jù)取決于操作系統(tǒng)刷盤機制

以上可以看出AOF相對于RDB的優(yōu)點是,AOF數(shù)據(jù)文件更新比較及時,比RDB保存更完整的數(shù)據(jù),這樣在數(shù)據(jù)恢復(fù)時能夠恢復(fù)盡量完整的數(shù)據(jù),降低丟失數(shù)據(jù)的風(fēng)險。

如果同時存在RDB文件和AOF文件,Redis會優(yōu)先使用AOF文件進行數(shù)據(jù)恢復(fù)。

但它的缺點也很易見:

  •  隨著時間增長,AOF文件會越來越大
  •  AOF文件刷盤會增加磁盤IO的負擔(dān),可能影響Redis的性能(開啟每秒刷盤時)

AOF重寫

 

針對第一種情況,Redis提供了AOF瘦身的功能,可以設(shè)置在AOF文件很大時,自動觸發(fā)AOF重寫,Redis會掃描整個實例的數(shù)據(jù),重新生成一個AOF文件達成瘦身的效果。但這個重寫過程也需要消耗大量的CPU資源。

  1. # AOF文件距離上次文件增長超過多少百分比則觸發(fā)重寫  
  2. auto-aof-rewrite-percentage 100  
  3. # AOF文件體積最小多大以上才觸發(fā)重寫  
  4. auto-aof-rewrite-min-size 64mb 

由于AOF可以最大可能降低丟失數(shù)據(jù)的風(fēng)險,所以它一般適用于對丟失數(shù)據(jù)很敏感的業(yè)務(wù)場景,例如涉及金錢交易的業(yè)務(wù)。

性能影響

 

如果AOF的刷盤時機設(shè)置為每次寫入都刷盤,那么會大大降低Redis的寫入性能,因為每次寫命令都需要寫入文件并刷到磁盤中才會返回,當(dāng)寫入量很大時,會增加磁盤IO的負擔(dān)。性能與數(shù)據(jù)安全不能兼得,雖然Redis提供了實時刷盤的機制,但是在真正場景中使用的不多。

通常我們會選擇每秒刷盤這種方式,既能保證良好的寫入性能,在實例宕機時最多丟失1秒的數(shù)據(jù),做到性能和安全的平衡。

總結(jié)

 

我們對RDB和AOF的總結(jié)如下表。圖片我們需要針對不同的業(yè)務(wù)場景選擇合適的持久化方式,也可以根據(jù)RDB和AOF的優(yōu)點配合使用,保證Redis數(shù)據(jù)的安全性,又可以兼顧它的性能。

原文鏈接:https://mp.weixin.qq.com/s/M11icEUWbUEZcOo7Ug3c_A

延伸 · 閱讀

精彩推薦
  • RedisRedis 事務(wù)知識點相關(guān)總結(jié)

    Redis 事務(wù)知識點相關(guān)總結(jié)

    這篇文章主要介紹了Redis 事務(wù)相關(guān)總結(jié),幫助大家更好的理解和學(xué)習(xí)使用Redis,感興趣的朋友可以了解下...

    AsiaYe8232021-07-28
  • Redisredis實現(xiàn)排行榜功能

    redis實現(xiàn)排行榜功能

    排行榜在很多地方都能使用到,redis的zset可以很方便地用來實現(xiàn)排行榜功能,本文就來簡單的介紹一下如何使用,具有一定的參考價值,感興趣的小伙伴們...

    乘月歸5022021-08-05
  • Redisredis 交集、并集、差集的具體使用

    redis 交集、并集、差集的具體使用

    這篇文章主要介紹了redis 交集、并集、差集的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友...

    xiaojin21cen10152021-07-27
  • RedisRedis的配置、啟動、操作和關(guān)閉方法

    Redis的配置、啟動、操作和關(guān)閉方法

    今天小編就為大家分享一篇Redis的配置、啟動、操作和關(guān)閉方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧 ...

    大道化簡5312019-11-14
  • RedisRedis全量復(fù)制與部分復(fù)制示例詳解

    Redis全量復(fù)制與部分復(fù)制示例詳解

    這篇文章主要給大家介紹了關(guān)于Redis全量復(fù)制與部分復(fù)制的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用Redis爬蟲具有一定的參考學(xué)習(xí)...

    豆子先生5052019-11-27
  • Redis詳解Redis復(fù)制原理

    詳解Redis復(fù)制原理

    與大多數(shù)db一樣,Redis也提供了復(fù)制機制,以滿足故障恢復(fù)和負載均衡等需求。復(fù)制也是Redis高可用的基礎(chǔ),哨兵和集群都是建立在復(fù)制基礎(chǔ)上實現(xiàn)高可用的...

    李留廣10222021-08-09
  • Redisredis中如何使用lua腳本讓你的靈活性提高5個逼格詳解

    redis中如何使用lua腳本讓你的靈活性提高5個逼格詳解

    這篇文章主要給大家介紹了關(guān)于redis中如何使用lua腳本讓你的靈活性提高5個逼格的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具...

    一線碼農(nóng)5812019-11-18
  • RedisRedis如何實現(xiàn)數(shù)據(jù)庫讀寫分離詳解

    Redis如何實現(xiàn)數(shù)據(jù)庫讀寫分離詳解

    Redis的主從架構(gòu),能幫助我們實現(xiàn)讀多,寫少的情況,下面這篇文章主要給大家介紹了關(guān)于Redis如何實現(xiàn)數(shù)據(jù)庫讀寫分離的相關(guān)資料,文中通過示例代碼介紹...

    羅兵漂流記6092019-11-11
主站蜘蛛池模板: 美女脱得一二净无内裤全身的照片 | 秋霞啪啪网 | 成人免费在线视频 | 桃色导航 | 紧身裙女教师miad711在线 | 毛片 ftp | 俄罗斯freeⅹ性欧美 | 成人看的羞羞视频免费观看 | 亚洲国产在线 | www.久久精品视频 | 国产91亚洲精品 | 国产自拍影院 | 国产九九| 免费视频片在线观看大片 | 校花被吃奶还摸下面 | 91频视 | 国内精品久久久久影院中国 | 色播影院性播影院私人影院 | 国产一区二区免费不卡在线播放 | 色综合久久最新中文字幕 | 青草精品 | 激情影院网站 | 国产3级在线 | 国产欧美视频一区二区三区 | 欧美精品v日韩精品v国产精品 | 小草观看免费高清视频 | 99久久精品国内 | 91男人 | 日本人欧美xx | 久久re热在线视频精99 | 亚洲视频男人的天堂 | mm131亚洲| 国产精品第2页 | 国产精品一级片 | 午夜片神马影院福利 | 魔镜号中文字幕 | 思敏1一5集国语版免费观看 | 国产高清专区 | 女八把屁股扒开让男生添 | 天天乐影院 | 精品国产福利在线 |