内射老阿姨1区2区3区4区_久久精品人人做人人爽电影蜜月_久久国产精品亚洲77777_99精品又大又爽又粗少妇毛片

Fundebug是這樣備份數(shù)據(jù)的-創(chuàng)新互聯(lián)

摘要: 數(shù)據(jù)還是要備份的,萬一刪庫了呢?

我們一直強調(diào)成都網(wǎng)站設(shè)計、做網(wǎng)站對于企業(yè)的重要性,如果您也覺得重要,那么就需要我們慎重對待,選擇一個安全靠譜的網(wǎng)站建設(shè)公司,企業(yè)網(wǎng)站我們建議是要么不做,要么就做好,讓網(wǎng)站能真正成為企業(yè)發(fā)展過程中的有力推手。專業(yè)網(wǎng)站建設(shè)公司不一定是大公司,成都創(chuàng)新互聯(lián)作為專業(yè)的網(wǎng)絡(luò)公司選擇我們就是放心。

Fundebug是這樣備份數(shù)據(jù)的

  • 本文代碼倉庫: fundebug-mongodb-backup

引言

今年8月,騰訊云竟然把客戶前沿數(shù)據(jù)的數(shù)據(jù)弄沒了,F(xiàn)undebug在第一時間進行了一些簡單的技術(shù)分析:

一方面,騰訊云對這件事負有不可推卸的責任,他們剛開始說是什么硬盤固件版本bug(該聲明已刪),后來承認是人為操作失誤導致的。
另一方面,前沿數(shù)據(jù)沒有備份業(yè)務(wù)數(shù)據(jù),也是一種非常不專業(yè)的行為,導致業(yè)務(wù)無法恢復,必須完全重新開始。

因此,所有的開發(fā)者都應(yīng)該從這個事件吸取教訓,不要偷懶,嚴格備份業(yè)務(wù)數(shù)據(jù),否則數(shù)據(jù)一旦出問題,損失將無法挽回。

Fundebug數(shù)據(jù)備份方案

我們還分享了Fundebug的數(shù)據(jù)備份方案,供大家參考:

備份方案 時間粒度 細節(jié)
MongoDB復制集實時搭建3個節(jié)點(1個Primary和2個Secondary)的MongoDB復制集,實時同步數(shù)據(jù)。
阿里云磁盤快照每天每天凌晨自動快照所有磁盤,包括系統(tǒng)盤和備份數(shù)據(jù)盤。
mongodump導出核心數(shù)據(jù)每天每天凌晨將MongoDB核心數(shù)據(jù)導出到復制集之外的服務(wù)器磁盤(該磁盤會每天進行快照)。
阿里云對象存儲每天每天凌晨將mongodump導出的數(shù)據(jù)使用gpg非對稱加密之后,上傳到阿里云深圳數(shù)據(jù)中心的對象存儲,設(shè)置跨區(qū)域復制,自動同步到杭州數(shù)據(jù)中心,每份數(shù)據(jù)保留1個月。
本地硬盤備份每周每周六中午從阿里云對象存儲下載加密的備份數(shù)據(jù),存儲到本地磁盤。

大概是因為我們沒有公布備份方案的技術(shù)細節(jié),我們受到了質(zhì)疑:

要么多重備份是假的

對于這種指責,我的原則是必須懟回去。那么,這篇博客我來詳細介紹一下我們數(shù)據(jù)備份方案吧~所有源代碼都在GitHub倉庫Fundebug/fundebug-mongodb-backup,歡迎star。

MongoDB復制集

生產(chǎn)環(huán)境使用單節(jié)點的MongoDB數(shù)據(jù)庫,除非訪問量非常低或者不在乎服務(wù)可用性,否則基本上是不可能的,這輩子都不可能。單節(jié)點MongoDB存在單點故障(single point of failure),一旦掛了,整個應(yīng)用就掛了。更糟糕的是,如果數(shù)據(jù)損壞,恢復將非常麻煩。

MongoDB有多種可能性會掛掉,最常見的就是高峰期內(nèi)存使用量飆升,導致Linux的Out of Memory (OOM) killer將mongod進程殺死,這種情況Fundebug遇見過不少次,那我們是如何安全渡過的呢?答案是復制集(replica set)

