两台linux服务器互相自动备份

将数据同步到其它服务器这里使用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/ root@192.168.53.86:/bak/mysqlbak --exclude “mysqlbak/index” -e “ssh -p 22”
将远程目录 /bak/mysqlbak下的文件同步到本地 /bak/mysqlbak/目录下
rsync -vzrtopg --progress --delete root@192.168.53.85:/bak/mysqlbak /bak

client连接SERVER
向SERVER端上传文件
/usr/bin/rsync -vzrtopg --progress --password-file=/root/rsync.pas /home/backup rsyuer@192.168.0.217::backup

从SERVER端取文件
/usr/bin/rsync -vzrtopg --progress --delete rsyuer@192.168.0.217::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 包名就是安装成功了
    在这里插入图片描述
  1. 启用rsync服务器端同步远程文件
    rsycn的服务端为服务器的文件接收端,rsycn的客户端为服务器的文件推动端。
  2. 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 root@10.250.151.231::zentaobak
在这里插入图片描述
注:zentaobak就是服务端/etc/rsyncd.conf里的配置
在这里插入图片描述
在服务端检查数据是否传送成功
在这里插入图片描述
rsync只是一次性同步,如果需要实时同步就需要引入另一个工具inotify了

  1. 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 root@10.250.151.231::zentaobak
    rsync -auvrtzopgP --progress --password-file=/etc/rsync_client.pwd $file_newfile root@10.250.151.231::zentaobak
    rsync -auvrtzopgP --progress --password-file=/etc/rsync_client.pwd $sql_newfile root@10.250.151.231::zentaobak

脚本说明:
code_newfil:获取最新的code.zip.php文件
file_newfile:获取最新的
 file.zip.php文件
sql_newfile:获取最新的* sql.zip.php文件
在这里插入图片描述

  1. 为脚本添加执行权限
    chmod 777 back.sh
    在这里插入图片描述

  2. 验证脚本准确性
    执行客户端的备份sh脚本,成功如下
    在这里插入图片描述
    检查服务端的数据如下:
    在这里插入图片描述

  3. 设置crontab定时执行
    vi /etc/crontab
    #在最后一行中加入:
    00 3 * * * root /opt/zbox/back.sh
    #表示每天3点00分执行备份
    在这里插入图片描述
    注:crontab配置文件格式如下:
    分 时 日 月 周  命令

  4. 重启crontab
    service crond restart
    在这里插入图片描述
    这样每天就可以执行备份啦

  1. 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 {} ;
*/

  1. 为脚本添加执行权限
    chmod 777 clear.sh
    在这里插入图片描述

  2. 验证脚本准确性
    执行sh脚本,成功如下
    在这里插入图片描述
    由于这里不会打印信息,所以具体还得到对应的目录下检查

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

  4. 重启crontab
    service crond restart
    在这里插入图片描述
    这样数据每周就可以清理一次了。

  1. 常见问题
    (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端文件路径是固定的,备份路径可以做变量了
在这里插入图片描述

posted @ 2022-11-28 11:13  kimiandkevin  阅读(470)  评论(0编辑  收藏  举报