将数据同步到其它服务器这里使用Linux同步文件工具rsync来进行文件的同步
-
rsync
rsync是类unix系统下的数据镜像备份工具——remote sync。一款快速增量备份工具 Remote Sync,远程同步 支持本地复制,或者与其他SSH、rsync主机同步 -
用法
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 用途不一样,所以发行版只是让安装好软件就可以了,配置文件都是让管理员来根据自己的用途和方向来自己设置的。
- 检查rsycn是否安装
检查方法:
rpm -qa rsync
出现rsync 包名就是安装了
如果是以下提示,表示没有安装rsync - 安装rsycn
rsync的安装可以使用yum直接安装:yum install rsync - 检查rsycn是否安装成功
检查方法:
rpm -qa rsync
出现rsync 包名就是安装成功了
- 启用rsync服务器端同步远程文件
rsycn的服务端为服务器的文件接收端,rsycn的客户端为服务器的文件推动端。 - rsycn的服务端/文件接收端配置
- 先创建备份目录
- 服务端需要开启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了
- crontab定时备份
- 备份场景说明
该路径下每天都会新增3个文件,分别是*code.zip.php、*file.zip.php、*sql.zip.php。我们只需将每天新增3个文件备份到另一个服务器上即可 - 编写运行脚本
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文件
-
为脚本添加执行权限
chmod 777 back.sh -
验证脚本准确性
执行客户端的备份sh脚本,成功如下
检查服务端的数据如下: -
设置crontab定时执行
vi /etc/crontab
#在最后一行中加入:
00 3 * * * root /opt/zbox/back.sh
#表示每天3点00分执行备份
注:crontab配置文件格式如下:
分 时 日 月 周 命令 -
重启crontab
service crond restart
这样每天就可以执行备份啦
- crontab定时清理
由于磁盘大小受限制,为了避免磁盘空间爆炸,往往需要做定期自动清理,具体清理多少天前的数据,根据实际情况来定
- 清理场景说明
该路径下每天都会新增3个文件,分别是*code.zip.php、*file.zip.php、*sql.zip.php。每天大概新增5G的数据量,长年累计下,数据量会比较大。所以需要做定期清理,建议只保留7天的数据即可 - 编写运行脚本
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 {} ;
*/
-
为脚本添加执行权限
chmod 777 clear.sh -
验证脚本准确性
执行sh脚本,成功如下
由于这里不会打印信息,所以具体还得到对应的目录下检查 -
设置crontab定时执行
vi /etc/crontab
#在最后一行中加入:
0 1 * * 0 root /mnt/main_back/clear.sh
#表示每周日1点0分执行清除
注:crontab配置文件格式如下:
分 时 日 月 周 命令 -
重启crontab
service crond restart
这样数据每周就可以清理一次了。
- 常见问题
(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端文件路径是固定的,备份路径可以做变量了