創業初期數據庫雲備份之laravel解決方案

最近項目用戶徒增,購買的服務器仍是和公司另一個項目共用的同一臺服務器,想着要是服務器崩了,還沒個容災方案,萬一。。。不得被用戶整死php

選用方案

  1. laravel-backup 配合laravel的任務調度,天天1點和13點進行數據庫自動備份
  2. 申請七牛雲帳號,利用laravel的文件系統&雲存儲,在備份完成以後當即將文件上傳至七牛雲
  3. 設計數據表backup,在任務完成的同時,配合任務監聽laravel-backup,向數據庫插入一條備份的數據,能夠經過在後臺記錄備份狀況及下載備份文件

實現思路

  1. 安裝laravel-backup,sf裏面有爲仁兄給他作了個簡單翻譯,可是光看這個仍是不夠的;
  2. 申請七牛雲帳號,這個須要幾個步驟便可完成申請,具體去看下官網介紹,我暫時申請的是免費版的,申請帳號、提交認證資料、設置項目信息便可,技術文檔基本不用看,後面會利用到一個laravel的七牛雲包,至關簡單;
  3. 安裝七牛雲包,將申請好的七牛雲帳號信息,寫到配置文件app/config/filesystems.php中;
  4. 完成安裝laravel-backup以後,能夠在本地cli環境調試下html

    php artisan backup:run --only-db

    文件會默認保存在/storage/app/http---localhost
    一切順利的話,咱們須要作個定時任務,讓它天天自動的去備份數據庫,在app\console\kernel.php的文件中,加入以下的備份策略:(laravel任務調度linux

    protected function schedule(Schedule $schedule){
            $schedule->command('backup:run --only-db')->twiceDaily(1, 13);
        }

    這裏的代碼是針對linux系統的,須要在服務器安裝crontab,並設置好以後會被自動調用;laravel

    至此已經完成了數據庫備份,下面是個人一個誤區,可是這個坑我以爲很是值得去踩。按照我開始的設計思路,在備份完成打包以後,先將文件存儲在本地,這時候調用一個監聽事件,將文件上傳至七牛雲,而後再在數據庫新增一條數據。
    毫無疑問這個思路徹底是能夠走通的,經過閱讀laravel-backup官方文檔,我找到了備份完成以後的幾個事件(在/vendor/spatie/laravel-backup/src/Events能夠找到),這裏只須要監聽壓縮成zip文件以後的一個時間便可,並將其註冊在個人監聽器裏面。
    app/provider/EventSeviceProvider中註冊sql

    protected $listen = [
            //...
            'Spatie\Backup\Events\BackupZipWasCreated' => [
                'App\Listeners\BackupListener'
            ]
        ];

    發佈以後,咱們會產生一個監聽器BackupListener,數據庫

    public function handle(BackupZipWasCreated $event)
        {
            // 文件已經存儲在本地,獲取該文件信息
            $info = $event->zip;
           
            // 將文件上傳至七牛雲
            
            // 存入數據庫
           
        }

    上面的部分代碼沒寫,你們能夠去本身去試下,加深對七牛雲及laravel-backup的理解,徹底能夠達到目的。segmentfault

但這不是最優方案,讓咱們看下laravel的優雅之處在哪裏。

我在修改配置文件app/config/laravel-backup.php的時候,忽然意識到它的disk貌似就是filesystems.php中disks默認的一種,即存儲在本地,那麼咱們可否在這裏直接使用剛剛加入qiniu的disk做爲driver呢?答案是能夠的,這裏是利用了laravel的文件系統&雲存儲服務器

我這裏修改了兩點,一個是將app

'name' => env('APP_ENV').'/databaseBackup'

這個是爲了測試環境和線上環境作個區分,可不設置。
重要的的一點,在配置文件laravel-backup.php中將laravel默認的文件系統driver由local修改爲qiniu,這樣就能夠將dump下來的文件直接向七牛雲發送,而不是直接保存在本地。ide

'destination' => [
        'disks' => [
            // 'local',
            'qiniu',
        ],
    ],

那麼咱們在監聽器BackupListener裏面的處理也能夠更簡單了.

public function handle(BackupZipWasCreated $event)
    {
        $info = $event->zip;
        $fileName = env('APP_ENV').'-databaseBackup/'.substr($info->getPath(),-21,21);
        $size = $info->getSize();

        $data = array(
            'type' => 1,
            'path' => $fileName,
            'size' => $size
        );

        // 存入數據庫
        $db_result = DB::table('backup')->insert($data);

    }

附上備份表backup的sql:

CREATE TABLE `backup` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `type` tinyint(4) DEFAULT '1' COMMENT '文件類型',
  `path` varchar(256) DEFAULT '' COMMENT '位置',
  `size` float DEFAULT '0' COMMENT '大小',
  `isCloud` tinyint(4) DEFAULT '0' COMMENT '是否雲備份',
  `downloads` int(11) DEFAULT '0' COMMENT '下載次數',
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '加入時間',
  `updated_at` timestamp NULL DEFAULT NULL COMMENT '更新時間',
  `deleted_at` timestamp NULL DEFAULT NULL COMMENT '刪除時間',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8
相關文章
相關標籤/搜索