目录[-]

公司网站 有两台服务器 A、B,做了动静分离,A上为静态服务器安装有nginx,B为Tomcat容器。访问时,通过A的nginx 做反向代理,静态文件http请求,目录statics直接访问A服务器上的静态文件。

但我们由于开发的时候 项目 java代码和静态文件都在一起,只发布到 B上,然后将静态文件目录statics直接同步到A上,这样减少了发布的复杂度,如果服务器多的话效果更佳。

其实最初做动静分离,用的是nginx 的缓存功能,直接将静态文件缓存到A服务器上,但这个时候对文件更新不友好。rsync能很好的解决这个问题。

1. rsync 同步的大致思路

服务器A和B上都安装rsync,其中B服务器上是以服务器模式运行rsync,而A上则以客户端方式运行rsync。这样在web服务器B上运行rsync守护进程,在A上定时运行客户程序来同步web服务器B上需要同步的内容。

rsync 同步有下面几个优点:

可以镜像 保存整个目录树和文件系统。

可以很容易做到保持原来文件的权限、时间、软硬链接等等。

无须特殊权限即可安装。

快速:第一次同步时 rsync 会复制全部内容,但在下一次只传输修改过的文件。rsync 在传输数据的过程中可以实行压缩及解压缩 操作,因此可以使用更少的带宽。

安全:可以使用scp、ssh等方式来传输文件,当然也可以通过直接的socket连接。

支持匿名传输,以方便进行网站镜象。

2. rsync的安装

一般的linux系统上都默认安装得了rsync 。也可以手动安装,这里采用的是rsync原生的传输协议,如果采用 ssh传输协议的话,就需要安装ssh。

下载:http://www.samba.org/rsync/

1
2
3
shell> tar zxvf rsync-x.x.x.tar.gz
shell> cd rsync-x.x.x
shell> ./configure && make && make install

或者:

1
2
sudo apt-get install rsync
yum install rsync

3. rsync的配置

rsync的主要有以下三个配置文件rsyncd.conf(主配置文件)、rsyncd.secrets(密码文件)、rsyncd.motd(rysnc服务器信息)
  服务器配置文件(/etc/rsyncd.conf),该文件默认不存在,请创建它。
  具体步骤如下:

1
2
3
4
#touch /etc/rsyncd.conf  #创建rsyncd.conf,这是rsync服务器的配置文件。
#touch /etc/rsyncd.secrets  #创建rsyncd.secrets ,这是用户密码文件。
#chmod 600 /etc/rsyncd/rsyncd.secrets  #将rsyncd.secrets这个密码文件的文件属性设为root拥有, 且权限要设为600, 否则无法备份成功!
#touch /etc/rsyncd.motd

rsyncd.conf 服务器的主要配置文件,可以参考如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# This line is required by the /etc/init.d/rsyncd script
pid file = /var/run/rsyncd.pid 
port = 873
address = 192.168.1.171
#uid = nobody
#gid = nobody  
uid = root 
gid = root
use chroot = yes
read only = yes
 
#limit access to private LANs
hosts allow=192.168.1.0/255.255.255.0 10.0.1.0/255.255.255.0
hosts deny=*
max connections = 5
motd file = /etc/rsyncd.motd
 
#This will give you a separate log file
#log file = /var/log/rsync.log
 
#This will log every file transferred - up to 85,000+ per user, per sync
#transfer logging = yes
log format = %t %a %m %f %b
syslog facility = local3
timeout = 300
 
[home] 
path = /usr/local/tomcat/webapp/home/statitcs
list=yes
ignore errors
auth users = root
secrets file = /etc/rsyncd.secrets
comment = This is RHEL 4 data
exclude =  dir1/  dir2/

auth users是必须在服务器上存在的真实的系统用户,如果你想用多个用户以,号隔开,比如auth users = nobody,root  
  rsyncd.secrets的内容格式为: 用户名:密码

1
2
chown root.root rsyncd.secrets  #修改属主
chmod 600 rsyncd.secrets     #修改权限

注:1、将rsyncd.secrets这个密码文件的文件属性设为root拥有, 且权限要设为600, 否则无法备份成功!  出于安全目的,文件的属性必需是只有属主可读。 
  2、这里的密码值得注意,为了安全你不能把系统用户的密码写在这里。

  设定rsyncd.motd 文件;
  它是定义rysnc服务器信息的,也就是用户登录信息。比如让用户知道这个服务器是谁提供的等;
