Ehcacheクラスタ同期
9465 ワード
EhcacheはJavaで作成されたキャッシュフレームワークであり、Javaプロジェクトに直接統合することができ、Redis、Memcacheなどのサービスを別途構築する必要があるキャッシュフレームワークに比べて軽量で、クラスタノードの少ない中小規模プロジェクトに適している.
現在、Ehcacheの主流のクラスタソリューションは主に
クラスタにA,Bの2台のサーバがあると仮定し,ipはそれぞれ
サーバAのコードは、1秒ごとにkey値を更新するための累積1である
サーバBのコードは、1秒ごとにkeyを取得する値である
クラスタ同期が成功すれば、BサーバはAサーバputの値をgetすることができる
RMIとJGROPUPSの2つのスキームは,それぞれ
ここで、
そのうち
手動で構成する方法は、ノードごとに構成が異なり、クラスタ内でノードを追加または削除する場合は、構成を変更する必要があり、複雑です.しかし、自動検出方式は、マルチNICマルチIP、仮想マシン、マルチキャスト禁止などの環境制限では使用できません.
JGROUPSは自動的に発見し、UDPブロードキャストを採用し、すべてのノードの構成は同じである.
ここで、
Bノードの構成はipを以下のように変更するだけでよい.
現在、Ehcacheの主流のクラスタソリューションは主に
RMI
とJGROUPS
である.RMI JAVA JDK RMI , ,
JGROPUPS JAVA , jar ,
クラスタにA,Bの2台のサーバがあると仮定し,ipはそれぞれ
192.168.1.1
と192.168.1.2
である. A - put
public class Ehcache1 {
public static void main(String[] args) {
System.setProperty("java.net.preferIPv4Stack", "true");
System.setProperty("java.net.preferIPv6Addresses", "true");
URL url = Ehcache1.class.getClassLoader().getResource("ehcache.xml");
CacheManager manager = new CacheManager(url);
final Cache cache = manager.getCache("userCache");
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(1);
scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
private final AtomicLong acl = new AtomicLong(1);
@Override
public void run() {
long value = acl.getAndIncrement();
System.out.println(" put,value :" + value);
cache.put(new Element("key", value));
}
}, 1, 1, TimeUnit.SECONDS);
}
}
サーバAのコードは、1秒ごとにkey値を更新するための累積1である
B - get
public class Ehcache2 {
public static void main(String[] args) {
System.setProperty("java.net.preferIPv4Stack", "true");
System.setProperty("java.net.preferIPv6Addresses", "true");
URL url = Ehcache2.class.getClassLoader().getResource("ehcache.xml");
CacheManager manager = new CacheManager(url);
final Cache cache = manager.getCache("userCache");
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(1);
scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
System.out.println(" value:");
Element element = cache.get("key");
if(element!=null){
System.out.println(element.getObjectValue());
}
}
}, 1, 1, TimeUnit.SECONDS);
}
}
サーバBのコードは、1秒ごとにkeyを取得する値である
クラスタ同期が成功すれば、BサーバはAサーバputの値をgetすることができる
RMIとJGROPUPSの2つのスキームは,それぞれ
と
の2つのモードを有する.自動検出モードでは、各ノードはローカルエリアネットワーク内の同じセグメントのノードを自動的に探し、各ノードの構成は同じです.手動構成は,プロファイル内のIPに基づいて対応するクラスタノードを探し,ノードごとに構成が異なる.RMI
ここで、
multicastGroupAddress
はマルチキャストアドレスであり、224.0.1.0
から238.255.255.255
のいずれかのアドレスの範囲のDクラスIPアドレス空間を指定することができる.自動的に発見される方法は、各サーバのプロファイルが同じであり、クラスタに新しいノードが追加されたり、ノードが削除されたりした場合、プロファイルを変更する必要はありません.RMI A
そのうち
rmiUrls
には他のノードのアドレスとcache名が配置され、複数のノードの場合は||
で分割される.rmiUrls=//192.168.1.2:1000/userCache||//192.168.1.3:1000/userCache
cacheManagerPeerListenerFactory
には現在のノードのipとportが構成されており、省略できない.ノードBの構成は、IPを変更すればよく、その他の構成は同じである.
手動で構成する方法は、ノードごとに構成が異なり、クラスタ内でノードを追加または削除する場合は、構成を変更する必要があり、複雑です.しかし、自動検出方式は、マルチNICマルチIP、仮想マシン、マルチキャスト禁止などの環境制限では使用できません.
pom JGROUPS
org.jgroups
jgroups
3.6.9.Final
net.sf.ehcache
ehcache-jgroupsreplication
1.7
JGROUPS
JGROUPSは自動的に発見し、UDPブロードキャストを採用し、すべてのノードの構成は同じである.
JGROUPS A
ここで、
TCPPING(initial_hosts)
は、すべてのノードのip
およびport
情報を構成する.各ノードのbind_addr
およびbind_port
は、本ノードのip
およびport
情報を構成する必要があり、他の構成は同じである.また、bind_addr
とbind_port
の構成は省略できません.そうしないと、同期に失敗する可能性があります.Bノードの構成はipを以下のように変更するだけでよい.
"connect=TCP(bind_addr=192.168.1.2;bind_port=1000)"