Redis在Docker中的數(shù)據(jù)持久化是什么意思

本篇內(nèi)容主要講解“redis在Docker中的數(shù)據(jù)持久化是什么意思”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“Redis在Docker中的數(shù)據(jù)持久化是什么意思”吧!

創(chuàng)新互聯(lián)公司長(zhǎng)期為近千家客戶(hù)提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開(kāi)放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為遂溪企業(yè)提供專(zhuān)業(yè)的成都網(wǎng)站制作、成都網(wǎng)站建設(shè)、外貿(mào)營(yíng)銷(xiāo)網(wǎng)站建設(shè),遂溪網(wǎng)站改版等技術(shù)服務(wù)。擁有10年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開(kāi)發(fā)。

項(xiàng)目Github地址:github/booklet

Redis 提供了兩種不同的持久化方法來(lái)將數(shù)據(jù)存儲(chǔ)到硬盤(pán)里面。一種方法叫快照(snapshotting,RDB),它可以將存在于某一時(shí)刻的所有數(shù)據(jù)都寫(xiě)入硬盤(pán)里面。

另一種方法叫只追加文件(append-only file,AOF),它會(huì)在執(zhí)行寫(xiě)命令時(shí),將被執(zhí)行的寫(xiě)命令復(fù)制到硬盤(pán)里面。

這篇文章梳理了Redis兩種持久化方法的知識(shí)點(diǎn),并通過(guò)Docker + Docker-Compose進(jìn)行環(huán)境的模擬,來(lái)進(jìn)行數(shù)據(jù)的備份與恢復(fù)等操作。

至于測(cè)試數(shù)據(jù),我通過(guò)一個(gè)python腳本批量錄入三百萬(wàn)條key-value鍵值對(duì)(會(huì)消耗719.42M內(nèi)存,來(lái)源于redis-cli info信息),沒(méi)有python環(huán)境的同學(xué),可以使用我在項(xiàng)目里準(zhǔn)備的另一個(gè)shell腳本

python腳本代碼:

# -*- coding: UTF-8 -*-
# file write.py
# author liumapp 
# github https://github.com/liumapp
# email liumapp.com@gmail.com
# homepage http://www.liumapp.com 
# date 2019/9/9
#
import redis

r = redis.Redis(host="127.0.0.1", port=6379, db=0, password="admin123")
print("開(kāi)始插入三百萬(wàn)條數(shù)據(jù),每10萬(wàn)條數(shù)據(jù)提交一次批處理")
with r.pipeline(transaction=True) as p:
    value = 0
    while value < 3000000:
        print("開(kāi)始插入" + str(value) + "條數(shù)據(jù)")
        p.sadd("key" + str(value), "value" + str(value))
        value += 1
        if (value % 100000) == 0:
            p.execute()

RDB

RDB持久化是通過(guò)創(chuàng)建快照來(lái)獲得數(shù)據(jù)副本,即簡(jiǎn)單粗暴的直接保存鍵值對(duì)數(shù)據(jù)內(nèi)容

要啟用RDB(并關(guān)閉AOF),我們需要修改Redis的配置文件(./redis_config/redis.conf):

requirepass admin123

save 60 1000
stop-writes-on-bgsave-error no
rdbcompression no
dbfilename dump.rdb

appendonly no
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

dir /data/

上述配置會(huì)通過(guò)docker-compose的配置,映射到Redis容器中并啟用,具體在下面的實(shí)操中介紹

RDB配置說(shuō)明