类似ftp服务器登录时,我们所看到的 linuxsir.org ftp ……。 当然这在全局定义变量时,并不是必须的,你可以用#号注掉,或删除;
    rsync.conf 的详细说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
    #在rsync 服务器中,全局定义有几个比较关健的,根据我们前面所给的配置文件 rsyncd.conf 文件;
  pid file = /var/run/rsyncd.pid   注:告诉进程写到 /var/run/rsyncd.pid 文件中;
  port = 873  注:指定运行端口,默认是873,您可以自己指定;
  address = 192.168.1.171  注:指定服务器IP地址
  uid = nobody 
  gid = nobdoy
  注:服务器端传输文件时,要发哪个用户和用户组来执行,默认是nobody。 如果用nobody 用户和用户组,可能遇到权限问题,有些文件从服务器上拉不下来。所以我就偷懒,为了方便,用了root 。不过您可以在定义要同步的目录时定义的模块中指定用户来解决权限的问题。
  
    use chroot = yes
  注:用chroot,在传输文件之前,服务器守护程序在将chroot 到文件系统中的目录中,这样做的好处是可能保护系统被安装漏洞侵袭的可能。缺点是需要超级用户权限。另外对符号链接文件,将会排除在外。也就是说,你在 rsync服务器上,如果有符号链接,你在备份服务器上运行客户端的同步数据时,只会把符号链接名同步下来,并不会同步符号链接的内容;这个需要自己来尝试
 
  read only = yes
  注:read only 是只读选择,也就是说,不让客户端上传文件到服务器上。还有一个 write only选项,自己尝试是做什么用的吧;
 
  #limit access to private LANs
  hosts allow=192.168.1.0/255.255.255.0 10.0.1.0/255.255.255.0
  注:在您可以指定单个IP,也可以指定整个网段,能提高安全性。格式是ip 与ip 之间、ip和网段之间、网段和网段之间要用空格隔开;
 
  max connections = 5 
  注:客户端最多连接数
 
  motd file = /etc/rsyncd/rsyncd.motd
  注:motd file 是定义服务器信息的,要自己写 rsyncd.motd 文件内容。当用户登录时会看到这个信息。
 
  log file = /var/log/rsync.log
  注:rsync 服务器的日志;
 
  transfer logging = yes
  注:这是传输文件的日志
 
  log format = %t %a %m %f %b
  syslog facility = local3
  timeout = 300
  
模块定义
  模块定义什么呢?主要是定义服务器哪个目录要被同步。每个模块都要以[name]形式。这个名字就是在rsync 客户端看到的名字,其实有点象Samba服务器提供的共享名。而服务器真正同步的数据是通过path 指定的。我们可以根据自己的需要,来指定多个模块。每个模块要指定认证用户,密码文件、但排除并不是必须的
  下面是前面配置文件模块的例子:
 
  [home]  #模块它为我们提供了一个链接的名字,在本模块中链接到了/home目录;要用[name] 形式
  path = /usr/local/tomcat/webapp/home/statics    #指定文件目录所在位置,这是必须指定的
  auth users = root   #认证用户是root  ,是必须在服务器上存在的用户
  list=yes   #list 意思是把rsync 服务器上提供同步数据的目录在服务器上模块是否显示列出来。默认是yes 。如果你不想列出来,就no ;如果是no是比较安全的,至少别人不知道你的服务器上提供了哪些目录。你自己知道就行了;
  ignore errors  #忽略IO错误
  secrets file = /etc/rsyncd.secrets   #密码存在哪个文件
  comment = linuxsir home  data  #注释可以自己定义
  exclude = dir1/ dir2/    
  注:exclude是排除的意思,也就是说,要把/usr/local/tomcat/webapp/home/statics目录下的easylife和samba排除在外; dir1/和dir2/目录之间有空格分开

4. rsync的基本操作

服务器端启动

1
usr/bin/rsync --daemon --config=/etc/rsyncd/rsyncd.conf

可能需要 root  运行. 也可以在/etc/rc.d/rc.local里加入让系统自动启动等.

   查看rsync服务器上提供了哪些可用的数据源 

1
# rsync  --list-only  root@192.168.0.102::home

客户端同步

#rsync -avzP root@192.168.0.100::home /var/www/statics 
Password: 这里要输入root的密码,是服务器端rsyncd.secrets提供的。 
注:这个命令的意思就是说,用root用户登录到服务器上,把/var/www/statics数据,同步到本地当前目录/var/www/statics上。当然本地的目录是可以你自己定义的。 如果当你在客户端上当前操作的目录下没有/var/www/statics这个目录时,系统会自动为你创建一个;当存在/var/www/statics这个目录中,你要注意它的写权限。

#rsync -avzP  --delete root@linuxsir.org::home   /var/www/statics 
引入一个--delete 选项,表示客户端上的数据要与服务器端完全一致,如果 linuxsirhome目录中有服务器上不存在的文件,则删除。 最终目的是让linuxsirhome目录上的数据完全与服务器上保持一致;用的时候要小心点,最好不要把已经有重要数所据的目录,当做本地更新目录, 否则会把你的数据全部删除;

