(一)、跨服务器自动备份

将数据同步到其它服务器这里使用Linux同步文件工具rsync来进行文件的同步
1.    rsync
rsync是类unix系统下的数据镜像备份工具——remote sync。一款快速增量备份工具 Remote Sync,远程同步 支持本地复制,或者与其他SSH、rsync主机同步

2.    用法
rsync src dest

这是最简单的用法,表示同步src,dest文件。(即,执行之后,dest的文件与src的相同,以src的为准)

常用选项

-a: 等价于-rlptgoD,归档式
-r: 递归
-l: 复制软件链接
-p: 保留权限信息
-t: 将src的修改时间,同步到dest
-g: 同步组信息(group)
-o: 同步拥有者信息(own)
-D: 保持字符与块设备文件
-z: 启用压缩传输
–delete:如果src没有此文件,那么dest也不能有,即在dest删除src里没有的文件。(如果你使用这个选项,就必须搭配-r选项一起)

例如:
## 将本地/bak/mysqlbak/文件同步到 远程服务器 /bak/mysql/bak 目录下面 排除 mysqlbak/index目录 通过ssh端口
rsync -vzacu  /bak/mysqlbak/  [email protected]:/bak/mysqlbak   --exclude  "mysqlbak/index"   -e "ssh -p 22"
# 将远程目录 /bak/mysqlbak下的文件同步到本地 /bak/mysqlbak/目录下
rsync -vzrtopg --progress --delete [email protected]:/bak/mysqlbak  /bak

client连接SERVER
向SERVER端上传文件
/usr/bin/rsync -vzrtopg --progress --password-file=/root/rsync.pas  /home/backup [email protected]::backup

从SERVER端取文件
/usr/bin/rsync -vzrtopg --progress --delete [email protected]::backup /home/backup --password-file=/etc/rsync.pas
3.    rsync安装
rsync 服务器安装比较简单,但是安装好rsync后,我们并没有发现配置文件,以及rsync服务器启动程序,不要着急,那是因为每个管理员可能对rsync 用途不一样,所以发行版只是让安装好软件就可以了,配置文件都是让管理员来根据自己的用途和方向来自己设置的。

1)    检查rsycn是否安装
检查方法:
      rpm -qa rsync
出现rsync 包名就是安装了
 
如果是以下提示,表示没有安装rsync
 
2)    安装rsycn
 rsync的安装可以使用yum直接安装:yum install rsync
 
3)    检查rsycn是否安装成功
检查方法:
      rpm -qa rsync
出现rsync 包名就是安装成功了
 
4.    启用rsync服务器端同步远程文件
rsycn的服务端为服务器的文件接收端,rsycn的客户端为服务器的文件推动端。
5.    rsycn的服务端/文件接收端配置
1)    先创建备份目录

2)    服务端需要开启rsyncd服务
(1)    添加配置文件rsyncd.conf
vi /etc/rsyncd.conf
#以下是全局配置
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
lock file = /var/lock/rsyncd
[zentaobak]     #模块名,在源服务器指定这个名字
   comment = sync rsync/home      #描述信息
   path = /home/zentao_bak      #备份目录
   use chroot=yes           #使用chroot,用root权限
   read only = no          #设置本地备份目录为读写权限
   uid=root          
   gid=root
   max connections=10       #客户端最大连接数
   auth users = root      #指定数据同步用户
   secrets file = /etc/rsyncd.pass          #指定数据同步用户信息文件
   hosts allow=10.250.151.233     #允许连接的客户端
   ignore errors = yes     #忽略出现I/O错误
   timeout = 600
 
(2)    创建认证文件
  vi /etc/rsyncd.pass
  ##代码
  root:glong@123      #格式是用户名:密码
 
  #属主要有权限读这个文件,否则会报没权限
  chmod 600 /etc/rsyncd.pass  
 
(3)    修改/etc/xinetd.d/rsync文件,disable 改为 no
service rsync
{
        disable = no
        socket_type     = stream
        wait            = no
        user            = root
        server          = /usr/bin/rsync
        server_args     = --daemon
        log_on_failure  += USERID
}
 
(4)    启动服务端
rsync --daemon --config=/etc/rsyncd.conf
 

注:重启时记得删除rsyncd.pid:rm -rf /var/run/rsyncd.pid


rsync默认端口是873,防火墙要放开该端口,否则客户端会无法连接的
#开放873端口
sudo firewall-cmd --zone=public --add-port=873/tcp --permanent
#重启防火墙服务
sudo systemctl restart firewalld.service

6.    rsycn的客户端/文件发送端配置
客户端配置简单 只需要配置密码既可

  vi /etc/rsync_client.pwd
  ##代码
  glong@123    #只需要填写rsync服务的密码

  #属主要有权限读这个文件,否则会报没权限
  chmod 600 /etc/rsync_client.pwd 
 
7.    客户端同步测试
## 将本地/root/hjl/文件同步到 10.250.151.231远程服务器 zentaobak 目录下面,命令如下:
rsync -auvrtzopgP --progress --password-file=/etc/rsync_client.pwd /root/hjl [email protected]::zentaobak
 
注:zentaobak就是服务端/etc/rsyncd.conf里的配置
 
在服务端检查数据是否传送成功

rsync只是一次性同步,如果需要实时同步就需要引入另一个工具inotify了