上述配置中與RDB相關(guān)的配置如下

  • save: 多久執(zhí)行一次自動(dòng)快照操作

    比如設(shè)置為 save 60 1000 ,那么就表示在60秒之內(nèi),如果有1000次寫(xiě)入的話(huà),Redis就會(huì)自動(dòng)觸發(fā)BGSAVE命令

    一般來(lái)說(shuō),我們都會(huì)希望Redis可以有一個(gè)固定的周期來(lái)創(chuàng)建快照,那么可以這樣設(shè)置

    save 900 1 ,意思就是讓Redis服務(wù)器每隔900秒,并且至少執(zhí)行了一次寫(xiě)入操作后,就觸發(fā)BGSAVE指令

  • stop-writes-on-bgsave-error: 在創(chuàng)建快照失敗后是否仍然繼續(xù)執(zhí)行寫(xiě)命令

  • rdbcompression: 是否對(duì)快照文件進(jìn)行壓縮

    • yes: 開(kāi)啟,這種情況下,Redis會(huì)采用LZF算法對(duì)rdb文件進(jìn)行壓縮

    • no: 關(guān)閉

  • dbfilename: 快照文件名

  • dir: 快照文件存放目錄

RDB觸發(fā)條件

RDB的觸發(fā)條件會(huì)比AOF麻煩,大致可以分為以下幾種:

  • 通過(guò)redis-cli等客戶(hù)端直接發(fā)送指令: BGSAVE

    BGSAVE指令,會(huì)讓Redis調(diào)用fork創(chuàng)建一個(gè)子進(jìn)程在后臺(tái)運(yùn)行,子進(jìn)程將會(huì)負(fù)責(zé)創(chuàng)建快照到磁盤(pán)中

    在演示案例中,啟動(dòng)redis的docker容器后,在redis-cli中輸入 BGSAVE 后,能夠在./redis_data目錄下生成一個(gè)temp-17.rdb文件(或者其他以rdb結(jié)尾的)

  • 通過(guò)redis-cli等客戶(hù)端直接發(fā)送指令:SAVE

    SAVE指令**(注意跟配置中的save沒(méi)有半毛錢(qián)關(guān)系)**,會(huì)讓Redis主進(jìn)程直接開(kāi)始創(chuàng)建快照,但在創(chuàng)建快照的過(guò)程中,Redis不會(huì)響應(yīng)其他命令請(qǐng)求

    在演示案例中,啟動(dòng)redis的docker容器后,在redis-cli中輸入 SAVE 后,能夠在./redis_data目錄下生成一個(gè)temp-17.rdb文件(或者其他以rdb結(jié)尾的)

  • 通過(guò)配置項(xiàng)save進(jìn)行觸發(fā)

    具體請(qǐng)參照上文的參數(shù)說(shuō)明

  • 通過(guò)SHUTDOWN命令關(guān)閉Redis服務(wù)器時(shí),Redis會(huì)自動(dòng)觸發(fā)一個(gè)SAVE指令

  • 通過(guò)標(biāo)準(zhǔn)TERM信號(hào)kill掉Redis服務(wù)時(shí),Redis也會(huì)自動(dòng)觸發(fā)一個(gè)SAVE指令

  • 通過(guò)Redis主從服務(wù)器的復(fù)制請(qǐng)求

    主服務(wù)器收到從服務(wù)器的復(fù)制請(qǐng)求時(shí),會(huì)觸發(fā)一次BGSAVE指令(當(dāng)且僅當(dāng)主服務(wù)器沒(méi)有子進(jìn)程在執(zhí)行BGSAVE)

RDB-Docker實(shí)操

  • 通過(guò)docker-compose啟動(dòng)Redis容器

    docker-compose.yml配置如下

        version: "2"
        services:
          redis:
            image: 'redis:3.2.11'
            restart: always
            hostname: redis
            container_name: redis
            ports:
              - '6379:6379'
            command: redis-server /usr/local/etc/redis/redis.conf
            volumes:
              - ./redis_config/redis.conf:/usr/local/etc/redis/redis.conf
              - ./redis_data/:/data/

    我將Docker容器中的redis服務(wù)所產(chǎn)生的備份文件,映射在宿主機(jī)的./redis_data目錄下

  • 修改redis配置文件,使AOF生效,并關(guān)閉RDB

    這里將上面的redis.conf內(nèi)容復(fù)制替換到./redis_config/redis.conf文件中即可

  • 啟動(dòng)redis服務(wù),并觀察redis_data目錄下是否有dump.rdb文件生成,有生成,則證明備份成功

  • 數(shù)據(jù)恢復(fù)的話(huà),我們不需要做其他操作,只要確保該dump.rdb存在,redis便會(huì)自動(dòng)去讀取其中的數(shù)據(jù)

