Ehcacheクラスタ同期

9465 ワード

EhcacheはJavaで作成されたキャッシュフレームワークであり、Javaプロジェクトに直接統合することができ、Redis、Memcacheなどのサービスを別途構築する必要があるキャッシュフレームワークに比べて軽量で、クラスタノードの少ない中小規模プロジェクトに適している.
現在、Ehcacheの主流のクラスタソリューションは主にRMIJGROUPSである.
  • RMI JAVA JDK RMI , ,
  • JGROPUPS JAVA , jar ,

  • クラスタにA,Bの2台のサーバがあると仮定し,ipはそれぞれ192.168.1.1192.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_addrbind_portの構成は省略できません.そうしないと、同期に失敗する可能性があります.
    Bノードの構成はipを以下のように変更するだけでよい.
    "connect=TCP(bind_addr=192.168.1.2;bind_port=1000)"