今天跟大家聊聊我前几天搞的“黑风双煞”!别害怕,不是真的杀人放火,是两个服务器之间的文件同步脚本,我给起了这么个吓人的名字,主要是为了好玩,也方便自己记住。
事情是这样的,我手头有两个Linux服务器,一个是跑主站业务的,另一个是做备份和数据分析的。平时主站服务器会产生一些日志文件,还有用户上传的一些图片、视频啥的,我需要定期把这些东西同步到备份服务器上。
一开始我是手动用`scp`命令搞,但是时间一长就觉得太麻烦了,每次都要输命令,输密码,效率太低。于是我就想着写个脚本,让它自动同步。
说干就干!
我选用了`rsync`这个工具。这玩意儿简直是文件同步的瑞士军刀,功能强大,而且速度快。我之前也用过,上手很快。
第一步,安装`rsync`。两台服务器都要装,这个没啥好说的,`yum install rsync`或者`apt-get install rsync`,看你用的啥系统。
第二步,写脚本。这是重点!我新建了一个`*`文件,放在主站服务器上,内容大致如下:
bash
#!/bin/bash
# 定义变量
SOURCE_DIR="/var/www/html/uploads" # 要同步的目录
DEST_USER="backup" # 备份服务器用户名
DEST_IP="192.168.1.100" # 备份服务器IP地址
DEST_DIR="/data/backup/uploads" # 备份服务器目标目录
LOG_FILE="/var/log/*" # 日志文件
# 记录开始时间
START_TIME=$(date +%Y-%m-%d_%H:%M:%S)
echo "[$START_TIME] Sync started..." >> $LOG_FILE
# 使用rsync同步文件
rsync -avz --delete --password-file=/etc/* $SOURCE_DIR $DEST_USER@$DEST_IP:$DEST_DIR >> $LOG_FILE 2>&1
# 记录结束时间
END_TIME=$(date +%Y-%m-%d_%H:%M:%S)
echo "[$END_TIME] Sync finished." >> $LOG_FILE
echo "[$END_TIME] ===========================================" >> $LOG_FILE
# 退出
exit 0
这里面几个关键点:
`SOURCE_DIR`:指定要同步的源目录,也就是主站服务器上放用户上传文件的目录。
`DEST_USER`、`DEST_IP`、`DEST_DIR`:分别是备份服务器的用户名、IP地址和目标目录。
`rsync -avz --delete --password-file=/etc/*`:这是`rsync`命令的核心参数。
`-a`:归档模式,保留所有文件属性,相当于`-rlptgoD`,非常实用。
`-v`:显示详细的同步过程。
`-z`:压缩传输,提高速度。
`--delete`:如果目标目录中有源目录没有的文件,就删除。这个很重要,保证两边数据一致。
`--password-file=/etc/*`:指定密码文件,避免每次都要手动输入密码。
第三步,配置`rsync`密码。为了安全起见,我不想把密码直接写在脚本里,所以使用了密码文件。
在主站服务器上创建一个`/etc/*`文件,内容很简单,只有一行,就是备份服务器用户的密码。
你的密码
然后,修改文件权限,只有root用户可以读写。
bash
chmod 600 /etc/*
chown root:root /etc/*
第四步,配置`rsync`服务端。需要在备份服务器上配置`rsync`服务端,允许主站服务器连接。
修改`/etc/*`文件,添加以下内容:
uid = root
gid = root
use chroot = no
max connections = 10
timeout = 300
pid file = /var/run/*
lock file = /var/run/*
log file = /var/log/*
[uploads]
path = /data/backup/uploads
comment = Backup directory for uploads
uid = backup
gid = backup
read only = no
list = yes
auth users = backup
secrets file = /etc/*
这里解释一下几个关键配置:
`path`:指定备份的目标目录。
`uid`、`gid`:指定运行`rsync`的用户和组。
`read only = no`:允许写入。
`auth users = backup`:指定允许连接的用户名。
`secrets file = /etc/*`:指定密码文件。
同样,也要创建`/etc/*`文件,内容和主站服务器上的一样,只有一行密码,并且修改权限。
第五步,启动`rsync`服务端。
bash
systemctl start rsyncd
systemctl enable rsyncd
第六步,测试脚本。在主站服务器上运行`./*`,看看能不能成功同步文件。如果报错,就仔细检查一下配置,看看是不是哪里写错了。
第七步,设置定时任务。为了让脚本自动运行,我添加了一个定时任务。
bash
crontab -e
在文件末尾添加一行:
0 3 /root/* # 每天凌晨3点运行脚本
这样,每天凌晨3点,脚本就会自动运行,把主站服务器上的文件同步到备份服务器上。
搞定!
整个过程不难,就是需要细心一点,一步一步来。我之所以给它起名叫“黑风双煞”,就是觉得这两个服务器一黑一白,一个主站一个备份,配合起来威力无穷,哈哈!
这个脚本还有很多可以改进的地方,比如可以增加邮件告警,如果同步失败就发邮件通知我;还可以增加一些错误处理逻辑,防止脚本意外中断。以后有时间再慢慢完善。
希望这个分享对大家有所帮助!