本教程实现的是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服务。)
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 |
(1)关闭SELINUX
[root@localhost ~]# vi /etc/sysconfig/selinux
#SELINUX=enforcing #注释掉
SELINUX=disabled #增加
重启系统
或者
[root@localhost ~]# setenforce 0 #临时关闭(不用重启机器)立即生效
注意:ubuntu下selinux路径与上述的centos7不同,需执行如下命令:
[root@localhost ~]# vi /etc/selinux/config
将SELINUX=enforcing改为SELINUX=disabled 后重启机器即可
(2)开启防火墙tcp 873端口(Rsync默认端口)
[root@localhost ~]# vi /etc/sysconfig/iptables #编辑防火墙配置文件
[root@localhost ~] # /etc/init.d/iptables restart #最后重启防火墙使配置生效
注意:我在centos 7下的/etc/sysconfig未找到iptables 只有ip6tables-config ,iptables-config .这是因为centos 7中iptables已不再是默认的防火墙了.可通过:
[root@localhost]# systemctl stop firewalld
[root@localhost]# systemctl disable firewalld
关闭centos7的防火墙.至于centos 7如何配置端口过滤,请自行百度.本案例是虚拟机装的centos7,用于学习练手,不存在安全的考虑.所以,直接关闭了防火墙,不做配置.
(3)检查目标机是否安装rsync
[root@localhost sysconfig]# whereis rsync
rsync: /usr/bin/rsync /usr/share/man/man1/rsync.1.gz #说明已经安装了
若未安装执行一下命令安装:
[root@localhost ~] # yum install rsync
(4)编辑rsync配置文件
[root@localhost sysconfig]# vi /etc/rsyncd.conf #创建配置文件,添加以下代码
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.password
用户组最好设置为root,不然文件权限同步过去的时候会变化
- secrets file这个是配置同步的密码文件的。
- path是配置同步的目录。
- hosts allow是允许同步的主机。
- hosts deny:拒绝同步的主机。
(5)创建rsync传输过程中的认证文件 ,即在secrets file指定的用户密码文件
[root@localhost]# vim /etc/rsyncd.secrets 内容格式:用户名:密码
添加如下内容:
root:coolgirl
或者执行
[root@localhost]# echo user:password >> /etc/rsync.password
把内容追加到rsync.passwd末尾,然后,更改文件的读写权限为600。
[root@localhost]# chmod 600 /etc/rsync.passwd
(6)创建同步目录,即上述rsyncd.conf中[sync_sms]模块下path指定的路径
[root@localhost]# mkdir -p /usr/local/tomcat-app/webapps/
(7)检查并安装xinetd(关于xinetd的介绍,请参照上文)
检查系统是否已经安装xinetd
[root@localhost webapps]# whereis xinetd
xinetd: /usr/sbin/xinetd /etc/xinetd.d /etc/xinetd.conf /usr/share/man/man8/xinetd.8.gz #说明已经安装,否则执行安装:
[root@localhost]# yum -y install xinetd
(8)配置rsync以xinetd方式运行
[root@localhost webapps]# vi /etc/xinetd.d/rsync
添加如下内容:
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/下的所有配置信息。
(9)启动rsync与xinetd服务
[root@localhost ~] # systemctl start xinetd #启动xinetd服务
[root@localhost ~] # systemctl enable xinetd #将xinetd服务加入开机项
[root@localhost ~] # rsync –daemon –config=/etc/rsyncd.conf #加载配置文件rsyncd.conf启动rsync服务
说明:–daemon 参数表示 启动rsync守护进程
(10)配置rsync开机自启动
[root@localhost]# echo rsync --daemon --config=/etc/rsyncd.conf >> /etc/rc.d/rc.local
----------------------------------截止目前,目标服务器已经配置完成了--------------------------------
源服务器配置
(1)先到sersync官网下载sersync,也可选择以下地址下载。
[root@localhost]# wget http://sersync.googlecode.com/files/sersync2.5.4_64bit_binary_stable_final.tar.gz
[root@localhost]# wget https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/sersync/sersync2.5.4_64bit_binary_stable_final.tar.gz
(2)安装sersync
解压:
[root@localhost]# tar -zxvf sersync2.5.4_64bit_binary_stable_final.tar.gz
GNU-Linux-x86 为解压后的内容
(3)创建sersync的家目录如下:
[root@localhost]# mkdir /usr/local/sersync
[root@localhost]# mkdir /usr/local/sersync/conf
[root@localhost]# mkdir /usr/local/sersync/bin
[root@localhost]# mkdir /usr/local/sersync/log
(4)进入sersync解压目录,将内容拷贝到新建的sersync家目录中如下:
[root@localhost]# cd GNU-Linux-x86/
[root@localhost]# cp confxml.xml /usr/local/sersync/conf
[root@localhost]# cp sersync2 /usr/local/sersync/bin
(5)创建密码文件
密码需和目标服务器配置的一致,且不需要用户名.将该文件的权限也更改为600
[root@localhost]# echo coolgirl >> /etc/rsync.password
[root@localhost]# chmod 600 /etc/rsync.password
(6)配置刚刚拷贝过来的config.xml ,路径/usr/local/sersync/conf/config.xml
[root@localhost]# cp config.xml config.xml.bak #配置前提前备份一下
配置详情介绍,可参照以下示例。
(7)创建同步目录
[root@localhost]# mkdir /home/jing/projects/svn
(8)设置环境变量
[root@localhost]# echo export PATH=$PATH:/usr/local/sersync/bin/ >> /etc/profile
[root@localhost]# source /etc/profile
(9)启动sersync
[root@localhost]# sersync2 -r -d -o /usr/local/sersync/conf/confxml.xml
注:选项-d 表示开启serync并守护进程,-o表示指定配置文件。
重启操作:
[root@localhost]# killall sersync2 && sersync2 -r -d -o /usr/local/sersync/conf/confxml.xml
(10)设置开机启动
[root@localhost]# echo sersync2 -r -d -o /usr/local/sersync/conf/confxml.xml >> /etc/rc.local
源服务器的配置再啰嗦几句:
本人常用登录账号是非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带全路径启动。
[root@localhost]# sudo /usr/local/sersync/bin/sersync2 -r -d -o /usr/local/sersync/conf/conf.xml
以此命令启动后,发现日志文件不在提示Permission denied错误,在同步目录下,创建目录:
[root@localhost]# cd /home/jing/projects/svn && sudo mkdir -p data/www #注意这里创建时也必须用sudo获取超管身份来创建.
发现目标主机实时的创建了相同结构的目录.
此外,为了保险起见,将开机启动设置为如下:
[root@localhost]# echo sudo /usr/local/sersync/bin/sersync2 -r -d -o /usr/local/sersync/conf/conf.xml >> /etc/rc.local #超管权限全路径启动
-------------------------------------好,源服务器已经配置完成了-------------------------------------
大家可以在刚才源服务器的同步目录 /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
文章来源:角古静