Heim >Datenbank >MySQL-Tutorial >ehcache集群使用rmi方式有图有真想

ehcache集群使用rmi方式有图有真想

WBOY
WBOYOriginal
2016-06-07 15:59:581933Durchsuche

ehcache 有几种方式集群,rmi,jgroup还有jms;这里讲一下ehcache的使用 ehcache 使用rmi方式复制缓存是可取的,原因如下: 1、rmi是java 默认的远程机制 2、可以调优tcp选项 3、Elements因为要存到磁盘,所以肯定是早已序列化。所以不需要借助xml格式化什么的

ehcache 有几种方式集群,rmi,jgroup还有jms;这里讲一下ehcache的使用

ehcache 使用rmi方式复制缓存是可取的,原因如下:

1、rmi是java 默认的远程机制

2、可以调优tcp选项

3、Elements因为要存到磁盘,所以肯定是早已序列化。所以不需要借助xml格式化什么的

4、通过配置可以通过防火墙

rmi方式集群交互图:

\

Ehcache的rmi方式是一种点对点的协议,因此它会产生很多局域网的内部通信,当然Ehcache会通过一种异步批处复制理机制类解决

如果要配置ehcache 需要配置一下元素

PeerProvider

CacheManagerPeerListener

配置Provider,这里有两种方式:自动发现、手动配置

自动方式:自动发现方式使用tcp广播来建立和包含一个广播组,它的特征是最小配置和对成员组的自动添加和管理。没有那个服务器是有优先级的。对等点每一秒中向广播组发送心跳,如果一个对等点在五秒钟内没发送过来,则此对等点将会被删除,如果有新的,则会被加入集群

cacheManagerPeerProviderFactory 的properties有以下配置:

peerDiscovery=automatic

multicastGroupAddress=230.0.0.1
multicastGroupPort=40001
timeToLive=0-255
hostName=hostname

peerDiscovery 方式:atutomatic 为自动 ;mulicastGroupAddress 广播组地址:230.0.0.1;mulicastGroupPort 广播组端口:40001;timeToLive是指搜索范围:0是同一台服务器,1是同一个子网,32是指同一站点,64是指同一块地域,128是同一块大陆,还有个256,我就不说了;hostName:主机名或者ip,用来接受或者发送信息的接口

在我这次试验中具体如下:

	<cacheManagerPeerProviderFactory
		class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
		properties="peerDiscovery=automatic, multicastGroupAddress=230.0.0.1,
	    multicastGroupPort=4446, timeToLive=32,hostName=192.168.1.101" />

当然还有一种方式就是手动配置,贴上例子,但不作叙述了

server1

<cacheManagerPeerProviderFactory
class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
properties="peerDiscovery=manual,
rmiUrls=//server2:40001/sampleCache11|//server2:40001/sampleCache12"/>
server2
<cacheManagerPeerProviderFactory
		class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
	properties="peerDiscovery=manual,
rmiUrls=//server1:40001/sampleCache11|//server1:40001/sampleCache12"/>

将方式配好之后需要配置listener才会有用,接下来讲讲:Listener

Listener是用来监听从集群发送过来的信息

Listenner有两个属性:class和propertis

class 一个完整的工厂类名

properties 都好分割的对facotory有用的属性

此次实验具体配置如下:

<cacheManagerPeerListenerFactory
		class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"
		properties="hostName=192.168.1.101, port=40001,
socketTimeoutMillis=2000" />
hostName指的是本机,这里注意如果使用的localhost,则只会对本机有效,请使用子网内的ip地址或者主机名,port端口 40001,socketTimeoutMillis是指socket子模块的超时时间,默认是2000ms,注意port两台主机可以相同可以不同。最好相同,个人建议

然后配置缓存的复制 Replicators:

本机配置如下:

<cache name="myCache" maxEntriesLocalHeap="10" eternal="false"
		timeToIdleSeconds="10000" timeToLiveSeconds="10000" overflowToDisk="false">
		<cacheEventListenerFactory
			class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"
			properties="replicateAsynchronously=true, replicatePuts=true, replicateUpdates=true,
							replicateUpdatesViaCopy=false, replicateRemovals=true,asynchronousReplicationIntervalMillis=1000"
							 />
		 <bootstrapCacheLoaderFactory  
                class="net.sf.ehcache.distribution.RMIBootstrapCacheLoaderFactory"/> 
	</cache>
name为cache制定名字,maxEntriesLocalHeap:内存中可驻留最大Element数量,timeToLiveSeconds 生存周期 10000s;overflowToDisk:当内存不足,是否启用磁盘:这里为false;给myCache价格监听,然后是异步方式,在put,update,copy,remove操作是否复制,然后同步时间1s,bootstrapCacheLoaderFactory 工厂是指启动是指一启动就同步数据

以下是完整的配置





	

	<cacheManagerPeerProviderFactory
		class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
		properties="peerDiscovery=automatic, multicastGroupAddress=230.0.0.1,
	    multicastGroupPort=4446, timeToLive=32,hostName=192.168.1.101" />

	

	
		
		  
	

在server2 也就是 192.168.1.116 在hostName配置成此地址,就行了

下面是测试代码

package com.ehcache;

import java.io.IOException;
import java.io.InputStream;

import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheException;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Element;

public class Test2 {
	   public static void main(String[] args) throws InterruptedException {  
		   InputStream is=null;
		CacheManager manager=null;
		try {
			is = Test2.class.getResourceAsStream("/ehcache.xml");
			   manager = CacheManager.newInstance(is);
		} catch (CacheException e1) {
			try {
				if(is!=null){
				is.close();
				is=null;
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
			e1.printStackTrace();
		}
		   
	       Cache cache = manager.getCache("myCache");  
	  
	       Element element = new Element("client3" + System.currentTimeMillis(), "client3");  
	       cache.put(element);  
	       int i=0;
	       while (true)  
	       {  
	    	   Element element2 = new Element("client-3-"+i,i); 
	           cache.put(element2);
	           Thread.sleep(3000);  
	           System.out.println("\n");  
	           for (Object key : cache.getKeys())  
	           {  
	               System.out.println(key + ":" + cache.get(key).getObjectValue());  
	           }  
	           i++;
	       }  
	    }
}

server2 的测试代码将 element那里改成client-2-即可

然后贴上效果图一张:

\

client3 同步到client2的数据了

另外附叙述ehcache的淘汰缓存的算法:

LRU是Least Recently Used 近期最少使用算法;

FIFO 以一种队列方式谁先进谁先出

LFUleast frequently used即最不经常使用页置换算法

这是工程文件的下载地址:点击打开链接

备注:作者水平有限,并且这些配置只在局域网的实践过,如果有错误,请指出。

前面也写了并且试验了局域网内的,负载均衡,tomcat集群,session回话的分离并且双机热备,希望以后有机会让来亲自架构一下大规模的集群。

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn