博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
创业初期数据库云备份之laravel解决方案
阅读量:6166 次
发布时间:2019-06-21

本文共 2979 字,大约阅读时间需要 9 分钟。

最近项目用户徒增,购买的服务器还是和公司另外一个项目共用的同一台服务器,想着要是服务器崩了,还没个容灾方案,万一。。。不得被用户整死

选用方案

  1. laravel-backup 配合laravel的任务调度,每天1点和13点进行数据库自动备份
  2. 申请七牛云账号,利用laravel的文件系统&云存储,在备份完成之后立即将文件上传至七牛云
  3. 设计数据表backup,在任务完成的同时,配合任务监听laravel-backup,向数据库插入一条备份的数据,可以通过在后台记录备份情况及下载备份文件

实现思路

  1. 安装,sf里面有为仁兄给他做了个简单,但是光看这个还是不够的;
  2. 申请七牛云账号,这个需要几个步骤即可完成申请,具体去看下,我暂时申请的是免费版的,申请账号、提交认证资料、设置项目信息即可,技术文档基本不用看,后面会利用到一个laravel的七牛云包,相当简单;
  3. 安装包,将申请好的七牛云账号信息,写到配置文件app/config/filesystems.php中;
  4. 完成安装laravel-backup之后,可以在本地cli环境调试下

    php artisan backup:run --only-db

    文件会默认保存在/storage/app/http---localhost

    一切顺利的话,我们需要做个定时任务,让它每天自动的去备份数据库,在app\console\kernel.php的文件中,加入如下的备份策略:()

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

    这里的代码是针对linux系统的,需要在服务器安装crontab,并设置好之后会被自动调用;

    至此已经完成了数据库备份,下面是我的一个误区,但是这个坑我觉得非常值得去踩。按照我开始的设计思路,在备份完成打包之后,先将文件存储在本地,这时候调用一个监听事件,将文件上传至七牛云,然后再在数据库新增一条数据。

    毫无疑问这个思路完全是可以走通的,通过阅读laravel-backup官方文档,我找到了备份完成之后的几个事件(在/vendor/spatie/laravel-backup/src/Events可以找到),这里只需要监听压缩成zip文件之后的一个时间即可,并将其注册在我的监听器里面。
    app/provider/EventSeviceProvider中注册

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

    发布之后,我们会产生一个监听器BackupListener,

    public function handle(BackupZipWasCreated $event)    {        // 文件已经存储在本地,获取该文件信息        $info = $event->zip;               // 将文件上传至七牛云                // 存入数据库           }

    上面的部分代码没写,大家可以去自己去试下,加深对七牛云及laravel-backup的理解,完全可以达到目的。

但这不是最优方案,让我们看下laravel的优雅之处在哪里。

我在修改配置文件app/config/laravel-backup.php的时候,突然意识到它的disk貌似就是filesystems.php中disks默认的一种,即存储在本地,那么我们能否在这里直接使用刚刚加入qiniu的disk作为driver呢?答案是可以的,这里是利用了laravel的。

我这里修改了两点,一个是将

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

这个是为了测试环境和线上环境做个区分,可不设置。

重要的的一点,在配置文件laravel-backup.php中将laravel默认的文件系统driver由local修改成qiniu,这样就可以将dump下来的文件直接向七牛云发送,而不是直接保存在本地。

'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

转载地址:http://feuba.baihongyu.com/

你可能感兴趣的文章
Jenkins持续集成环境部署
查看>>
MWeb 1.4 新功能介绍二:静态博客功能增强
查看>>
预处理、const与sizeof相关面试题
查看>>
爬虫豆瓣top250项目-开发文档
查看>>
有趣的数学书籍
查看>>
teamviewer 卸载干净
查看>>
eclipse的maven、Scala环境搭建
查看>>
架构师之路(一)- 什么是软件架构
查看>>
USACO 土地购买
查看>>
【原创】远景能源面试--一面
查看>>
B1010.一元多项式求导(25)
查看>>
10、程序员和编译器之间的关系
查看>>
配置 RAILS FOR JRUBY1.7.4
查看>>
修改GRUB2背景图片
查看>>
Ajax异步
查看>>
好记性不如烂笔杆-android学习笔记<十六> switcher和gallery
查看>>
JAVA GC
查看>>
3springboot:springboot配置文件(外部配置加载顺序、自动配置原理,@Conditional)
查看>>
图解SSH原理及两种登录方法
查看>>
查询个人站点的文章、分类和标签查询
查看>>