需求
前端服务器(10.80.18.66)
数据库服务器(10.80.18.63)
缓存服务器(10.80.18.102)
建议通过脚本将服务器日志(/var/log/下所有日志文件)备份到后端服务器(10.80.18.100)或管理员个人终端电脑上,并提供备份脚本的配置截图和已备份到后端服务器或管理员个人终端电脑上的其他三台服务器的日志文件截图。
配置免密登陆
比如想在10.80.18.66免密登陆10.80.18.100
-
在10.80.18.66生成密钥
-
ssh-keygen -t rsa
-
这将生成一个私钥(
~/.ssh/id_rsa
)和一个公钥(~/.ssh/id_rsa.pub
)。
-
-
复制公钥到目标服务器
-
接下来,你需要将公钥复制到目标服务器(10.80.18.100)上
-
cat ~/.ssh/id_rsa.pub
复制显示的内容,然后通过SSH登录到目标服务器(10.80.18.100),并粘贴公钥到
/root/.ssh/authorized_keys
文件中。多个公钥通过换行符分隔;
-
-
设置ssh权限10.80.18.66
-
确保
~/.ssh
目录及其子文件权限正确: -
chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys
-
-
测试连接
-
在10.80.18.66服务器上测试免密登陆
-
ssh root@10.80.18.100
如果一切设置正确,你应该能够直接登录到目标服务器,而无需输入密码。
-
脚本
在每台要备份的服务器上写脚本,下面以10.80.18.66为例
配置文件
放在/backup/backup-config.txt
# 目标服务器ip;目标服务器端口;本地要备份的目录;本机存放备份数据的目录;目标服务器存放备份数据的目录
10.80.18.100;51326;/var/log;/mnt/www/log-backup/server-log;/mnt/www/log-backup/10.80.18.66/server-log
10.80.18.100;51326;/mnt/www/project/nginx/log;/mnt/www/log-backup/nginx-log;/mnt/www/log-backup/10.80.18.66/nginx-log
备份脚本
log-backup.sh
#!/bin/bash
# 日志保留天数
retention_days=7
# 获取当前日期
current_date=$(date +%Y-%m-%d)
# 配置文件位置
config_file_location=/backup/backup-config.txt
# 遍历每一行配置
for config in $(sed '/^#.*\|^$/d' ${config_file_location} | cat); do
echo 读取到配置:$config
IFS=';' read -r ip port local_dir local_backup_dir remote_backup_dir <<< "$config"
local_backup_dir_date="${local_backup_dir}/backup_${current_date}"
temp_local_backup_dir_date="${local_backup_dir_date}/temp"
echo "本地保路径:$local_backup_dir_date"
echo "本地临时保路径:$local_backup_dir_date"
# 确保本地备份目录存在
mkdir -p "${local_backup_dir_date}"
mkdir -p "${temp_local_backup_dir_date}"
echo "复制日志到临时文件夹"
cp -r $local_dir ${temp_local_backup_dir_date}
# 压缩后备份到本地
echo "压缩备份文件"
tar -czvf ${local_backup_dir_date}/${current_date}.tar.gz -C ${temp_local_backup_dir_date} .
echo "删除临时文件"
rm -rf ${temp_local_backup_dir_date}
# 在目标服务器上创建按日期生成的子目录
echo "创建远程服务器备份目录"
ssh -p $port root@$ip "mkdir -p ${remote_backup_dir}"
# 将本地备份目录中的文件复制到目标服务器的备份目录
echo "同步到远程服务器"
rsync -avz --progress -e "ssh -p $port" "${local_backup_dir}/" root@$ip:${remote_backup_dir}/
# 删除指定天数前的备份文件
echo "删除超过${retention_days}天的本地备份目录"
find "${local_backup_dir}" -type d -name "backup_*" -mtime +${retention_days}
find "${local_backup_dir}" -type d -name "backup_*" -mtime +${retention_days} -exec rm -r {} +
#删除远程备份
echo "删除超过${retention_days}天的远程备份目录"
ssh -p $port root@$ip "find "${remote_backup_dir}" -type d -name 'backup_*' -mtime +${retention_days}"
ssh -p $port root@$ip "find "${remote_backup_dir}" -type d -name 'backup_*' -mtime +${retention_days} -exec rm -r {} +"
done
修改访问权限
chmod 777 log-backup.sh
定时任务
crontab -e
配置定时任务
0 0 * * * /backup/log-backup.sh >> /backup/cron.log 2>&1
查看定时任务执行情况:tail -fn 1000 /var/log/cron
同步文件命令 rsync使用
rsync -avz --delete "${SOURCE_DIR}/" "${BACKUP_DIR}"
rsync
命令用于同步文件,以下是命令中各个选项的含义:
rsync
: 这是命令的名称,用来执行文件同步操作。-a
: 这个选项代表"归档模式"。它告诉rsync
同步时保持文件的属性不变,包括所有权、修改时间、访问时间和权限等。同时,它也会递归地同步目录。-v
: 这个选项代表"详细模式"。它会使rsync
输出更多的信息,包括正在同步的文件名等。-z
: 这个选项代表"压缩"。它会在传输过程中压缩数据,这可以减少网络传输的数据量,加快同步速度。--delete
: 这个选项用于在同步过程中删除目标目录中比源目录中缺少的文件。这意味着如果源目录中的某个文件被删除,那么在目标目录中对应的文件也会被删除。
现在让我们具体看看命令中的路径:
"${SOURCE_DIR}/"
: 这是源目录的路径。"${BACKUP_DIR}"
: 这是目标目录的路径。
删除指定日期前的文件方式
find /mnt/www/log-backup/ -type d -name "backup_*" -mtime +7 -exec rm -r {} +
解析:
find /mnt/www/log-backup/
:- 搜索
/mnt/www/log-backup/
目录及其子目录。
- 搜索
-type d
:- d 只查找目录。
- f 只查找文件
-name "backup_*"
:- 查找所有以 “backup_” 开头的文件或目录。
-mtime -1
:- -1 查找在过去24小时内修改过的目录。
- -2 两天内 即过去0-48小时的
- 2 查找2天前修改的文件或目录,即过去24-48小时的
- +2 两天之前 即过去48-无穷小时的
-exec rm -r {} +
:- 对于每个找到的目录,执行
rm -r
命令来递归删除它。{}
是一个占位符,代表find
命令找到的每个目录。 +
结束-exec
选项。也可以使用\
作为结束标记。
- 对于每个找到的目录,执行
可能遇见的问题
使用ssh连接时出现ssh: connect to host 10.80.18.100 port 22: Connection refused lost connection
**解决方式:**检查目标服务器的ssh配置
SSH服务器的配置文件通常位于/etc/ssh/sshd_config
检查重要的SSH配置项: 下面是一些关键的配置项,你应该检查它们是否设置正确:
Port
:SSH服务监听的端口号,默认是22。ListenAddress
:SSH服务监听的IP地址。PermitRootLogin
:是否允许root用户登录。PasswordAuthentication
:是否允许密码认证。RSAAuthentication
、PubkeyAuthentication
:是否允许使用RSA密钥认证。AllowUsers
、AllowGroups
、DenyUsers
、DenyGroups
:允许或拒绝特定用户或用户组登录。
检查配置文件语法: 在修改了SSH配置文件后,可以使用sshd -t
命令来检查配置文件的语法是否正确:
sudo sshd -t
重启SSH服务: 如果修改了配置文件,需要重启SSH服务以使更改生效:
sudo systemctl restart sshd
查看SSH服务状态: 使用以下命令查看SSH服务的状态:
sudo systemctl status sshd
如果配置文件中指定了端口,并且不是22,比如Port 51326
那么在使用ssh免密登陆时需要指定端口号,例:
ssh -p 51326 root@10.80.18.100
在使用rsync命令时,也要指定端口号,例:
rsync -avz -e "ssh -p 2222" /local/source/ user@remotehost:/remote/destination/