AOF

AOF持久化會(huì)將被執(zhí)行的寫(xiě)命令寫(xiě)到AOF文件的末尾,以此來(lái)記錄數(shù)據(jù)發(fā)生的變化。因此,Redis 只要從頭到尾重新執(zhí)行一次AOF 文件包含的所有寫(xiě)命令,就可以恢復(fù)AOF文件所記錄的數(shù)據(jù)集。

要啟用AOF(并關(guān)閉RDB),我們需要修改Redis的配置文件(./redis_config/redis.conf)

requirepass admin123

#save 60 1000
stop-writes-on-bgsave-error no
rdbcompression no
dbfilename dump.rdb

appendonly yes
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

dir /data/

上述配置會(huì)通過(guò)docker-compose的配置,映射到Redis容器中并啟用,具體在下面的實(shí)操中介紹

AOF配置說(shuō)明

上述配置中與AOF相關(guān)的配置如下

  • appendonly: 是否啟用AOF

    • yes: 啟用AOF

    • no: 關(guān)閉AOF

  • appendfsync: 啟用AOF后的數(shù)據(jù)同步頻率

    • alaways: 每個(gè)Redis寫(xiě)命令都要同步寫(xiě)入硬盤(pán)。這樣做會(huì)嚴(yán)重降低Redis 的速度 (不建議)

    • everysec: 每秒執(zhí)行一次同步,顯式地將多個(gè)寫(xiě)命令同步到硬盤(pán) (推薦,對(duì)性能沒(méi)有太大影響)

    • no: 讓操作系統(tǒng)來(lái)決定應(yīng)該何時(shí)進(jìn)行同步。(不建議)

      Redis將不對(duì)AOF文件執(zhí)行任何顯式的同步操作,如果用戶(hù)的硬盤(pán)處理寫(xiě)入操作的速度不夠快的話(huà),那么當(dāng)緩沖區(qū)被等待寫(xiě)入硬盤(pán)的數(shù)據(jù)填滿(mǎn)時(shí),Redis的寫(xiě)入操作將被阻塞,并導(dǎo)致Redis處理命令請(qǐng)求的速度變慢

  • no-appendfsync-on-rewrite:在對(duì)AOF進(jìn)行壓縮(也被稱(chēng)為重寫(xiě)機(jī)制)的時(shí)候能否執(zhí)行同步操作

    • yes: 不允許

    • no: 允許

  • auto-aof-rewrite-percentage:多久執(zhí)行一次AOF壓縮,單位是百分比

  • auto-aof-rewrite-min-size:需要壓縮的文件達(dá)到多少時(shí)開(kāi)始執(zhí)行

    auto-aof-rewrite-percentage跟auto-aof-rewrite-min-size需要配套使用,比如當(dāng)我們?cè)O(shè)置auto-aof-rewrite-percentage為100,設(shè)置auto-aof-rewrite-min-size為64mb時(shí)

    redis會(huì)在AOF產(chǎn)生的文件比64M大時(shí),并且AOF文件的體積比上一次重寫(xiě)之后至少增大了一倍(100%)才執(zhí)行BGREWRITEAOF重寫(xiě)命令

    如果覺(jué)得AOF重寫(xiě)執(zhí)行得過(guò)于頻繁,我們可以把a(bǔ)uto-aof-rewrite-percentage設(shè)置100以上,比如200,就可以降低重寫(xiě)頻率

    這里可以參考Redis的官方手冊(cè),寫(xiě)的非常清楚:https://redislabs.com/ebook/part-2-core-concepts/chapter-4-keeping-data-safe-and-ensuring-performance/4-1-persistence-options/4-1-3-rewritingcompacting-append-only-files/

  • dir:備份文件存放目錄