客户端配置

  设定密码文件 
  #rsync -avzP  --delete  --password-file=rsyncd.secrets   root@192.168.0.100::home /var/www/statics 
  加了一个选项 --password-file=rsyncd.secrets,这是当我们以root用户登录rsync服务器同步数据时,密码将读取rsyncd.secrets这个文件。 
这个文件内容只是root用户的密码。我们要如下做;

1
2
3
4
5
# touch rsyncd.secrets
# chmod 600 rsyncd.secrets
# echo "123456"> rsyncd.secrets
 
# rsync -avzP  --delete  --password-file=rsyncd.secrets   root@192.168.0.100::home /var/www/statics

  注:这里需要注意的是这份密码文件权限属性要设得只有属主可读。  这样就不需要密码了,客户端通过 cron计划来同步比较好。  
   rsync中的参数 
   -r 是递归  
   -l 是链接文件,意思是拷贝链接文件; -p 表示保持文件原有权限; -t 保持文件原有时间; -g 保持文件原有用户组;-o 保持文件原有属主; -D 相当于块设备文件; 
   -z 传输时压缩; 
   -P 传输进度; 
   -v 传输时的进度等信息,和 -P有点关系,自己试试。可以看文档; 
   -e ssh的参数建立起加密的连接。 
   -u只进行更新,防止本地新文件被重写,注意两者机器的时钟的同时 
   --progress是指显示出详细的进度情况 
   --delete是指如果服务器端删除了这一文件,那么客户端也相应把文件删除,保持真正的一致 
   --password-file=/password/path/file来指定密码文件,这样就可以在脚本中使用而无需交互式地输入验证密码了,这里需要注意的是这份密码文件权限属性要设得只有属主可读。

让rsync客户端自动与服务器同步数据

  1.创建同步脚本和密码文件   

1
2
3
4
5
6
7
8
#mkdir   /etc/cron.daily.rsync
#cd  /etc/cron.daily.rsync
#touch /var/www/statics.sh 
#chmod 755 /etc/cron.daily.rsync/*.sh 
#mkdir /etc/rsyncd/
#touch /etc/rsyncd/homeroot.secrets
 # echo "123456"> /etc/rsyncd/homeroot.secrets
#chmod 600  /etc/rsyncd/rsync.*

  注: 我们在 /etc/cron.daily/中创建了文件 /var/www/statics.sh,并且是权限是 755的。创建了密码文件 root用户用的是 homeroot.secrets,权限是 600;

  我们编辑 /var/www/statics.sh,内容是如下的: 
 

1
2
#!/bin/sh
 /usr/bin/rsync -avzP --password-file=/etc/rsyncd/homeroot.secrets root@192.168.0.100::home /var/www/statics/  

2.修改crond服务器的配置文件 加入到计划任务
  #crontab  -e
  加入下面的内容: 
  */10 * * * * /etc/cron.daily.rsync/statics.sh   1> /dev/null

配置好后,要重启crond 服务器;
  # killall crond    注:杀死crond 服务器的进程;
  # ps aux |grep crond  注:查看一下是否被杀死;
  # /usr/sbin/crond    注:启动 crond 服务器;
  # ps aux  |grep crond  注:查看一下是否启动了

注1.   如果 rsync 在ssh协议上传输,可以不输入密码登录。

1. 通过ssh-keygen在server A上建立SSH keys,不要指定密码,你会在~/.ssh下看到identity和identity.pub文件 
  2. 在server B上的home目录建立子目录.ssh
  3. 将A的identity.pub拷贝到server B上
  4. 将identity.pub加到~[user b]/.ssh/authorized_keys
  5. 于是server A上的A用户,可通过下面命令以用户B ssh到server B上了。e.g. ssh -l userB serverB。
这样就使server A上的用户A就可以ssh以用户B的身份无需密码登陆到server B上了。

Rsync + ssh 的命令格式为:

1
#rsync -avz --delete root@192.168.0.100:/usr/local/tomcat/webapp/home/statics /var/home/statics

注2. 实时同步

这里同步的思路是服务器A 主动的同步B,B作为rsync服务端,A作为客户端定时去同步B,拉取同步数据。

如果要做到实时同步就可以采用sersync工具或者rsync+inotify组合,这里就需要反过来,将B作为rsync客户端,A作为服务器。B主动推送同步文件,这里就要做到实时监控文件系统,当B上指定目录有更新时,主动同步到A。就需要inotify 监控 B上的文件系统。

注3. rsync通过linux防火墙

