rsync-远程同步
一、rsync
正确、有效的备份方案是保障系统及数据安全的重要手段,在服务器中,通常会结合计划任务,shell脚本来执行本地备份,为了加强备份的可靠性,使用异地备份也是非常有必要的今天我们将要学习的就是异地灾备的其中一种rsync(Remote Sync 远程同步)工具的使用。以实现快速、安全、高效的异地备份,比如构建Web镜像站点等。rsync是一个开源的快速备份工具,可以在不同主机之间镜像同步整个目录树,支持增量备份,保持连接和权限,且采用优化的同步算法,传输前执行压缩,因此非常适合异地备份,镜像服务器等引用。解释:所谓的镜像服务器就是两台主机提供服务的内容是保持同步的,需要一致的,就像我们之前学习的bind服务的主从复制技术,当一台服务器宕机时还能正常的提供服务,当然了镜像服务器一般都会用在负载均衡上面比如像淘宝和京东的网站,用没用这个工具我不知道,但是我敢肯定的是他们的网站一定利用了类似的技术。
在远程同步中,负责发起rsync同步操作的客户机称为发起端,也就是客户端,而负责响应来自发起端的rsync同步操作的服务器称为同步源。在同步过程中,同步源负责提供文档的原始位置,发起端应该对该位置具有读取权限。(也就是能够进行下载同步源中的文件或目录树)。rsync分为两种上行同步和下行同步,上行同步是指将本地的文件或者目录树上传到同步源,下行同步是从同步源下载文件或目录树。
二、环境
主机名 | os | IP | 环境 |
发起端 | centos-6.5 | 192.168.100.1 |
inotify-tools-3.14.tar.gz |
同步源 | centos-6.5 | 192.168.100.2 | rsync-3.0.6-9.el6_4.1.x86_64 |
三、实战
1)建立/etc/rsyncd.conf配置文件。(配置rsync同步源需要手动建立配置文件/etc/rsyncd.conf,创建备份的账户文件,然后以--daemon运行。 )
uid = nobody //指定运行程序的用户
gid = nobody //指定运行程序的组
use chroot = yes //禁锢在源目录,这里指的是只能访问我指定的目录不允许访问其他目录,这里类似以vsftpd的禁锢
address = 192.168.100.2 //指定监听的地址
port = 873 //指定监听的端口
log file = /var/log/rsyncd.log //指定日志文件存放的位置
pid file = /var/run/rsyncd.pid //指定进程文件的位置
hosts allow = 192.168.100.0/24 //指定可以访问的地址,这里如果需要实现异地灾备的时候可以写上公网的IP地址,通过路由器映射进来就可以了。
[www] //指定共享的名字
path = /var/www/html //源目录的实际目录
comment = Dcoument Root of web.lzg.com //这个模块的描述信息
read only = yes //目录为只读
dont compress = *.gz *.bz2 *.zip *.z *.rar //同部是不在压缩的文件类型,也就是在传输过程中不在进行二次压缩。
auth users = zm //授权备份的用户
secrets file = /etc/rsyncd_users.db //指定账户信息的数据文件位置
2、建立账户数据文件
vim /etc/rsyncd_users.db //根据配置文件的名字为准
zm:alibaba //前面为用户名后面为用户的密码
chmod 600 /etc/rsyncd_users.db //这个文件的权限必须为600否则后面的过程会有问题的。
3、启动进程,并设置下次开机自动启动
rsync --daemon
echo "rsync --daemon" >> /etc/rc.local
netstat -anpt | grep reync //现在再来看一下是否启动
4、iptables -I INPUT -p tcp --dport 873 -j ACCEPT //在防火墙上建立相应的规则
touch /var/www/html/test{1..5}.doc //测试用
2)发起端
rsync的基本格式为 : rsync 选项 原始位置 目标位置; 如下是选项参数
-r :递归模式,包含目录及子目录的所有文件
-l:对于符号连接文件仍然保持为符号连接文件
-v:显示同步过程中的详细信息
-z:在传输过程中进行压缩
-t:保留文件的时间标记
-p:保留文件的权限标记
-g:保留文件的属组标记
-o:保留文件的属主标记
-H:保留硬链接文件
-A:保留ACL属性信息
-D:保留设备文件及其他特殊文件
-a:归档模式,保留文件的权限、属性等信息,等同于-rlptogD选项的集合
--delete :删除目标位置有而原始位置没有的文件 这个选项的含义就是,发起端的目录有的文件而同步源没有的文件就将发起端的文件删除。
--checksum根据校验和(而不是文件大小,修改时间)来判断是否跳过文件。
rsync -avz [email protected]::www /backup 或
rsync -avz rsync://[email protected]/www /backup
查看/backup目录下的是否有刚在同步源创建的文件,如果有说明成功。
在实际的生产环境下我们不可能通过这样的方式来执行一般我们都是通过计划任务来实现的,使用计划任务时就需要考虑密码的问题,怎么将密码输入进去,这里我们提供了两种解决方案,一种就是我们之前提到过的使用匿名的方式来实现,当时这样相对来说不是很安全,还有一种呢就是将备份用户的密码写入到一个文件中,在任务执行的过程中去执行他。
vim /etc/zm.pass //起个名字
123.abc
chmod 600 /etc/zm.pass
#现在我们就来通过计划任务实现周期性的执行。
crontab -e
*/5 * * * * /usr/bin/rsync -azv --delete --password-file=/etc/zm.pass [email protected]::www /var/www/html/
tail -f /var/log/cron //来进行监控计划任务的执行过程
注:到这下行同步就完成了!!!
3)上行同步
所谓的上行同步就是将发起端的文件上传到同步源,比如说,我现在的服务器首先跟新了文件,这时需要同步源同时也存在发起端一样的文件 ,这时就会用到上行同步,也就是所说的上传。我们实行上行同步的时候不能使用rsync来进行同步,因为rsync使用的用户不是系统用户,zm这个用户属于rsync,它默认有other权限,不能对目录有写入权限,所以他是无法完成上传操作的,还需要使用另外一种同步源ssh同步源,ssh同步源使用ssh协议通讯,相对于rsync更安全一些,因为ssh协议采用的是加密传输。
在linux内核中默认提供了三个调整参数 (在同步源上配置)
vim /etc/sysctl/conf #添加三行
fs.inotify.max_ queued_events = 30000 #监控时间队列
fs.inotify.max_user_instances = 500 #最多监控实例
fs.inotify.max_user_watches = 2000000 #每隔实例最对监控文件数量
3.1)配置ssh源(同步源上进行操作)
1、创建用户lisi
useradd lisi
echo “anquan” | passwd --stdin lisi
2、开启sshd服务
service sshd start
3、创建同步目录 //用户将文件上传到哪里
mkdir /backup
4、设置rput对backup有读写执行权限。
setfacl -R -m user:lisi:rwx /backup
setfacl -R -m default:user:lisi:rwx /backup //新建的文件的读写执行权限
3.2)使用秘钥对的方式验证身份 (在发起端配置)
ssh-****** -t rsa
ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]
ssh [email protected] #进去就ok,实现无交互式验证。
3.3)安装inofity工具 (在发起端安装)
tar zxf inotify-tools-3.14.tar.gz -C /usr/src/
cd inotify-tools-3.14/
./configure && make && make install
inotifywait -mrq -e modify,delete,create,move,attrib /var/www/html/其中
-m:表示持续监控
-r:递归目录
-q:简化输出信息 //只输出三列
-e:指定要监控那些事件modify修改、create创建、move移动、delete删除、attrib属性修改。
创建个文件测试一下
touch /var/www/html/test.html
rsync -azH --delete [email protected]:/backup
3.4)制作个脚本实现
#!/bin/bash
inotify_cmd="inotifywait -mrq -e modify,delete,create,attrib,move /var/www/html"
rsync_cmd="rsync -azH --delete /var/www/html/ [email protected]:/var/www/html/"
$inotify_cmd | while read directory event file
do
if [ $(pgrep "^rsync$" | wc -l) -le 0 ]; then
$rsync_cmd
echo "$file way rsnyc"
fi
done
. /opt/inotify_ssh.sh #执行脚本
touch /var/www/test{1.5}.html
在同步源查看是否同步,同步则成功。
上一篇: docker load Error processing tar file(exit status 1): write xxx layer.tar: no space left on device
下一篇: 用blob下载文件
推荐阅读
-
java(jsp)执行ssh命令 在远程执行shell命令 博客分类: javaLinux javajspssh远程shell
-
java 远程下载服务器的文件 博客分类: java java
-
同步数据结构之原子类序章 博客分类: Java 线程
-
Java并发包同步组件ReentrantReadWriteLock 博客分类: Java 线程
-
同步数据结构之原子复合类 博客分类: Java 线程
-
Java并发包同步组件ReentrantReadWriteLock 博客分类: Java 线程
-
Java Volatile学习 博客分类: 并发&异步&无阻塞 多线程并发cocurrencethread同步
-
Java并发框架(Concurrency) 博客分类: 并发&异步&无阻塞 并发多线程concurrent同步异步
-
java 远程下载服务器的文件 博客分类: java java
-
Windows Shell 获取昨天日期,定时远程下载服务器日志 pscp昨天shell定时dos