AOF觸發(fā)條件

直接根據(jù)appendfsync的設(shè)置進(jìn)行觸發(fā)

AOF重寫(xiě)機(jī)制

在上面的配置中,已經(jīng)通過(guò)auto-aof-rewrite-percentage和auto-aof-rewrite-min-size兩個(gè)參數(shù),簡(jiǎn)單介紹了Redis的BGREWRITEAOF重寫(xiě)命令

那么,為什么要用AOF重寫(xiě)機(jī)制呢?

因?yàn)锳OF持久化是通過(guò)保存被執(zhí)行的寫(xiě)命令來(lái)記錄Redis數(shù)據(jù)庫(kù)狀態(tài)的,所以AOF文件隨著時(shí)系統(tǒng)運(yùn)行會(huì)越來(lái)越大

而過(guò)于龐大的AOF文件會(huì)產(chǎn)生以下不良影響

  • 影響Redis服務(wù)性能;

  • 占用服務(wù)器磁盤(pán)空間;

  • AOF還原數(shù)據(jù)狀態(tài)的時(shí)間增加;

所以Redis提供了一套AOF重寫(xiě)機(jī)制,通過(guò)創(chuàng)建一個(gè)新的AOF文件來(lái)替換掉舊的AOF文件,這兩個(gè)文件所保存的數(shù)據(jù)狀態(tài)是相同的,但新的AOF文件不會(huì)包含冗余命令,所以體積會(huì)較舊AOF文件小很多

但在實(shí)際的使用中,我們需要非常小心,不能讓Redis的重寫(xiě)命令執(zhí)行的過(guò)于頻繁 (注意:auto-aof-rewrite-percentage的單位是百分比,值越大,重寫(xiě)頻率越低,也千萬(wàn)別出現(xiàn)0這種值)因?yàn)锽GREWRITEAOF的工作原理和BGSAVE創(chuàng)建快照的工作原理非常相似:Redis會(huì)創(chuàng)建一個(gè)子進(jìn)程,然后由子進(jìn)程負(fù)責(zé)對(duì)AOF文件進(jìn)行重寫(xiě),因?yàn)锳OF文件重寫(xiě)也需要用到子進(jìn)程,所以快照持久化因?yàn)閯?chuàng)建子進(jìn)程而導(dǎo)致的性能問(wèn)題和內(nèi)存占用問(wèn)題,在AOF持久化中也同樣存在

更具體的AOF重寫(xiě)工作原理:

  • Fork主進(jìn)程,產(chǎn)生一個(gè)帶有數(shù)據(jù)副本的子進(jìn)程在后臺(tái)執(zhí)行

    Redis這樣設(shè)計(jì)可以確保在重寫(xiě)過(guò)程中,不影響Redis主進(jìn)程的服務(wù)正常運(yùn)行,同時(shí)通過(guò)處理數(shù)據(jù)副本來(lái)保證數(shù)據(jù)的安全性**(注意,重寫(xiě)是針對(duì)數(shù)據(jù)副本來(lái)進(jìn)行處理,而不是針對(duì)舊的AOF文件)**

  • 子進(jìn)程Fork完成后,Redis將啟用AOF重寫(xiě)緩沖區(qū),此刻開(kāi)始,新的寫(xiě)入命令會(huì)被寫(xiě)入AOF緩沖區(qū)和AOF重寫(xiě)緩沖區(qū)中

    這里啟用的AOF重寫(xiě)緩沖區(qū)可以確保:在執(zhí)行AOF重寫(xiě)的過(guò)程中,任何新的寫(xiě)入命令產(chǎn)生,都不會(huì)導(dǎo)致新AOF文件的數(shù)據(jù)狀態(tài)與Redis數(shù)據(jù)庫(kù)狀態(tài)不一致

  • 子進(jìn)程完成對(duì)AOF文件的重寫(xiě)后,通知父進(jìn)程

  • 父進(jìn)程收到通知后,將AOF重寫(xiě)緩沖區(qū)的內(nèi)容全部寫(xiě)入新的AOF文件中

  • 父進(jìn)程將新的AOF文件替換掉舊的AOF文件**(注意,這一步會(huì)造成Redis阻塞,但問(wèn)題不大)**

