ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Go Web 应用生产环境灾备指南:rsync 文件同步与 MySQL/Redis 备份恢复实践

Go Web 应用生产环境灾备指南:rsync 文件同步与 MySQL/Redis 备份恢复实践 文档教程【免费下载链接】build-web-application-with-golangA golang ebook intro how to build a web with golang项目地址https://gitcode.com/gh_mirrors/bu/build-web-application-with-golang点击查看免费下载本篇指南围绕开源电子书《Build Web Application with Golang》build-web-application-with-golang第 12.4 节「备份与恢复」展开系统讲解生产服务器上应用文件、MySQL 数据库与 Redis 数据库的冷备/热备方案。读完本文你将掌握 rsync 的安装配置与跨机同步、基于 mysqldump 的定时冷备脚本、以及 MySQL 与 Redis 的备份/恢复命令形成一套可直接落地的异地灾备思路。本节属于全书的部署与维护章节第 12 章上承 应用部署Supervisord 管理下接 章节小结与本仓库 中文版对应章节、英文版 12.4 内容一致。灾备的基本思路先分清备什么与怎么备生产服务器常见的异常包括网络中断、硬盘损坏、操作系统崩溃、数据库不可用等。维护人员需要针对服务器上的应用与数据分别做好准备核心是异地灾备与冷备热备两个维度热备Hot Standby通过 master/slave 复制等方式让备份端时刻保持与主端接近一致的数据故障时可快速切换中断时间短冷备Cold Standby定期将数据完整导出/拷贝一份存在一定时间延迟但能保证该时间点之前的数据完整——当发生误操作导致数据丢失时master/slave 模式无法找回丢失的数据而冷备可以部分恢复。应用本身几乎不用备份用户上传文件必须备份在大多数集群环境下Web 应用程序基本不需要备份——它本质上是代码副本本地开发环境或版本控制系统Git 等中已经保存了这些代码。需要特别关注的是用户上传的文件图片、附件等。当前推荐的合理做法是把网站相关的、需要持久存储的文件放到云存储上。这样即使系统崩溃只要文件还在云存储上数据就不会丢失。若未采用云存储则要借助文件同步工具把网站文件同步到异地下面介绍的rsync正是完成这一任务的经典工具。用 rsync 实现跨系统文件同步备份rsync 能够完成网站备份并支持不同系统之间的文件同步如果服务器是 Windows则需要使用 Windows 版本cwrsync。rsync 的安装rsync 官方提供最新版本源码rsync.samba.org同时由于它非常实用多数 Linux 发行版都已收录。安装方式有三类# 1) 在线安装Debian、Ubuntu 等 sudo apt-get install rsync # 2) 在线安装Fedora、Redhat、CentOS 等 yum install rsync # 3) RPM 包安装Fedora、Redhat、CentOS 等 rpm -ivh rsync其他 Linux 发行版请使用对应的软件包管理方式安装。若选择源码编译安装则需要先安装 gcc 等编译工具tar xvf rsync-xxx.tar.gz cd rsync-xxx ./configure --prefix/usr make make installrsync 的三个核心配置文件rsync 主要有以下三个配置文件配置文件作用rsyncd.conf主配置文件定义 rsync 服务端的行为与共享模块rsyncd.secrets密码文件保存用户名:密码认证信息rsyncd.motdrsync 服务器信息欢迎语等服务端开启 rsync daemon# 以服务器模式运行 rsync--daemon 让 rsync 以服务模式运行 /usr/bin/rsync --daemon --config/etc/rsyncd.conf # 加入开机自启 echo rsync --daemon /etc/rc.d/rc.local # 设置 rsync 密码写入密码文件并收紧权限为仅属主可读写 echo 你的用户名:你的密码 /etc/rsyncd.secrets chmod 600 /etc/rsyncd.secrets客户端同步命令与参数详解客户端通过如下命令同步服务器上的文件rsync -avzP --delete --password-filersyncd.secrets 用户名192.168.145.5::www /var/rsync/backup这条命令的要点如下-avzP-aarchive 归档模式保留权限、时间戳等属性、-vverbose 显示详细信息、-z传输时压缩、-P显示进度并支持断点续传具体细节可用rsync --help查看--delete若源端 A 删除了某个文件同步时目标端 B 会自动删除对应文件保证两端严格一致--password-filersyncd.secrets客户端本地的密码文件其中的密码必须与服务端/etc/rsyncd.secrets中的密码一致这样配合 cron 定时运行时就不需要交互输入密码命令中的用户名是服务端/etc/rsyncd.secrets中定义的用户名命令中的192.168.145.5是服务端rsync 服务器的 IP 地址::www注意是两个冒号www对应服务端配置文件/etc/rsyncd.conf中的[www]模块段含义是依据服务端 rsyncd.conf 中的 [www] 段配置来同步对应目录如果只写一个冒号rsync://或主机:目录形式则不读取配置文件直接同步指定目录。为了让同步具有实时性可以设置 crontab 让 rsync每分钟同步一次也可以根据文件的重要程度设置不同的同步频率例如* * * * * rsync -avzP --delete --password-file/etc/rsyncd.secrets 用户名192.168.145.5::www /var/rsync/backupMySQL 备份冷备脚本实战应用数据库目前仍以 MySQL 为主流。MySQL 备份分两种方式热备份主要采用master/slave方式该方式目前主要用于数据库读写分离同样可用于热备份数据配置资料可参考官方文档冷备份数据存在一定延迟但可以保证该时间点之前的数据完整。例如误操作导致数据丢失时master/slave 模式无法找回而冷备可以部分恢复。冷备一般使用 shell 脚本定时备份数据库再通过前面介绍的 rsync 同步到非本地机房异地的服务器。下面是用mysqldump把数据库导出到文件的定时备份脚本#!/bin/bash # 以下配置信息请自己修改 mysql_userUSER # MySQL 备份用户 mysql_passwordPASSWORD # MySQL 备份用户的密码 mysql_hostlocalhost mysql_port3306 mysql_charsetutf8 # MySQL 编码 backup_db_arr(db1 db2) # 要备份的数据库名称多个用空格分开如 (db1 db2 db3) backup_location/var/www/mysql # 备份数据存放位置末尾请不要带 /此项可以保持默认程序会自动创建文件夹 expire_backup_deleteON # 是否开启过期备份删除ON 为开启OFF 为关闭 expire_days3 # 过期时间天数默认为三天此项只有在 expire_backup_delete 开启时有效 # 本行开始以下不需要修改 backup_timedate %Y%m%d%H%M # 定义备份详细时间 backup_Ymddate %Y-%m-%d # 定义备份目录中的年月日时间 backup_3agodate -d 3 days ago %Y-%m-%d # 3 天之前的日期 backup_dir$backup_location/$backup_Ymd # 备份文件夹全路径 welcome_msgWelcome to use MySQL backup tools! # 欢迎语 # 判断 MYSQL 是否启动mysql 没有启动则备份退出 mysql_psps -ef |grep mysql |wc -l mysql_listennetstat -an |grep LISTEN |grep $mysql_port|wc -l if [ [$mysql_ps 0] -o [$mysql_listen 0] ]; then echo ERROR:MySQL is not running! backup stop! exit else echo $welcome_msg fi # 连接到 mysql 数据库无法连接则备份退出 mysql -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password end use mysql; select host,user from user where userroot and hostlocalhost; exit end flagecho $? if [ $flag ! 0 ]; then echo ERROR:Cant connect mysql server! backup stop! exit else echo MySQL connect ok! Please wait...... # 判断有没有定义备份的数据库如果定义则开始备份否则退出备份 if [ $backup_db_arr ! ];then #dbnames$(cut -d , -f1-5 $backup_database) #echo arr is (${backup_db_arr[]}) for dbname in ${backup_db_arr[]} do echo database $dbname backup start... mkdir -p $backup_dir mysqldump -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password $dbname --default-character-set$mysql_charset | gzip $backup_dir/$dbname-$backup_time.sql.gz flagecho $? if [ $flag 0 ];then echo database $dbname success backup to $backup_dir/$dbname-$backup_time.sql.gz else echo database $dbname backup fail! fi done else echo ERROR:No database to backup! backup stop exit fi # 如果开启了删除过期备份则进行删除操作 if [ $expire_backup_delete ON -a $backup_location ! ];then #find $backup_location/ -type d -o -type f -ctime $expire_days -exec rm -rf {} \; find $backup_location/ -type d -mtime $expire_days | xargs rm -rf echo Expired backup data delete complete! fi echo All database backup success! Thank you! exit fi脚本关键环节逐段解读配置段需按环境修改备份用户/密码/主机/端口、字符集、待备份数据库数组支持(db1 db2 db3)多库、备份存储目录、过期备份删除开关ON/OFF与保留天数默认 3 天。运行状态检查先用ps -ef | grep mysql统计 mysql 进程数、netstat -an | grep LISTEN | grep $mysql_port统计监听端口数两者之一为 0 即判定 MySQL 未启动并退出备份防止在数据库不可用时产生空备份。连通性校验通过mysql -h... -P... -u... -p...执行一段 here-docuse mysql; select host,user from user ...; exit用$?判断连接是否成功失败则终止备份。逐库导出压缩mysqldump携带主机、端口、用户、密码与--default-character-set$mysql_charset字符集参数对应上方mysql_charsetutf8配置导出结果通过管道| gzip压缩输出为$backup_dir/$dbname-$backup_time.sql.gz文件名同时包含库名与精确到分钟的备份时间戳。过期清理当expire_backup_deleteON且备份目录非空时执行find $backup_location/ -type d -mtime $expire_days | xargs rm -rf按修改时间-mtime 3删除超过保留天数的备份目录。注意原脚本中的[ [$mysql_ps 0] -o [$mysql_listen 0] ]使用了[ ]旧式测试语法在 bash 环境中建议写成[ $mysql_ps -eq 0 ] -o [ $mysql_listen -eq 0 ]或[[ $mysql_ps -eq 0 || $mysql_listen -eq 0 ]]以确保在不同 shell 下稳定执行flag的比较同理建议使用-eq/-ne数值比较。设置脚本属性并加入 crontabchmod 600 /root/mysql_backup.sh chmod x /root/mysql_backup.sh属性设置好后把命令加入 crontab。书中示例为每天 00:00 定时自动备份同时把备份目录/var/www/mysql设置为 rsync 的同步目录实现本地定时冷备 rsync 异地同步的完整链路00 00 * * * /root/mysql_backup.sh仓库中的 MySQL 使用佐证本仓库第 5 章提供了数据库驱动层面的实际示例可帮助理解备份对象的数据结构。例如 MySQL 驱动示例 及其配套 建表 SQL演示了 Go 程序中database/sql驱动的增删改查PostgreSQL CRUD 示例 展示了sql.Open连接、INSERT ... RETURNING获取自增主键、Prepare/Exec更新、Query查询与Rows.Scan读取的完整流程。对应用而言备份的就是这些表结构与业务数据mysqldump导出的 SQL 恰好能完整还原它们。MySQL 恢复MySQL 的恢复同样分热备与冷备两条路径热备恢复主要目的是实时恢复。例如应用服务器出现硬盘故障时只需修改应用配置文件把数据库的读取和写入切到 slave即可在极短中断时间内恢复服务冷备恢复当需要通过冷备份的 SQL 还原数据时使用导入命令mysql -u username -p databse backup.sql导出mysqldump和导入mysql backup.sql数据库数据本身都相当简单但若还需要管理权限、或设置字符集如导入前确认库表字符集与--default-character-set导出时一致情况会稍微复杂一些这些都可以通过相应命令行参数完成。Redis 备份Redis 是目前使用最广泛的 NoSQL 之一它的备份同样分为热备与冷备热备份Redis 支持master/slave模式热备可据此实现对应配置参考官方文档即可非常简单冷备份Redis 会定时把内存中的缓存数据RDB 快照文件写入数据库文件。因此备份只需备份对应的数据文件——利用前面介绍的 rsync把它同步到非本地机房即可完成异地冷备。本仓库在 Redis 驱动示例 中演示了 Go 程序使用goredis客户端对 Redis 做Set写入、Rpush列表追加、Get读取、Lrange范围查询与Del删除等 CRUD 操作对应书中 5.6 节。这些运行期写入的数据最终会落盘为 RDB 文件正是冷备需要拷贝的对象——理解应用如何写数据才能明白备份哪些文件、丢失哪些数据。Redis 恢复Redis 的恢复同样分为热备恢复与冷备恢复热备恢复目的和方法与 MySQL 的恢复相同——修改应用中的数据库连接指向 slave 即可冷备恢复本质上是把保存的数据库文件拷贝回 Redis 的工作目录然后启动 Redis。Redis 启动时会自动把数据库文件加载到内存中启动速度取决于数据库文件的大小。# 将备份的 RDB 文件拷贝回 Redis 工作目录如 /var/lib/redis cp /path/to/backup/dump.rdb /var/lib/redis/dump.rdb # 启动/重启 redis进程启动时自动加载数据库文件到内存 service redis-server start小结本节围绕应用 数据的灾备闭环给出了完整参考方案Web 应用代码依托版本控制无需额外备份用户上传文件优先云存储若自建环境则用rsync实现不同系统间的文件同步与异地备份MySQL通过 master/slave 热备与mysqldump定时冷备配合 rsync 异地双轨保障恢复时热备切 slave、冷备用mysql backup.sql导入Redis热备依托 master/slave冷备直接拷贝 RDB 数据文件到工作目录后重启加载。这套本地定时冷备 rsync 异地同步的组合可以为你线上 Go 产品的灾备方案提供一个可直接落地的参考模板。继续阅读应用部署12.3 章节小结12.5 全书目录赞分享文档教程【免费下载链接】build-web-application-with-golangA golang ebook intro how to build a web with golang项目地址https://gitcode.com/gh_mirrors/bu/build-web-application-with-golang点击查看免费下载相关推荐Go Web 应用灾备实战rsync 文件同步与 MySQL、Redis 备份恢复build-web-application-with-golang 第 12.4 节精讲Go Web 应用灾备实战rsync 文件同步与 MySQL、Redis 备份恢复build web application with golang 第 1文档教程Go Web 应用部署后的数据备份与恢复rsync、MySQL 与 Redis 灾备实战Go Web 应用部署后的数据备份与恢复rsync、MySQL 与 Redis 灾备实战 在《Build Web Application with Golan文档教程go-redis灾难恢复备份策略与恢复流程go redis灾难恢复备份策略与恢复流程 引言 在现代分布式系统中Redis作为高性能的内存数据库承载着关键的业务数据。数据丢失可能带来灾难性后果因此后端数据库客户端缓存创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表