客户端:向哪端同步就哪端就做客户端
服务端:被客户端同步就做服务端

一.客户端:idv-server    192.168.56.144
1.安装rsync,xinetd

yum install rsync xinetd

2.编辑rsync配置文件

vi /etc/xinetd.d/rsync
disable = no

3.创建认证密码文件

vi /etc/passwd.txt
123456

4.授权

chmod 600 /etc/passwd.txt

5.建立源文件夹&测试

mkdir -p /home/uicc/ceshi
rsync -avH --port=873 --progress --delete  /home/uicc/  jiamin@192.168.56.145::uicc --password-file=/etc/passwd.txt    
说明:使用145节点的rsync服务,将144节点的/home/uicc文件夹下的内容,同步到145节点rsync服务下的uicc模块(设置的目录也为/home/uicc/),此时在145节点的/home/uicc/ 目录下也出现了ceshi文件夹

6.实现实时同步

1)查看服务器内核是否支持inotify
  ll /proc/sys/fs/inotify   #列出文件目录,出现下面的内容,说明服务器内核支持inotify
  -rw-r--r-- 1 root root 0 Mar  7 02:17 max_queued_events
  -rw-r--r-- 1 root root 0 Mar  7 02:17 max_user_instances
  -rw-r--r-- 1 root root 0 Mar  7 02:17 max_user_watches
  备注:Linux下支持inotify的内核最小为2.6.13,可以输入命令:uname -a查看内核
2)修改inotify默认参数(inotify默认内核参数值太小)
  sysctl -w fs.inotify.max_queued_events="99999999"
  sysctl -w fs.inotify.max_user_watches="99999999"
  sysctl -w fs.inotify.max_user_instances="65535"
  vi /etc/sysctl.conf #添加以下代码
  fs.inotify.max_queued_events=99999999
  fs.inotify.max_user_watches=99999999
  fs.inotify.max_user_instances=65535
3)安装sersync
   下载:https://sersync.googlecode.com/files/sersync2.5.4_64bit_binary_stable_final.tar.gz
   解压:tar zxvf sersync2.5.4_64bit_binary_stable_final.tar.gz
4)配置sersync
   vi confxml.xml
   修改的地方
   <localpath watch="/home/uicc">
       <remote ip="192.168.56.145" name="uicc"/>
   </localpath>
   <commonParams params="-artuz"/>
   <auth start="true" users="jiamin" passwordfile="/etc/passwd.txt"/>

二.服务端:idv-client  192.168.56.145
1.安装rsync,xinetd

yum install rsync xinetd

2.编辑rsync配置文件

vi /etc/xinetd.d/rsync
disable = no

3.创建编辑rsyncd.conf配置文件

vi /etc/rsyncd.conf
    log file = /var/log/rsyncd.log #日志文件位置,启动rsync后自动产生这个文件,无需提前创建
    pidfile = /var/run/rsyncd.pid  #pid文件的存放位置
    lock file = /var/run/rsync.lock  #支持max connections参数的锁文件
    secrets file = /etc/rsync.pass  #用户认证配置文件,里面保存用户名称和密码,后面会创建这个文件
    motd file = /etc/rsyncd.Motd  #rsync启动时欢迎信息页面文件位置(文件内容自定义)
    [uicc] #自定义名称
    path = /home/uicc/ #rsync被同步到的服务端数据目录路径
    comment = uicc #模块名称与[home_www.osyunwei.com]自定义名称相同
    uid = root #设置rsync运行权限为root
    gid = root #设置rsync运行权限为root
    port=873  #默认端口
    use chroot = no #默认为true,修改为no,增加对目录文件软连接的备份
    read only = no  #设置rsync服务端文件为读写权限
    list = no #不显示rsync服务端资源列表
    max connections = 200 #最大连接数
    timeout = 600  #设置超时时间
    auth users = jiamin #执行数据同步的用户名,可以设置多个,用英文状态下逗号隔开
    hosts allow = 192.168.56.144  #允许进行数据同步的客户端IP地址,可以设置多个,用英文状态下逗号隔开
    hosts deny = 192.168.56.254 #禁止数据同步的客户端IP地址,可以设置多个,用英文状态下逗号隔开

4.创建目录

mkdir /home/uicc/

5.创建编辑用户认证文件

vi /etc/rsync.pass
jiamin:123456

6.设置文件权限

chmod 600 /etc/rsyncd.conf
chmod 600 /etc/rsync.pass

7.启动rsync

/etc/init.d/xinetd start  #启动
service xinetd stop   #停止
service xinetd restart  #重新启动

三.Java调用

package com.luckmin.test.demo;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import com.github.fracpete.rsync4j.RSync;
import com.github.fracpete.processoutput4j.core.StreamingProcessOutputType;
import com.github.fracpete.processoutput4j.core.StreamingProcessOwner;
import com.github.fracpete.processoutput4j.output.StreamingProcessOutput;

public class RsyncTest {

	public static class Output implements StreamingProcessOwner {
		RSync rsync = null;

		public Output(RSync rsync) {
			this.rsync = rsync;
		}

		public StreamingProcessOutputType getOutputType() {
			return StreamingProcessOutputType.BOTH;
		}

		public void processOutput(String line, boolean stdout) {
			System.out.println((stdout ? "[OUT] " : "[ERR] ") + line);
			if(line.indexOf("%")!=-1){ 
			  String pbar = line.substring(16,21).trim();
			  System.out.println(pbar); 
			}
		}
	}

	public static void main(String[] args) throws Exception {
		RSync rsync = new RSync();
		List<String> sourceList = new ArrayList<String>();
		sourceList.add("D:\\rsync\\test1.zip");
		sourceList.add("D:\\rsync\\test2.zip");
		sourceList.add("D:\\rsync\\test3.zip");
		rsync.sources(sourceList);
		rsync.destination("rsync://jiamin@192.168.56.145:873/uicc");
		rsync.passwordFile("D:\\passwd.txt");
		rsync.archive(true);
		rsync.recursive(true);
		rsync.verbose(true);
		rsync.progress(true);
		rsync.partial(true);
		rsync.compress(true);
		rsync.delete(true);
		rsync.humanReadable(true);
		rsync.outputCommandline(true);
		StreamingProcessOutput output = new StreamingProcessOutput(new Output(rsync));
		output.monitor(rsync.builder());
		TimeUnit.SECONDS.sleep(5);
	}

}