一、rsync远程同步服务器
简介:
Rsync(remote synchronize)是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件,也可以使用Rsync同步本地硬盘中的不同目录。
Rsync是用于取代rcp的一个工具,Rsync使用所谓的“Rsync算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。
Rsync支持大多数的类Unix系统,无论是Linux、Solaris还是BSD上都经过了良好的测试。此外,它在Windows平台下也有相应的版本,比较知名的有cwRsync和Sync2NAS
特点:
1)能更新整个目录树和文件系统
2)有选择性的保持符号连接、硬链接、文件属性、权限、设备以及时间等;
3)对于安装来说,无任何特殊权限要求
4)对于多个文件来说,内部流水线减少文件等待的延时
5)能用rsh、ssh或直接端口做为传输入端口
6)支持匿名rsync同步文件,是理想的镜像工具
rsync命令的用法:
基本格式:rsync [选项] 原始位置 目标位置
常用选项:
-a:归档模式,递归保留对象属性,等同于-rlptgoD
-v:显示同步过程的详细信息(ver)
-z:在传输文件时进行压缩
-H:保留硬链接文件
-A:保留ACL属性信息
--delete:删除目标位置有而原始位置没有的文件
-r:递归模式,包含目录及子目录中所有文件
-l:对于符号连接文件仍然复制为符号连接文件
-p:保留文件的权限标记
-t:保留文件的时间标记
-g:保留文件的属组标记(仅超级用户使用)
-o:保留文件的属主标记(仅超级用户使用)
-D:保留设备文件及其他特殊文件
服务器端:同步源
客户端:发起端
同步源的搭建方式:ssh或rsync
访问控制列表:
setfacl:设置特殊权限
-m 添加权限
-x 删除一条特殊权限
-b 删除所有特殊权限
-R 递归
default 设置默认权限(对未来创建的文件也生效)
二、利用SSH搭建同步源
1、服务器端:
1)创建同步目录,如:mkdir /var/ssh
2)创建测试文件,如:touch /var/ssh/ssh.txt
3)设置权限,如:
useradd a1 #用来上传
useradd a2 #用来下载
chown a1:a1 /var/ssh
2、客户端:
1)创建同步目录,如:mkdir /ssh
2)同步服务器数据,如:rsync -avz [email protected]:/var/ssh/* /ssh
三、利用rsync搭建同步源
1、服务器端:
1)创建同步目录,如:mkdir /var/rsync
2)创建测试文件,如:touch /var/rsync/rsync.txt
3)创建主配置文件,如:
vim /etc/rsyncd.conf
use chroot = yes
address = 服务器IP地址 #监听地址
port 873 #监听端口
log file = /var/log/rsyncd.log #日志文件
pid file = /var/run/rsyncd.pid #pid文件
[share] #共享目录名
comment = rsync share directory #描述信息
path = /var/rsync #真实目录
read only = yes #只读
dont compress = *.gz *.bz2 #这两种格式的文件传输过程中不压缩
auth users = aa #允许登录用户
secrets file = /etc/rsyncd_users.db #用户密码文件
4)创建账户文件:
vim /etc/rsyncd_users.db
aa:123456
5)开启服务:rsync --daemon
6)关闭服务:kill $(cat "/var/run/rsyncd.pid")
2、客户端
1)创建同步目录,如:mkdir /rsync
2)同步服务器数据,如:
rsync -avz [email protected]::share /rsync
rsync -avz rsync://[email protected]/share /rsync
四、同步脚本
1、基于SSH的远程同步服务器:
客户端:ssh-keygen -t rsa #生成公钥和私钥文件
ssh-copy-id [email protected] #将公钥文件上传到服务器端
ssh [email protected] #测试密钥对是否成功
rsync -avz [email protected]:/var/ssh/* /ssh #测试同步是否成功
2、基于rsync的远程同步服务器:
客户端: export RSYNC_PASSWORD=123456 #声明全局变量,保存连接用户的密码
rsync -avz [email protected]::share /rsync #测试同步是否成功
五、自动备份
inotify
两个组件:inotifywait:持续监控,一有变化,立即输出结果
inotifywatch:收集文件系统变化情况,并在运行结果后输出汇总的变化情况
修改内核参数:
max_queued_events 监控队列
max_user_instances 最多监控实例数
max_user_watches 每个实例最多监控文件数
1、单向同步
1)rsync同步源:指备份操作的远程服务器,也称为备份源。主要包括两种:rsync源、ssh源
2)编辑内核
vim /etc/sysctl.conf 添加如下内容
fs.inotify.max_queued_events = 16384
fs.inotify.max_user_instances = 1024
fs.inotify.max_user_watches - 1048576
sysctl -p #检查sysctl.conf配置文件是否正确
3)inotifywait -mrq -e modify,create,move,delete /var/www/html
-m 持续监控
-r 监控所有子对象
-q 简化输出
-e 指定监控的事件类型
4)编写脚本,当监控到数据变化时自动同步
vim rsync.sh
#!/bin/bash
INOTIFY_CMD="inotifywait -mrq -e modify,create,attrib,move,delete /var/www/html"
RSYNC_CMD="rsync -avz --delete /var/www/html [email protected]:/var/www/html"
do
if [ $(pgrep rsync | wc -l) -le 0 ]
then
$RSYNC_CMD
fi
done
2、双向同步
1)保证两台服务器之间可以通过ssh无密码访问,操作如下(这里以root用户为例):
分别在server1(192.168.1.1)和server2(192.168.1.2)下,创建密钥
server1:
ssh-keygen -t rsa
ssh-copy-id 192.168.1.2
server2:
ssh-keygen -t rsa
ssh-copy-id 192.168.1.1
分别在两台机器上执行如下测试:
ssh 192.168.1.1
ssh 192.168.1.2
2)安装unison
首先安装ocaml,版本至少为3.07或更高
下载地址:http://caml.inria.fr/pub/distrib/ocaml-3.10/
tar -zxf ocaml-3.10.2.tar.gz
cd ocaml-3.10.2
./configure
make world opt
make install
安装unison
下载地址:http://www.seas.upenn.edu/~bcpierce/unison//download/releases/unison-2.13.16/
tar -zxf unison-2.13.16.tar.gz
cd unison-2.13.16
make UISTYLE=text THREADS=true STATIC=true
cp unison /usr/local/bin
安装inotify
下载地址:http://inotify-tools.sourceforge.net
tar xvf inotify-tools-3.14.tar.gz
cd inotify-tools-3.14
./configure
make
make install
ln -sv /usr/local/lib/libinotify* /usr/lib/
unison -batch /home/server1/ ssh:192.168.10.2//home/server2
#测试两台服务器之间是否可以同步文件
3)编写自动同步脚本
server1上创建脚本unison.sh
vim /root/unison.sh
#!/bin/bash
ip2="192.168.1.2"
src2="/server1/"
drt2="/server2/"
/usr/local/bin/inotifywait -mrq -e create,delete,modify,move $src2 | while read line
do
/usr/local/bin/unison -batch $src2 ssh://$ip2/$drt2
echo -n "$line" >> /var/log/inotify.log
echo $(date | cut -d " " -f1-4 ) >> /var/log/inotify.log
done
chmod a+x /root/unison.sh
server2上创建脚本unison.sh
vim /root/unison.sh
#!/bin/bash
ip1="192.168.1.1"
src1="/server2/"
drt1="/server1/"
/usr/local/bin/inotifywait -mrq -e create,delete,modify,move $src1 | while read line
do
/usr/local/bin/unison -batch $src1 ssh://$ip1/$drt1
echo -n "$line" >> /var/log/inotify.log
echo $(date | cut -d " " -f1-4 ) >> /var/log/inotify.log
done
chmod a+x /root/unison.sh