-
安装配置为数据同步进行准备
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
$ sudo apt-get install rsync # ubuntu 16.04/18.04默认源中都存在rssh ,但是 ubuntu 20.04开始,已经没办法从系统源中安装了。 # 原因在于 rssh 存在安全漏洞,并且长时间没有修复,并且已经没人维护了,我们使用rrsync替代 $ export RSH_RSYNC_USER=rsh_backup $ export RSH_RSYNC_USER_PASSWORD=rsh_password # 如果需要备份/var/log 目录,建议把用户组设置成 adm 用户组,否则很多日志没办法读取 # sudo useradd -s "" $RSH_RSYNC_USER -g users -G adm # 后期也可以通过 sudo usermod -g users -G adm $RSH_RSYNC_USER 更改用户组 # 不配置任何登陆默认shell,以便于 rrsync 接管 $ sudo useradd -s "" $RSH_RSYNC_USER $ echo $RSH_RSYNC_USER:$RSH_RSYNC_USER_PASSWORD | sudo chpasswd # 创建配置文件目录,增加配置信息 $ sudo mkdir /home/$RSH_RSYNC_USER $ sudo chown -R $RSH_RSYNC_USER /home/$RSH_RSYNC_USER $ sudo mkdir /home/$RSH_RSYNC_USER/.ssh $ sudo chown -R $RSH_RSYNC_USER /home/$RSH_RSYNC_USER/.ssh $ sudo touch /home/$RSH_RSYNC_USER/.ssh/authorized_keys $ sudo chown -R $RSH_RSYNC_USER /home/$RSH_RSYNC_USER/.ssh/authorized_keys # 配置许可访问的目录 $ echo 'command="/usr/bin/rrsync -ro /var/www /data/",no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-X11-forwarding' | sudo tee /home/$RSH_RSYNC_USER/.ssh/authorized_keys |
-
客户端同步,测试是否正常工作
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$ export RSH_RSYNC_USER=rsh_backup $ export RSH_RSYNC_USER_PASSWORD=rsh_password $ export RSH_RSYNC_PORT=22 $ export REMOTE_SERVER=www.mobibrw.com $ export SYNC_DIR=/var/www # 测试是否可以正常工作,另一个方面是许可ssh的登录key否则我们后续没办法使用sshpass # 可以使用 --exclude 参数忽略指定的目录,相对路径,不是绝对路径 $ sudo rsync -avzP --delete -e 'ssh -p $RSH_RSYNC_PORT' $RSH_RSYNC_USER@$REMOTE_SERVER:$SYNC_DIR $SYNC_DIR |
-
转化为定时任务,自动同步
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
# 安装密码自动填写软件 $ sudo apt-get install sshpass $ cd ~ $ touch backup_rsync.sh $ chmod +x backup_rsync.sh $ echo -e '#!'"/bin/bash\n" >> backup_rsync.sh $ sed -i '$a\export RSH_RSYNC_USER=rsh_backup' backup_rsync.sh $ sed -i '$a\export RSH_RSYNC_USER_PASSWORD=rsh_password' backup_rsync.sh $ sed -i '$a\export RSH_RSYNC_PORT=22' backup_rsync.sh $ sed -i '$a\export REMOTE_SERVER=www.mobibrw.com' backup_rsync.sh # 此处注意最后的分隔符/如果没有这个分隔符,会导致目标目录多一个名为www的父目录 $ sed -i '$a\export SYNC_DIR=/var/www/' backup_rsync.sh # 可以使用 --exclude 参数忽略指定的目录,相对路径,不是绝对路径 $ sed -i '$a\sshpass -p $RSH_RSYNC_USER_PASSWORD rsync -avzP --delete -e \"ssh -p $RSH_RSYNC_PORT\" $RSH_RSYNC_USER@$REMOTE_SERVER:$SYNC_DIR $SYNC_DIR' backup_rsync.sh # 打开计划任务的日志,默认不开 $ sudo sed -i -r "s/#cron\.\*[ \t]*\/var\/log\/cron.log/cron.* \/var\/log\/cron.log/g" /etc/rsyslog.d/50-default.conf #write out current crontab $ sudo crontab -l > addcron #echo new cron into cron file ,每隔30分钟我们调度一次任务,前面是文件锁,防止并发冲突 #如果需要每小时执行一次,则修改为 "* */1 * * * flock ...." #如果需要凌晨2点执行,则修改为 "* 2 * * * flock ...." $ echo "30 * * * * flock -x -w 10 /dev/shm/backup_rsync_corn.lock -c \"bash `echo ~`/backup_rsync.sh\"" >> addcron #install new cron file $ sudo crontab addcron $ rm addcron $ sudo service cron restart |
目前我的阿里云,腾讯云服务器之间的同步脚本如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#!/bin/bash export RSH_RSYNC_USER=user export RSH_RSYNC_USER_PASSWORD=password export RSH_RSYNC_PORT=22 export REMOTE_SERVER=121.199.27.227 export SYNC_WWW_DIR=/var/www/ sshpass -p $RSH_RSYNC_USER_PASSWORD rsync -avzP --delete -e "ssh -p $RSH_RSYNC_PORT" $RSH_RSYNC_USER@$REMOTE_SERVER:$SYNC_WWW_DIR $SYNC_WWW_DIR --exclude "wordpress/wp-content/cache/" --exclude "wordpress/wp-content/plugins/crayon-syntax-highlighter/log.txt" export SYNC_DATA_DIR=/data/ # 此处注意,如果使用 --exclude "/root/" 则忽略最顶部的root目录 # 如果使用 --exclude "root/" 则忽略所有路径中包含 root 的目录 # 主要 rsync 的 top-directroty 部分的规则 sshpass -p $RSH_RSYNC_USER_PASSWORD rsync -avzP --delete -e "ssh -p $RSH_RSYNC_PORT" $RSH_RSYNC_USER@$REMOTE_SERVER:$SYNC_DATA_DIR $RSYNC_DATA_DIR --exclude "/root/" |