復制集由多個MongoDB節(jié)點構(gòu)成,它們的數(shù)據(jù)是實時同步的,因此數(shù)據(jù)幾乎完全相同。當某個節(jié)點掛掉時,應(yīng)用可以自動切換到其他節(jié)點,這樣保證了服務(wù)的可用性。

Fundebug的MongoDB都運行在Docker容器中,其Docker Compose配置文件如下:

version: '2.2'

services:

  mongo:
    image: mongo:3.2
    network_mode: "host"
    restart: always
    cpus: 7
    mem_limit: 30g
    command: --replSet rs0  --oplogSize 25600
    volumes:
      - /mongodb/data:/data/db
    logging:
      driver: "json-file"
      options:
        max-size: "5g"
oplog

復制集一個非常重要的參數(shù)是oplog的大小,使用--oplogSize選項可以指定。我們設(shè)定的值是25600MB,即25GB。oplog(operation log)是復制集節(jié)點同步數(shù)據(jù)的關(guān)鍵,Primary節(jié)點將數(shù)據(jù)庫寫操作記錄到oplog中,Secondary節(jié)點從Primary節(jié)點處復制oplog并應(yīng)用到本地數(shù)據(jù)庫中。因此,oplog大小決定了Primary和Secondary節(jié)點可以接受的數(shù)據(jù)大"時間差"。使用rs.printReplicationInfo()可以查看oplog信息:

rs.printReplicationInfo()
configured oplog size:   25600MB
log length start to end: 11409secs (3.17hrs)
oplog first event time:  Sat Sep 22 2018 12:02:04 GMT+0800 (CST)
oplog last event time:   Sat Sep 22 2018 15:12:13 GMT+0800 (CST)
now:                     Sat Sep 22 2018 15:12:13 GMT+0800 (CST)

可知oplog中記錄了最近3.17小時的數(shù)據(jù)庫寫操作,假設(shè)復制集中某個節(jié)點由于宕機有4個小時沒有同步數(shù)據(jù),則重啟該節(jié)點也無法與其他節(jié)點同步了!這時會出現(xiàn)"too stale to catch up -- entering maintenance mode"的錯誤,只能手動同步數(shù)據(jù)。

因此,我們建議oplog的值應(yīng)該盡量設(shè)大一些,否則以后修改oplog的步驟挺麻煩的。事實上,25GB的oplog大小對于Fundebug的MongoDB復制集來說已經(jīng)不夠了,我們需要修改。

Fundebug的MongoDB復制集由1個Primary節(jié)點和2個Secondary節(jié)點構(gòu)成,為保證我們服務(wù)可用性發(fā)揮了非常關(guān)鍵的作用!我之后所介紹的備份方案都是冗余措施,我們從來沒有真正使用過那些備份數(shù)據(jù),而復制集"拯救"了我們不少次,強烈建議大家都配置一下。

關(guān)于MongoDB復制集的更多技術(shù)細節(jié),以后我再單獨詳述,歡迎關(guān)注Fundebug微信公眾號。

阿里云磁盤快照

快照能夠保留某一時間點的磁盤數(shù)據(jù)狀態(tài),因此可以作為一種數(shù)據(jù)備份方式。很簡單,配置一下自動快照策略就好了:

Fundebug是這樣備份數(shù)據(jù)的

我備份了系統(tǒng)盤,萬一數(shù)據(jù)丟失比如被刪庫,至少還能回滾磁盤。每周快照1次,保存7天。因為服務(wù)全部運行在Docker里面,服務(wù)器本身基本上沒有什么配置,備份的需求不大,實際上我們也從來沒有回滾過磁盤。

另外,我沒有對MongoDB數(shù)據(jù)盤直接進行快照,因為發(fā)現(xiàn)快照后的數(shù)據(jù)無法恢復(這一點有待進一步確認)。

我只是將mongodump導出的核心數(shù)據(jù)所在磁盤進行了快照。每天快照1次,保存兩天。這樣做可以確保核心數(shù)據(jù)的安全性。

