ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Databasement源码架构解析:Laravel + Livewire + 队列如何构建异步备份流水线

Databasement源码架构解析:Laravel + Livewire + 队列如何构建异步备份流水线 Databasement源码架构解析Laravel Livewire 队列如何构建异步备份流水线【免费下载链接】databasementSelf-hosted database backup manager with a web UI. Schedule, backup, and restore MySQL, PostgreSQL, MariaDB, Microsoft SQL Server, MongoDB, SQLite Redis to S3, SFTP, Samba or local storage. SSH Tunnel support.项目地址: https://gitcode.com/gh_mirrors/da/databasementDatabasement 是一款自托管的数据库备份管理器Self-hosted database backup manager提供 Web 管理界面支持对 MySQL、PostgreSQL、MariaDB、MSSQL、MongoDB、SQLite、Redis 等数据库进行定时备份、压缩、校验与恢复并可传输到 S3、SFTP、Samba 或本地存储。它的后端基于 Laravel Livewire通过队列实现异步备份流水线是研究“Web UI 队列任务 多目标存储”架构的绝佳开源样本。一、技术栈总览层次技术选型在架构中的角色框架Laravel 13PHP 8.5路由、模型、队列、调度、通知等基础设施前端交互Livewire 4纯服务端渲染的响应式管理界面无需单独写前端 API认证与权限Fortify Bouncer登录/双因素/邀请组织级 RBAC 权限任务执行Laravel Queuebackups队列把耗时的 dump/压缩/上传挪出 HTTP 请求生命周期调度Artisan Schedule动态注册 cron从数据库读取备份计划按需触发存储抽象FlysystemS3/Azure/SFTP/FTP/SMB/本地统一的多卷上传接口进程管理FrankenPHP SupervisorWeb 服务、队列 worker、调度器三进程常驻依赖声明见 composer.jsonlivewire/livewire ^4.0、laravel/fortify、silber/bouncer、以及league/flysystem-*一系列存储适配器。二、目录分层一个清晰的应用骨架app/目录按职责切分新人可以从这里快速建立心智模型app/Livewire/ —— 管理界面组件服务器、卷、快照、仪表盘等纯服务端渲染app/Http/Controllers/Api/V1/ —— REST API 控制器供脚本与 MCP 调用app/Jobs/ —— 队列任务如ProcessBackupJob、ProcessRestoreJobapp/Console/Commands/ —— Artisan 命令如RunScheduledBackupsapp/Services/Backup/ ——核心备份引擎按Databases/7 种数据库适配器、Filesystems/6 种存储适配器、Compressors/压缩器分厂app/Models/ —— 领域模型DatabaseServer、Backup、Snapshot、SnapshotFile、Volume等app/Enums/ —— 状态与类型枚举如BackupJobStatus、SnapshotFileStatusapp/Notifications/ —— 备份成功/失败通知支持 Slack、Telegram、Discord 等渠道三、备份流水线从一次点击到文件落地整条流水线可以概括为一句话UI 只负责“下单”快照Snapshot是工单队列 worker 是执行车间存储卷是收货仓库。1. 触发入口手动与定时殊途同归用户点击“备份”或到达 cron 时点最终都汇合到同一套动作手动触发走 TriggerBackupAction调用工厂创建快照再逐个分发定时触发走 RunScheduledBackups按计划 ID 找到所有Backup配置创建快照后分发两者共享同一个核心BackupJobFactory 为每个“数据库 × 目标卷”组合创建一条Snapshot记录和若干SnapshotFile记录。这一步只做数据库写入不做任何耗时操作因此 HTTP 请求瞬间返回。2. 分发决策队列还是远程 AgentDispatchBackupAction 是流水线的分叉口服务器没有绑定 Agent →ProcessBackupJob::dispatch($snapshot-id)推入backups队列服务器绑定了Agent目标机器无法直连→ 写入AgentJob表由部署在目标机器上的 agent 轮询领取执行这个设计让 Databasement 既能备份同网段数据库也能经 SSH/反向通道管理内网机器。3. 队列任务ProcessBackupJob 的健壮性细节ProcessBackupJob 是备份主任务几个值得借鉴的点专用队列 独立参数$this-onQueue(backups)重试次数、超时、退避均从应用配置读取AppConfig不写死防重入中间件使用WithoutOverlapping保证同一快照不会被并发 dump 两次断点续传式重试重试时先过滤掉已Completed的SnapshotFile已上传成功的副本不会重复上传失败闭环failed()回调在重试耗尽后触发失败通知NotificationService存储配额超限还会单独告警4. 备份引擎dump → 压缩 → 上传 → 校验任务只负责“编排”真正干活的是 BackupTask它是一个不感知模型持久化的纯引擎四步流水线DumpDatabaseProvider 按类型MysqlDatabase、PostgresqlDatabase、MongodbDatabase…实例化适配器若配置了 SSH 隧道则先由 SshTunnelService 建立端口转发压缩CompressorFactory 产出 Gzip / Zstd / 加密压缩器上传同一份归档按相同文件名推送到每个目标卷经 FilesystemProvider 抽象底层是 Flysystem 的 S3/SFTP/SMB/本地等实现校验计算 SHA-256 校验和写回快照并可选执行备份后脚本PostScriptRunner任何一卷上传失败都会抛出VolumeTransferException但已成功的副本会先落库再标记失败——部分成功也是可观测的。恢复流程对称地由 ProcessRestoreJob RestoreTask 完成同样走队列异步执行。四、调度系统从数据库动态注册 cron传统做法是在代码里硬编码 cronDatabasement 在 routes/console.php 中启动时读取BackupSchedule表为每条计划动态注册一条 cron用户改计划无需改代码、无需改部署。同文件还注册了三条系统级任务任务频率默认职责snapshots:cleanup每日 4:00按 GFS 保留策略清理过期快照snapshots:verify-files每日 5:00校验远端卷上的备份文件确实存在jobs:recover-stuck每 5 分钟回收卡死/租约过期的任务配合 RecoverStuckJobsCommand 与 VerifySnapshotFilesCommand系统对“任务假死”“文件丢失”这类长尾问题都有兜底自愈机制。五、队列运行Supervisor 三进程模型生产部署由 docker/php/supervisord.conf 统一管理三个常驻进程frankenphpWeb 请求含 Livewire 组件queue-workphp artisan queue:work --queuebackups,default --tries3 --timeout3600专职消费备份队列schedule-runphp artisan schedule:work每秒检查 cron 是否命中Web 与 worker 分离是这套架构的关键页面永远不会因为一次 30 分钟的数据库 dump 而超时UI 与流水线各自伸缩。六、给自研备份工具的 5 条借鉴清单请求与执行彻底解耦HTTP 只创建“工单记录”重活全部进队列用数据表驱动调度cron 表达式存库启动时动态注册快照 文件两级记录Snapshot管元数据SnapshotFile管每卷副本状态天然支持多目标与部分成功策略模式收敛差异数据库、存储、压缩各自接口化DatabaseInterface、FilesystemInterface、CompressorInterface新增类型只需加一个实现类失败可观测、可自愈任务日志随 job 落库、通知多渠道推送、定时巡检卡死任务如果你想深入某个模块建议从 docs/docs/user-guide/backups.md 理解产品语义再对照 app/Services/Backup/ 阅读引擎实现开发环境搭建可参考 docs/docs/self-hosting/docker.md。【免费下载链接】databasementSelf-hosted database backup manager with a web UI. Schedule, backup, and restore MySQL, PostgreSQL, MariaDB, Microsoft SQL Server, MongoDB, SQLite Redis to S3, SFTP, Samba or local storage. SSH Tunnel support.项目地址: https://gitcode.com/gh_mirrors/da/databasement创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表