8.    crontab定时备份
1)    备份场景说明
该路径下每天都会新增3个文件,分别是*code.zip.php、*file.zip.php、*sql.zip.php。我们只需将每天新增3个文件备份到另一个服务器上即可

2)    编写运行脚本
vi back.sh
脚本代码: 
#!/bin/sh
#备份目录
BACK_HOME="/opt/zbox/app/zentaopro/tmp/backup"
newfile="aa"
#获取最新文件夹名
code_newfile=`ls -t $BACK_HOME/*code.zip.php | head -1`
file_newfile=`ls -t $BACK_HOME/*file.zip.php | head -1`
sql_newfile=`ls -t $BACK_HOME/*sql.php | head -1`
#将最新文件夹下的包远程到服务端取
rsync -auvrtzopgP --progress --password-file=/etc/rsync_client.pwd $code_newfile [email protected]::zentaobak
rsync -auvrtzopgP --progress --password-file=/etc/rsync_client.pwd $file_newfile [email protected]::zentaobak
rsync -auvrtzopgP --progress --password-file=/etc/rsync_client.pwd $sql_newfile [email protected]::zentaobak

脚本说明:
code_newfil:获取最新的*code.zip.php文件
file_newfile:获取最新的* file.zip.php文件
sql_newfile:获取最新的* sql.zip.php文件

 
3)    为脚本添加执行权限
chmod 777 back.sh
 
4)    验证脚本准确性
执行客户端的备份sh脚本,成功如下
 
检查服务端的数据如下:
 
5)    设置crontab定时执行
vi /etc/crontab 
#在最后一行中加入:  
00 3 * * * root /opt/zbox/back.sh
#表示每天3点00分执行备份
 
注:crontab配置文件格式如下: 
分 时 日 月 周  命令

6)    重启crontab
service crond restart  

这样每天就可以执行备份啦


9.    crontab定时清理
由于磁盘大小受限制,为了避免磁盘空间爆炸,往往需要做定期自动清理,具体清理多少天前的数据,根据实际情况来定
1)    清理场景说明
该路径下每天都会新增3个文件,分别是*code.zip.php、*file.zip.php、*sql.zip.php。每天大概新增5G的数据量,长年累计下,数据量会比较大。所以需要做定期清理,建议只保留7天的数据即可

2)    编写运行脚本
vi clear.sh
脚本代码: 
#!/bin/sh
#禅道备份目录
zentao_BACK_HOME="/mnt/main_back/zentao_bak"
#SVN备份目录
SVN_BACK_HOME="/mnt/main_back/svn_bak"
#删除7天前备份的所有文件(包括文件夹)
find /mnt/main_back/zentao_bak/* -mtime +7 -exec rm -rf {} \;
find /mnt/main_back/svn_bak/* -mtime +7 -exec rm -rf {} \;

注:
/*
#查找10天前的所有文件(不包括文件夹)
find /home/Busines/version/new_version_back/* -type f -mtime +10 -exec ls -l {} \;

#删除10天前的所有文件(不包括文件夹)
find /home/Busines/version/new_version_back/* -type f -mtime +10 -exec rm {} \;

#查找10天前的所有文件(包括文件夹)
find /home/Busines/version/new_version_back/* -mtime +10 -exec ls -l {} \;
#删除10天前的所有文件(包括文件夹)
find /home/Busines/version/new_version_back/* -mtime +10 -exec rm -rf {} \;
*/


3)    为脚本添加执行权限
chmod 777 clear.sh
 
4)    验证脚本准确性
执行sh脚本,成功如下
 
由于这里不会打印信息,所以具体还得到对应的目录下检查

5)    设置crontab定时执行
vi /etc/crontab 
#在最后一行中加入:  
0 1 * * 0 root /mnt/main_back/clear.sh
#表示每周日1点0分执行清除
 
注:crontab配置文件格式如下: 
分 时 日 月 周  命令

6)    重启crontab
service crond restart  
 
这样数据每周就可以清理一次了。
10.    常见问题
(1)    客服端连接不上服务端
 
问题分析:
   通过再三确定,配置的没有问题的,后来才发现rsync默认的端口是873,初步怀疑端口在防火墙没有开放,被防火墙给限制了。
解决方案:
     放开rsync端口,操作如下

#开放873端口
sudo firewall-cmd --zone=public --add-port=873/tcp --permanent
#重启防火墙服务
sudo systemctl restart firewalld.service
 
放开端口之后,传送成功

(2)    @ERROR: chroot failed
@ERROR: chroot failed
rsync error: error starting client-server protocol (code 5) at main.c(1503) [sender=3.0.6]
 
原因: 
服务器端的目录不存在或无权限,创建目录并修正权限可解决问题。

通过分析,我在服务端的/etc/rsyncd.conf文件里,路径使用了`date +%Y%m%d`变量,可/etc/rsyncd.conf里又不能跟shell一样很好使用变量,所以导致chroot failed错误,就是找不到路径。
可我要每天进行备份的,所以必须要有日期作为代表。
 

解决方案一:
   直接指定服务端路径,结果又报The --password-file option may only be used when accessing an rsync daemon.错误
 
网上说这个报错是服务器端没有执行rsync --daemon命令(没有启动服务),可服务器是有启这个服务的,结果这个错误一直无法解决,只能用方案二了。
解决方案二:
     置换法,即之前是客户端是作为服务端,之前是服务端的作为客户端。
    从SERVER端取文件,由于SERVER端文件路径是固定的,备份路径可以做变量了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章