一、服务端rsync
# 在Ubuntu server上,rsync和inotify默认都是安装了的。配置以xinetd方式运行。
sudo apt-get install rsync xinetd
# 创建存放文件目录,命令如下:
sudo mkdir /data/tongbu
# 修改rsync启动方式
sudo vim /etc/default/rsync
## 第14行
RSYNC_ENABLE=inetd
# rsync启动方式的配置文件
sudo vim /etc/xinetd.d/rsync (新文件)
## 添加以下内容
service rsync
{
disable = no
wait = no
socket_type = stream
user = root
server = /usr/bin/rsync
server_args = --daemon
log_on_failure += USERID
}
# 修改配置文件
# 空文件,可以通过以下代码复制模板
# sudo cp /usr/share/doc/rsync/examples/rsyncd.conf /etc
sudo vim /etc/rsyncd.conf
max connections = 65535
log file = /var/log/rsync.log
timeout = 300
read only = no
list = yes
uid = root
gid = root
auth users = rsync
secrets file = /etc/rsyncd.secrets
[gitlab]
path = /data/gitlab
# 用户组最好设置为root,不然文件权限同步过去的时候会变化。
sudo mkdir /data
sudo chown -R xxx:xxx /data
mkdir -p /data/beifen/gitlab
# 创建rsync传输过程中的认证文件
sudo vim /etc/rsyncd.secrets
rsync:123
# 修改文件权限
sudo chmod 600 /etc/rsyncd.secrets
# 重启xinetd
sudo /etc/init.d/xinetd restart
# 查看端口,查看服务是否启动成功
sudo netstat -ntpl|grep 873
# 测试
rsync rsync@xxx.xxx.x.xxx::gitlab
二、客户端:sersync
cd /home/xxx
mkdir sersync
# 下载
sudo wget http://down.whsir.com/downloads/sersync2.5.4_64bit_binary_stable_final.tar.gz
# 解包
sudo tar -zxvf sersync2.5.4_64bit_binary_stable_final.tar.gz
# 解压后两个文件直接放在/usr/local/sersync2.5/目录下即可
sudo mkdir /usr/local/sersync
sudo mv /opt/GNU-Linux-x86/confxml.xml /usr/local/sersync
sudo mv /opt/GNU-Linux-x86/sersync2 /usr/local/sersync
监控脚本
# 修改配置文件
sudo vim /usr/local/sersync/confxml.xml
修改 目录、密码文件、日志路径。其他不变
<localpath watch="/opt/gitlab_backup"> #需同步的目录
<remote ip="xxx.xxx.xxx.xxx" name="gitlab"/>
</localpath>
<rsync>
<commonParams params="-auvPz"/>
<auth start="true" users="test" passwordfile="/etc/rsync.pas"/> #密码文件,需创建
<userDefinedPort start="false" port="874"/><!-- port=874 -->
<timeout start="true" time="100"/><!-- timeout=100 -->
<ssh start="false"/>
</rsync>
<failLog path="/home/cmcc/sersync/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once-->
# 错误日志文件,指定路径
# 创建密码文件
sudo vim /etc/rsync.pas
123 #不需要写验证用户
# 赋权
sudo chmod 600 /etc/rsync.pas
# 开启
sudo /usr/local/sersync/sersync2 -r -d -o /usr/local/sersync/confxml.xml
sudo /usr/local/sersync/sersync2 -r -d -o /usr/local/sersync/mntxml.xml
#关闭
kill -9 `pidof sersync2`
定时任务
创建定时任务
crontab -e
0 0 */3 * * sudo bash 脚本名称
三、gitlab备份脚本(脚本分为两部分,一个备份,一个打包需在目录下)
#!/usr/bin/bash
#获取当前时间
locale_date=`date +%Y-%m-%d.%H.%M`
docker_id=`sudo docker ps -a | grep gitlab-ce | awk '{print $1}'`
#本地备份路径
backup_path=/opt/gitlab_backup
#日志路径
backup_log=/opt/gitlab_backup/gitlab_back.log
#判断/opt/gitlab_backup目录是否存在,否则创建
if [ ! -d ${backup_path} ]; then
sudo mkdir ${backup_path}
fi
#删除15天之前的备份数据
sudo find ${backup_path} -mtime +15 -name "*" -exec rm -rf {} \;
#CRON=1 环境变量CRON=1的作用是如果没有任何错误发生时, 抑制备份脚本的所有进度输出
#BACKUP=${locale_date}改变backup文件名称 例: 2021-06-15_11:22:52_gitlab_backup.tar
echo "###############开始备份gitlab数据###################"
sudo docker exec -i ${docker_id} /bin/bash -c 'cd opt/gitlab/bin/ && gitlab-backup create '
if [ $? -eq 0 ];then
echo "当次备份文件名称:/home/gitlab/data/backups/${filename}"
echo "${locale_date} ${backup_path}_gitlab_backup.tar 备份创建成功." >> ${backup_log}
else
echo "${locale_date} ${backup_path}_gitlab_backup.tar 备份创建失败." >> ${backup_log}
exit 1
fi
echo "#################备份完成,复制配置文件############"
sudo bash gitlab_cp_tar.sh
存放备份包文件加要和sersync监控文件夹一致,否则无法实时同步
#!/bin/bash
filename=`sudo ls /home/gitlab/data/backups/ |grep '^[0-9]*' |tail -1 `
#获取当前时间
locale_date=`date +%Y-%m-%d.%H.%M`
docker_id=`sudo docker ps -a | grep gitlab-ce | awk '{print $1}'`
#本地备份路径
backup_path=/opt/gitlab_backup
backup_tar=${locale_date}_bak
#日志路径
backup_log=/opt/gitlab_backup/gitlab_back.log
echo "#拷贝配置文件至本地备份目录/opt/gitlab_backups"
cd /home/gitlab/data
sudo cp ./backups/${filename} /opt/gitlab_backup
sudo cp /home/gitlab/config/gitlab-secrets.json ${backup_path}/${locale_date}_gitlab-secrets.json >> ${backup_log}
sudo cp /home/gitlab/config/gitlab.rb ${backup_path}/${locale_date}_gitlab.rb >> ${backup_log}
echo "#创建压缩文件包"
cd /opt/gitlab_backup/
echo "#################开始移动打包所需文件##############"
if [ ! -d ${backup_tar} ]; then
sudo mkdir ${backup_tar}
fi
sudo mv ./${filename} ./${backup_tar}
sudo mv ${backup_path}/${locale_date}_gitlab-secrets.json ./${backup_tar}
sudo mv ${backup_path}/${locale_date}_gitlab.rb ./${backup_tar}
sudo mv gitlab_back.log ./${backup_tar}
sudo ls ./${backup_tar}
echo "开始打包"
sudo tar -cvf ${locale_date}_gitlab_bak.tar ./${backup_tar}
sudo rm -rf ./${backup_tar}
sleep 3
echo "本地打包完成"
四、恢复测试
注:在rsync服务端上容器运行gitlab # gitlab版本需要一致12.13.0
#需要同步本机时间
sudo docker run -d -p 443:443 -p 8080:80 -p 10022:22 --name gitlab --restart always -v /home/gitlab/config:/etc/gitlab -v /etc/localtime:/etc/localtime:ro -v /home/gitlab/logs:/var/log/gitlab -v /home/gitlab/data:/var/opt/gitlab gitlab/gitlab-ce
将备份的文件包,解压至/home/cmcc/gitlab_bak/
cd /data/beifen/gitlab/
sudo tar -xvf xxx.xxx.xxx_gitlab_bak.tar -C /home/cmcc/gitlab_bak/ #gitlab备份包
#复制配置文件,复制地址根据解压目录而定。此处参考
cd /home/cmcc/gitlab_bak/
sudo cp -f *gitlab.rb /home/gitlab/config/gitlab.rb
sudo cp -f *gitlab-secrets.json /home/gitlab/config/gitlab-secrets.json
#导入备份代码至容器
docker cp 1638170628_2021_11_29_13.12.0_gitlab_backup.tar $(sudo docker ps -a | grep gitlab-ce | awk '{print $1}'):/var/opt/gitlab/backups/
#进入容器
sudo docker exec -it $(sudo docker ps -a | grep gitlab-ce | awk '{print $1}') bash
#停止对应服务
/opt/gitlab/bin/gitlab-ctl stop unicorn
/opt/gitlab/bin/gitlab-ctl stop puma
/opt/gitlab/bin/gitlab-ctl stop sidekiq
#恢复
/opt/gitlab/bin/gitlab-backup restore BACKUP=1638170628_2021_11_29_13.12.0
#根据提示输入yes
#重启服务
/opt/gitlab/bin/gitlab-ctl reconfigure
/opt/gitlab/bin/gitlab-ctl restart
#等待约一分钟后访问测试
本文介绍如何使用rsync实现服务器之间的文件同步,并详细记录了一套完整的GitLab备份及恢复方案,包括服务端配置、客户端监控脚本编写、自动化备份流程以及恢复测试步骤。
3163

被折叠的 条评论
为什么被折叠?