mongodump導出核心數(shù)據(jù)

使用mongodump命令,可以全量導出MongoDB數(shù)據(jù)。對應(yīng)的,之后可以使用mongorestore命令將備份數(shù)據(jù)導入MongoDB。

導出數(shù)據(jù)的腳本dump-data.sh如下:

#!/bin/sh

# 刪除前一天導出的數(shù)據(jù)
rm -rf /data/mongodb_backup

DIR=`date +%Y%m%d%H%M`
OUT=/data/mongodb_backup/$DIR
mkdir -p $DEST

# 全量導出MongoDB數(shù)據(jù)(排除部分集合)
mongodump --host "rs0/192.168.59.11:27017,192.168.59.12:27017,192.168.59.13:27017" \
          --db fundebug-production \
          --excludeCollection events \
          --out $OUT

使用--excludeCollection選項,可以排除部分不需要備份的集合。例如,F(xiàn)undebug累計處理了6億+的錯誤事件,存在event集合中,因為我們已經(jīng)聚合過了,所以沒有必要備份,而且數(shù)據(jù)量太大,備份也不現(xiàn)實。

使用crontab腳本定期執(zhí)行dump-data.sh腳本:

# 每天凌晨4點導出數(shù)據(jù)
0 4 * * * /root/fundebug-mongodb-backup/dump-data.sh

阿里云對象存儲

使用mongodump導出的數(shù)據(jù)保存在測試服務(wù)器的數(shù)據(jù)磁盤上,從地域?qū)用嫔蟻碚f都在同一個地方,即阿里云深圳數(shù)據(jù)中心。如果要做到異地備份,可以借助阿里云的對象存儲服務(wù)的跨區(qū)域復制功能,將備份數(shù)據(jù)自動同步到阿里云杭州數(shù)據(jù)中心。

在上傳備份數(shù)據(jù)之前,使用gpg命令進行非對稱加密,可以保證數(shù)據(jù)安全性。加密導出數(shù)據(jù)的腳本encrypt-data.sh腳本如下:

#!/bin/bash

DIR=`find /data/mongodb_backup/ -maxdepth 1 -type d ! -path /data/mongodb_backup/`
source=$DIR/fundebug-production
cd $source

# 將導出數(shù)據(jù)加密
for file in * ; do
    gpg --batch --yes -v -e -r fundebug --output $source/$file.gpg --always-trust $file
done ;

除了加密,gpg還有一定的壓縮效果,這樣可以減少備份數(shù)據(jù)量,一舉兩得。關(guān)于gpg命令的細節(jié),可以查看參考博客。

使用阿里云提供的Node.js客戶端ali-oss,可以將加密之后的.gpg文件上傳到阿里云的對象存儲服務(wù)中。使用multipartUpload方法即可,upload.js部分代碼如下:

// 上傳單個文件
async function uploadFile(fileName, filePath) {
    try {
        const result = await store.multipartUpload(fileName, filePath, {
            parallel: 4,
            partSize: 1024 * 1024,
            progress: function(p) {
                logger.info("Progress: " + p);
            }
        });
        if (result.res.statusCode === 200) {
            logger.info(`upload file success! ${fileName}`);
        } else {
            const message = `upload file fail! ${fileName}`;
            logger.error(message);
            logger.error(result);
            fundebug.notifyError(new Error(message), {
                metaData: {
                    message: message,
                    result: result
                }
            });
        }
    } catch (error) {
        const message = `upload file fail! ${fileName}`;
        logger.error(message);
        logger.error(error);
        fundebug.notifyError(error, {
            metaData: {
                message: message,
                error: error
            }
        });
    }
}

代碼運行在Docker容器中,使用curl命令訪問HTTP接口/upload即可觸發(fā)執(zhí)行上傳操作,使用crontab定期執(zhí)行:

# 每天凌晨4點備份數(shù)據(jù)
0 4 * * * /root/mongodb-backup/dump-data.sh && /root/mongodb-backup/encrypt-data.sh && docker restart mongodb-backup && sleep 1m && curl http://127.0.0.1:9160/upload

