本教程实现的是Linux服务器之间自动同步文件或目录的功能,网上有很多这方面的教程,大体有两种途径
(1)Rsync+inotify-tools
(2)Rsync+sersync
本教程采用第二种实现.下面先简单介绍几个项目中用到的软件或概念.
Rsync(remote synchronize)是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。Rsync使用所谓的“Rsync算法”来使本地和远 程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。
Rsync的基本特点如下:
Inotify是一种文件变化通知机制,linux内核从2.6.13起,加入了Inotify支持,通过Inotify可以监控文件系统中添加,删除,修改,移动等各种事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而inotify-tools正是实施这样监控的软件。
inotify 的实现有几款软件
注意:大前提rsync daemon 服务配置成功,可以在rsync客户端推送拉取数据,然后才能配置inotify服务。
- 1)inotify-tools,
- 2)sersync(金山周洋)
- 3)lsyncd
Rsync(remote sync)远程同步工具,通过rsync可以实现对远程服务器数据的增量备份同步,但rsync自身也有瓶颈,同步数据时,rsync采用核心算法对远程服务器的目标文件进行比对,只进行差异同步。我们可以想象一下,如果服务器的文件数量达到了百万甚至千万量级,那么文件对比将是非常耗时的。而且发生变化的往往是其中很少的一部分,这是非常低效的方式。inotify的出现,可以缓解rsync不足之处,取长补短
Rsync+Inotify-tools
(1)Inotify-tools只能记录下被监听的目录发生了变化(包括增加、删除、修改),并没有把具体是哪个文件或者哪个目录发生了变化记录下来;
(2)rsync在同步的时候,并不知道具体是哪个文件或者哪个目录发生了变化,每次都是对整个目录进行同步,当数据量很大时,整个目录同步非常耗时(rsync要对整个目录遍历查找对比文件),因此,效率很低。
Rsync+sersync
(1)sersync可以记录下被监听目录中发生变化的(包括增加、删除、修改)具体某一个文件或某一个目录的名字;
(2)rsync在同步的时候,只同步发生变化的这个文件或者这个目录(每次发生变化的数据相对整个同步目录数据来说是很小的,rsync在遍历查找比对文件时,速度很快),因此,效率很高。
小结:
当同步的目录数据量不大时,建议使用Rsync+Inotify-tools;当数据量很大(几百G甚至1T以上)、文件很多时,建议使用Rsync+sersync。
——————————————————————————————————
extended internet daemon
xinetd是新一代的网络守护进程服务程序,又叫超级Internet服务器,常用来管理多种轻量级Internet服务。
xinetd提供类似于inetd+tcp_wrapper的功能,但是更加强大和安全。
—xinetd的特色
1) 强大的存取控制功能
— 内置对恶意用户和善意用户的差别待遇设定。
— 使用libwrap支持,其效能更甚于tcpd。
— 可以限制连接的等级,基于主机的连接数和基于服务的连接数。
— 设置特定的连接时间。
— 将某个服务设置到特定的主机以提供服务。
2) 有效防止DoS攻击
— 可以限制连接的等级。
— 可以限制一个主机的最大连接数,从而防止某个主机独占某个服务。
— 可以限制日志文件的大小,防止磁盘空间被填满。
3) 强大的日志功能
— 可以为每一个服务就syslog设定日志等级。
— 如果不使用syslog,也可以为每个服务建立日志文件。
— 可以记录请求的起止时间以决定对方的访问时间。
— 可以记录试图非法访问的请求。
4) 转向功能
可以将客户端的请求转发到另一台主机去处理。
5) 支持IPv6
xinetd自xinetd 2.1.8.8pre*起的版本就支持IPv6,可以通过在./configure脚本中使用with-inet6 capability选项来完成。
注意,要使这个生效,核心和网络必须支持IPv6。IPv4仍然被支持。
6) 与客户端的交互功能
无论客户端请求是否成功,xinetd都会有提示告知连接状态。
—xinetd使用场景
原则上任何系统服务都可以使用xinetd,然而最适合的应该是那些常用的网络服务,同时,这个服务的请求数目和频繁程度不会太高。像DNS和Apache就不适合采用这种方式,而像FTP、Telnet、SSH等就适合使用xinetd模式
服务器 | 系统版本 | 处理器位数 | IP |
---|---|---|---|
源服务器 | Ubuntu 17.04 | 64位 | 192.168.4.35 |
目标服务器 | CentOS Linux 7 (Core) | 64位 | 192.168.0.151 |
#SELINUX=enforcing #注释掉
SELINUX=disabled #增加
重启系统
或者
注意:ubuntu下selinux路径与上述的centos7不同,需执行如下命令
vi /etc/selinux/config ,将SELINUX=enforcing改为SELINUX=disabled 后重启机器即可
-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 873 -j ACCEPT #添加到默认的22端口这条规则的下面,如下所示:
\######################################
\# Firewall configuration written by system-config-firewall
\# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state –state NEW -m tcp -p tcp –dport 22 -j ACCEPT
-A INPUT -m state –state NEW -m tcp -p tcp –dport 80 -j ACCEPT
-A INPUT -m state –state NEW -m tcp -p tcp –dport 3306 -j ACCEPT
-A INPUT -j REJECT –reject-with icmp-host-prohibited
-A FORWARD -j REJECT –reject-with icmp-host-prohibited
COMMIT
\#####################################
注意:
我在centos 7下的/etc/sysconfig未找到iptables 只有ip6tables-config ,iptables-config .这是因为centos 7中iptables已不再是默认的防火墙了.可通过
systemctl stop firewalld
systemctl disable firewalld
关闭centos7的防火墙.至于centos 7如何配置端口过滤,请自行百度.本案例是虚拟机装的centos7,用于学习练手,不存在安全的考虑.所以,直接关闭了防火墙,不做配置.
rsync: /usr/bin/rsync /usr/share/man/man1/rsync.1.gz #说明已经安装了
若未安装执行一下命令安装:
port=873
uid=root
gid=root
max connections=36000
use chroot=no
log file=/var/log/rsyncd.log
log format = %t %a %m %f %b
pid file=/var/run/rsyncd.pid
lock file=/var/run/rsyncd.lock
motd file = /etc/rsyncd.motd
timeout = 600
[sync_sms]
path=/usr/local/tomcat-app/webapps/
list=yes
comment =sms sync
ignore errors = yes
read only = no
hosts allow = *
#hosts deny = *
auth users = root
secrets file = /etc/rsyncd.secrets
用户组最好设置为root,不然文件权限同步过去的时候会变化
- secrets file这个是配置同步的密码文件的。
- path是配置同步的目录,
- hosts allow是允许同步的主机,
- hosts deny:拒绝同步的主机
添加如下内容:
root:coolgirl
或者执行
把内容追加到rsync.passwd末尾
然后,更改文件的读写权限为600
检查系统是否已经安装xinetd
xinetd: /usr/sbin/xinetd /etc/xinetd.d /etc/xinetd.conf /usr/share/man/man8/xinetd.8.gz #说明已经安装
否则执行安装
添加如下内容:
service rsync
{
disable =no //使其随xinetd启动而启动
wait =no
socket_type =stream
user =root
server =/usr/bin/rsync
server_args = --daemon #设置成守护进程
log_on_failure += USERID
}
注意:有的系统rsync是不存在的,可以执行上述命令创建并添加.xinetd的配置/etc/xinetd.conf 已配置包含了 /etc/xinetd.d/下的所有配置信息
说明:–daemon 参数表示 启动rsync守护进程
(1)先到sersync官网下载sersync:http://sersync.sourceforge.net/
(2)安装sersync
1>解压
GNU-Linux-x86 #解压后的内容
sersync2.5.4_64bit_binary_stable_final.tar.gz
2>创建sersync的家目录如下:
3>进入sersync解压目录,将内容拷贝到新建的sersync家目录中如下:
4>创建密码文件
密码需和目标服务器配置的一致,且不需要用户名.将该文件的权限也更改为600
5>配置刚刚拷贝过来的config.xml ,路径/usr/local/sersync/conf/config.xml
配置详情介绍,可参照以下示例.
<head version="2.5">
<host hostip="localhost" port="8008">host>
<debug start="false"/>
<fileSystem xfs="false"/>
<filter start="false">
<exclude expression="(.*)\.svn">exclude>
<exclude expression="(.*)\.gz">exclude>
<exclude expression="^info/*">exclude>
<exclude expression="^static/*">exclude>
filter>
<inotify>
<delete start="false"/>
<createFolder start="true"/>
<createFile start="false"/>
<closeWrite start="true"/>
<moveFrom start="true"/>
<moveTo start="true"/>
<attrib start="false"/>
<modify start="true"/>
inotify>
<sersync>
<localpath watch="/home/jing/projects/svn">
<remote ip="192.168.0.151" name="sync_sms"/>
localpath>
<rsync>
<commonParams params="-auvzP"/>
<auth start="true" users="root" passwordfile="/etc/rsync.passwd"/>
<userDefinedPort start="false" port="874"/>
<timeout start="true" time="100"/>
<ssh start="false"/>
rsync>
<failLog path="/usr/local/sersync/log/rsync_fail_log.sh" timeToExecute="60"/>
<crontab start="false" schedule="600">
<crontabfilter start="false">
<exclude expression="*.php">exclude>
<exclude expression="info/*">exclude>
crontabfilter>
crontab>
<plugin start="false" name="command"/>
sersync>
<plugin name="command">
<param prefix="/bin/sh" suffix="" ignoreError="true"/>
<filter start="false">
<include expression="(.*)\.php"/>
<include expression="(.*)\.sh"/>
filter>
plugin>
<plugin name="socket">
<localpath watch="/opt/tongbu">
<deshost ip="192.168.138.20" port="8009"/>
localpath>
plugin>
<plugin name="refreshCDN">
<localpath watch="/data0/htdocs/cms.xoyo.com/site/">
<cdninfo domainname="ccms.chinacache.com" port="80" username="xxxx" passwd="xxxx"/>
<sendurl base="http://pic.xoyo.com/cms"/>
<regexurl regex="false" match="cms.xoyo.com/site([/a-zA-Z0-9]*).xoyo.com/images"/>
localpath>
plugin>
head>
6>创建同步目录:
7>设置环境变量
8>启动sersync
选项-d 表示开启serync并守护进程,-o表示指定配置文件。
重启操作:
9>设置开机启动
源服务器的配置再啰嗦几句.
本人常用登录账号是非root账户,按照上述配置后,启动sersync2要么说是没有这个命令,要么就是日志报错
set the system param
execute:echo 50000000 > /proc/sys/fs/inotify/max_user_watches
sh: 1: cannot create /proc/sys/fs/inotify/max_user_watches: Permission denied
execute:echo 327679 > /proc/sys/fs/inotify/max_queued_events
sh: 1: cannot create /proc/sys/fs/inotify/max_queued_events: Permission denied
提示Permission denied.纠结了很久终于找到了原因.因为我是按照root权限配置,非root账号没有权限访问600权限的配置文件或者密码文件,故报错.解决方案如下:
用sudo给非root赋予超管权限,并将sersync2带全路径启动.
sudo /usr/local/sersync/bin/sersync2 -r -d -o /usr/local/sersync/conf/conf.xml
以此命令启动后,发现日志文件不在提示Permission denied错误,在同步目录下,创建目录
cd /home/jing/projects/svn && sudo mkdir -p data0/www #注意这里创建时也必须用sudo获取超管身份来创建.
发现目标主机实时的创建了相同结构的目录.
此外,为了保险起见,将开机启动设置为如下:
大家可以在刚才源服务器的同步目录 /home/jing/projects/svn下创建文件或目录,看看是否在目标服务器上已做同步.至于,同步的规则,即config.xml的配置详情,是增加,删除,还是定时,这里不做介绍,请自行百度学习,我觉的只要服务器搭好了,这些都是点小问题.
以下提供些参考学习的网站链接
sersyncXML配置:http://www.linuxidc.com/Linux/2012-02/53572p3.htm
http://www.cnblogs.com/sellsa/p/5345092.html
常见错误:http://blog.chinaunix.net/uid-13954085-id-158637.html