BGREWRITEAOF的工作流程圖如下所示**(繪圖源代碼在項(xiàng)目的./articles/bgrewriteaof.puml文件下)**:

Redis在Docker中的數(shù)據(jù)持久化是什么意思

AOF-Docker實(shí)操

  • 通過(guò)docker-compose啟動(dòng)Redis容器

    docker-compose.yml配置如下

        version: "2"
        services:
          redis:
            image: 'redis:3.2.11'
            restart: always
            hostname: redis
            container_name: redis
            ports:
              - '6379:6379'
            command: redis-server /usr/local/etc/redis/redis.conf
            volumes:
              - ./redis_config/redis.conf:/usr/local/etc/redis/redis.conf
              - ./redis_data/:/data/

    我將Docker容器中的redis服務(wù)所產(chǎn)生的備份文件,映射在宿主機(jī)的./redis_data目錄下

  • 修改redis配置文件,使AOF生效,并關(guān)閉RDB

    這里將上面的redis.conf內(nèi)容復(fù)制替換到./redis_config/redis.conf文件中即可

  • 啟動(dòng)redis服務(wù),并觀察redis_data目錄下是否有appendonly.aof文件生成,有生成,則證明備份成功

    另外我們可以發(fā)現(xiàn),3百萬(wàn)條數(shù)據(jù)(700M)的備份文件,其實(shí)際占用磁盤(pán)空間約為170M,這便是Redis重寫(xiě)機(jī)制強(qiáng)大的地方

  • 數(shù)據(jù)恢復(fù)的話(huà),我們不需要做其他操作,只要確保該appendonly.aof存在,redis便會(huì)自動(dòng)去讀取其中的數(shù)據(jù)

總結(jié)

RDB跟AOF都可以確保Redis的數(shù)據(jù)持久化,但各有特點(diǎn)

RDB因?yàn)橛心J(rèn)的指令SAVE跟BGSAVE支持,所以比較適合對(duì)數(shù)據(jù)庫(kù)做全量備份,比如每天凌晨3點(diǎn)開(kāi)始執(zhí)行一次BGSAVE

而AOF因?yàn)槭潜4娴膶?xiě)命令,因而更適合實(shí)時(shí)備份,事實(shí)上現(xiàn)在企業(yè)應(yīng)用也基本都是采用的AOF

但光是使用了RDB或AOF、甚至兩個(gè)一起用,也還是不夠的

對(duì)于一個(gè)需要支持可擴(kuò)展的分布式平臺(tái)而言,我們還需要提供一套復(fù)制備份機(jī)制,允許在一個(gè)周期內(nèi),自動(dòng)將AOF或者RDB的文件備份到不同的服務(wù)器下

這種情況下,我們就需要使用Redis的復(fù)制并生成數(shù)據(jù)副本功能,具體內(nèi)容我會(huì)在下一篇文章進(jìn)行實(shí)操記錄

到此,相信大家對(duì)“Redis在Docker中的數(shù)據(jù)持久化是什么意思”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢(xún),關(guān)注我們,繼續(xù)學(xué)習(xí)!

本文題目:Redis在Docker中的數(shù)據(jù)持久化是什么意思
當(dāng)前地址:http://muchs.cn/article18/iejcdp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機(jī)網(wǎng)站建設(shè)、App開(kāi)發(fā)、移動(dòng)網(wǎng)站建設(shè)、網(wǎng)站建設(shè)、企業(yè)網(wǎng)站制作、網(wǎng)站導(dǎo)航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都app開(kāi)發(fā)公司