備份數(shù)據(jù)通過數(shù)據(jù)卷(volume)映射到容器中,每天需要重啟容器,才能訪問每天導出的新數(shù)據(jù)。

在阿里云上為備份數(shù)據(jù)的存儲空間配置跨區(qū)域復制,即可實現(xiàn)自動異地備份,非常方便。其他對象存儲云服務(wù)應(yīng)該也支持這種功能吧。

本地磁盤備份

前文提到的備份方式,其實都是在阿里云內(nèi)部COPY數(shù)據(jù)。那么問題來了,阿里云掛了怎么辦?這種事情當然基本上不可能發(fā)生,畢竟我們有多處備份,甚至實現(xiàn)了異地備份。

既然備份數(shù)據(jù)都上傳到阿里云對象存儲了,下載到本地也不是什么難事。使用ali-oss的list和get方法即可實現(xiàn),download.js部分代碼如下:

// 獲取當天上傳到阿里OSS的文件列表
async function listFilesToDownload(day) {
    const result = await store.list({ prefix: day });
    return result.objects;
}

// 將阿里云OSS中的文件下載到本地
async function downloadFile(fileName, path) {
    try {
        const file = fileName.split("/")[1];
        const filepath = `${path}/${file}`;
        await store.get(fileName, filepath);
    } catch (error) {
        const message = `download file fail! ${fileName}`;
        logger.error(message);
        logger.error(error);
        fundebug.notifyError(error, {
            metaData: {
                error: error,
                message: message
            }
        });
    }
}

代碼運行在Docker容器中,部署在本地機器,使用curl命令訪問HTTP接口/download即可觸發(fā)執(zhí)行下載操作,使用crontab定期執(zhí)行:

# 每周六中午從阿里云下載備份數(shù)據(jù)
0 12 * * 6 curl http://127.0.0.1:9160/download

結(jié)論

本文提到的所有的數(shù)據(jù)備份方式完全自動化執(zhí)行,沒有什么技術(shù)難度,成本也不高,可以極大提高數(shù)據(jù)安全性。

參考

  • MongoDB被Linux OOM Kill
  • [理解和配置 Linux 下的 OOM Killer](理解和配置 Linux 下的 OOM Killer)
  • MongoDB文檔 - Replication
  • 阿里云MongoDB備份恢復功能說明和原理介紹
  • MongoDB文檔 - mongodump
  • GPG Encryption Guide - Part 1
  • GPG Encryption Guide - Part 2 (Asymmetric Encryption)

關(guān)于Fundebug

Fundebug專注于JavaScript、微信小程序、微信小游戲、支付寶小程序、React Native、Node.js和Java實時BUG監(jiān)控。 自從2016年雙十一正式上線,F(xiàn)undebug累計處理了8億+錯誤事件,得到了Google、360、金山軟件等眾多知名用戶的認可。歡迎免費試用!

Fundebug是這樣備份數(shù)據(jù)的

版權(quán)聲明

轉(zhuǎn)載時請注明作者Fundebug以及本文地址:
https://blog.fundebug.com/2018/09/27/how-does-fundebug-backup-data/

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

當前題目:Fundebug是這樣備份數(shù)據(jù)的-創(chuàng)新互聯(lián)
本文地址:http://m.rwnh.cn/article28/iicjp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁設(shè)計公司、全網(wǎng)營銷推廣企業(yè)網(wǎng)站制作、云服務(wù)器面包屑導航、域名注冊

廣告

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

成都網(wǎng)站建設(shè)公司
黄山市| 镇安县| 和平县| 夹江县| 钦州市| 宿迁市| 唐河县| 雷州市| 曲松县| 淅川县| 纳雍县| 江口县| 陵水| 日土县| 金湖县| 万载县| 鲁山县| 会泽县| 襄樊市| 易门县| 大石桥市| 精河县| 台前县| 巴青县| 响水县| 新乐市| 仪陇县| 绿春县| 宁远县| 霍林郭勒市| 志丹县| 龙川县| 乾安县| 青河县| 长寿区| 深泽县| 防城港市| 嘉荫县| 双城市| 岚皋县| 石景山区|