在服务器端要让你所定义的rsync 服务器端口通过,客户端上也应该让通过。

1
iptables -A INPUT -p tcp -m state --state NEW  -m tcp --dport 873 -j ACCEPT

查看一下防火墙是不是打开了 873端口;

1
iptables -L

 

Linux rsync 同步实践的更多相关文章

  1. linux rsync同步工具

    linux rsync同步工具 1.rsync介绍rsync是一款开源的.快速的.多功能的.可实现全量及增量的本地或远程数据同步备份的优秀工具.rsync软件适用于unix/linux/windows ...

  2. Linux rsync 同步

    rsync 是一个快速增量文件传输工具,它可以用于在同一主机备份内部的备分,我们还可以把它作为不同主机网络备份工具之用.本文主要讲述的是如何自架rsync服务器,以实现文件传输.备份和镜像.相对tar ...

  3. Linux rsync同步

    rsync介绍 rsync命令是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件.rsync使用所谓的“rsync算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文 ...

  4. Windows Linux 之间rsync同步CODE文件

    Windows Linux 之间rsync同步CODE文件 一.环境Windows:OS:Microsoft Windows Web Server 2008 SP1IP:192.168.88.197 ...

  5. 烂泥:linux文件同步之rsync学习(一)

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. 这几天刚好有空就打算开始学习linux下的文件同步软件rsync,在学习rsync时,我们可以分以下几个步骤进行: 1. rsync是什么 2. rsy ...

  6. Linux下同步工具inotify+rsync使用详解

    1. rsync 1.1 什么是rsync rsync是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件.它使用所谓的“Rsync演算法”来使本地和远程两个主机之间的文件达到同步,这 ...

  7. linux rsync实时同步

    rsync同步 同步与复制的差异:复制:完全拷贝源到目标同步:增量拷贝,只传输变化过的数据 同步操作:remote sync 远程同步支持本地复制,或与其他ssh,rsync主机同步.官方网站:htt ...

  8. Linux运维: Rsync同步数据(ubuntu16.04+windows10)

    rsync同步数据 -环境:Linux (ubuntu16.04) + windows10 Linux: 安装 sudo apt-get install rsync rsync --version 查 ...

  9. (转)Linux下同步工具inotify+rsync使用详解

    原文:https://segmentfault.com/a/1190000002427568 1. rsync 1.1 什么是rsync rsync是一个远程数据同步工具,可通过LAN/WAN快速同步 ...

随机推荐

  1. 开源GIS简介

    原文 开源GIS C++开源GIS中间件类库: GDAL(栅格)/OGR(矢量)提供了类型丰富的读写支持 GEOS(Geometry Engine Open Source)是基于C++的空间拓扑分析实 ...

  2. <转>DNS服务系列之二:DNS区域传送漏洞的安全案例

    DNS区域传送(DNS zone transfer)指的是一台备用服务器使用来自主服务器的数据刷新自己的域(zone)数据库.这为运行中的DNS服务提供了一定的冗余度,其目的是为了防止主的域名服务器因 ...

  3. Sqlserver作业-手把手带你体验

    所谓Sql Server作业就是按照规定的时间执行指定的脚本,如果在SQL Server 里需要定时或者每隔一段时间执行某个存储过程或3200字符以内的SQL语句时,可以用管理-SQL Server代 ...

  4. [Hive - LanguageManual] Create/Drop/Grant/Revoke Roles and Privileges / Show Use

    Create/Drop/Grant/Revoke Roles and Privileges Hive Default Authorization - Legacy Mode has informati ...

  5. java BigInteger类的用法

    import java.math.BigInteger; Scanner in = new Scanner(System.in); BigInteger x1 = new BigInteger(&qu ...

  6. linux vim用法总结

    1.跳转到指定行 编辑模式下:输入  ngg或nG(n代表行数) 命令模式下:输入  :n(n代表行数) 2.查找命令 命令模式下输入 / 后面加上查找的内容 例如    :/name     (查找 ...

  7. Android JNI之调用JAVA方法的返回类型签名

    从http://blog.csdn.net/lonelyroamer/article/details/7932787截取的 如何签名: 下面看看Sign签名如何写,来表示要取得的属性或方法的类型. 1 ...

  8. [AngularJS学习笔记] 基础学习01

    2016-06-06开始学习AngularJS AngularJS是会extend HTML的 ng-directives 先学习了四个 ng-app:定义AngularJS Application的 ...

  9. HDU ACM 1496 Equations

    Equations Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  10. CentOS上firefox安装flash

    CentOS下firefox安装flash说明 CentOS下自带了firefox,但没有flash插件的,按它自己的提示安装不成功,需要手动安装,如下: 1.打开flash官网,http://lab ...