2015-10-20 52 views
0

我們目前使用vertx和hazelcast作爲其羣集實現。爲了按照文檔工作,hazelcast嵌入到我們的應用程序中,意味着它將作爲集羣的成員加入。我們希望我們的應用程序獨立於Hazelcast。原因在於,當Hazelcast緩存變得不一致時,我們會關閉所有服務器並重新啓動。相反,我們希望將Hazelcast保留在自己的服務器上,並將vertx作爲客戶端連接,以便我們重新啓動與我們的應用程序服務器無關的hazelcast。 Zookeeper集羣實現完全符合我們的需求,但我們不希望爲此目的維護另一個集羣,因爲我們也將Hazelcast用於其他緩存目的,這些目的是在我們的應用程序內部。目前我們正在做一些這樣的事情來使vertx工作。Hazelcast可以作爲客戶端連接到現有的Hazelcast羣集,而不是作爲羣集的成員加入以實現vertx羣集

 Config hazelcastConfig = new Config(); 

     //Group 
     GroupConfig groupConfig = new GroupConfig(); 
     groupConfig.setName(hzGroupName); 
     groupConfig.setPassword(groupPassword); 
     hazelcastConfig.setGroupConfig(groupConfig); 

     //Properties 
     Properties properties = new Properties(); 
     properties.setProperty("hazelcast.mancenter.enabled", "false"); 
     properties.setProperty("hazelcast.memcache.enabled", "false"); 
     properties.setProperty("hazelcast.rest.enabled", "false"); 
     properties.setProperty("hazelcast.wait.seconds.before.join", "0"); 
     properties.setProperty("hazelcast.logging.type", "jdk"); 
     hazelcastConfig.setProperties(properties); 

     //Network 
     NetworkConfig networkConfig = new NetworkConfig(); 
     networkConfig.setPort(networkPort); 
     networkConfig.setPortAutoIncrement(networkPortAutoincrement); 

     //Interfaces 
     InterfacesConfig interfacesConfig = new InterfacesConfig(); 
     interfacesConfig.setEnabled(true); 
     interfacesConfig.setInterfaces(interfaces); 
     networkConfig.setInterfaces(interfacesConfig); 

     //Join 
     JoinConfig joinConfig = new JoinConfig(); 
     MulticastConfig multicastConfig = new MulticastConfig(); 
     multicastConfig.setEnabled(false); 
     joinConfig.setMulticastConfig(multicastConfig); 
     TcpIpConfig tcpIpConfig = new TcpIpConfig(); 
     tcpIpConfig.setEnabled(true); 
     List<String> members = Arrays.asList(hzNetworkMembers.split(",")); 
     tcpIpConfig.setMembers(members); 
     joinConfig.setTcpIpConfig(tcpIpConfig); 
     networkConfig.setJoin(joinConfig); 

     //Finish Network 
     hazelcastConfig.setNetworkConfig(networkConfig); 
     clusterManager = new HazelcastClusterManager(hazelcastConfig); 


    VertxOptions options = new VertxOptions().setClusterManager(clusterManager); 
    options.setClusterHost(interfaces.get(0)); 
    options.setMaxWorkerExecuteTime(VertxOptions.DEFAULT_MAX_WORKER_EXECUTE_TIME * workerVerticleMaxExecutionTime); 
    options.setBlockedThreadCheckInterval(1000 * 60 * 60); 

    Vertx.clusteredVertx(options, res -> { 
     if (res.succeeded()) { 
      vertx = res.result(); 
     } else { 
      throw new RuntimeException("Unable to launch Vert.x"); 
     } 
    }); 

*********替代的解決方案**********

我們實際上改變了我們的分佈式緩存實現從hazelcast到Redis的(亞馬遜ElastiCache)。

我們之所以選擇依靠榛樹有三個原因。

1)因爲它在服務器重啓過程中的不一致性
2)我們使用的是嵌入式hazelcast,當榛樹數據不一致時我們最終重新啓動了我們的應用程序,我們希望我們的應用程序獨立於其他服務
3)內存分配(hazelcast數據)現在獨立於應用程序服務器

+0

我已添加備用解決方案以發佈我們最終做的 – Mallikarjun

+0

我認爲我的答案在下面解決了您的問題1,2和3.但您必須等待測試拉取請求解決(或做你自己的'vertx-hazelcast'結節)。很高興聽到它在人們活動案例中的效果如何。 –

+0

Vert.x已經發布了3.2.1,並在我的回答中提到了拉取請求,現在您可以使用Hazelcast Smart Clients,如下所述。 –

回答

0

Vertx 3.2.0現在支持將預先配置的Hazelcast實例移交給其構建羣集。因此,您可以完全控制Hazelcast配置,包括數據存儲的方式和位置。但你也需要從Vert.x 3.2.1 release錯誤修復才能真正使用它。

看到https://github.com/vert-x3/vertx-hazelcast/blob/master/src/main/asciidoc/index.adoc#using-an-existing-hazelcast-cluster

注意更新的文檔:當您創建您自己的集羣,你需要有由Vertx所需的額外Hazelcast設置。這些都在上面的文檔中註明。

Vert.x 3.2.1 release修復了阻止使用客戶端連接的問題。請注意,如果您使用Hazelcast客戶端執行分佈式鎖定,則如果網絡連接以服務器節點不明顯的方式停止,則默認超時時間爲60秒,以使鎖定消失(所有其他JVM退出應立即清除一把鎖)。

可以使用降低此數額:

// This is checked every 10 seconds, so any value < 10 will be treated the same 
System.setProperty("hazelcast.client.max.no.heartbeat.seconds", "9"); 

另外要注意,與Hazelcast客戶端,則可能需要使用近緩存一些地圖,並期待在性能調優客戶端,它的行爲等高級配置選項與完整的數據節點不同。

從版本3.2.1開始,您可以使用Vertx所需的地圖設置正確配置其他完整的Hazelcast節點。並開始Vertx(從一個新的單元測試用例拍攝)時則創建自定義Hazelcast客戶:

ClientConfig clientConfig = new ClientConfig().setGroupConfig(new GroupConfig("dev", "dev-pass")); 
HazelcastInstance clientNode1 = HazelcastClient.newHazelcastClient(clientConfig); 

HazelcastClusterManager mgr1 = new HazelcastClusterManager(clientNode1); 
VertxOptions options1 = new VertxOptions().setClusterManager(mgr1).setClustered(true).setClusterHost("127.0.0.1"); 

Vertx.clusteredVertx(options1, ...) 

顯然你的客戶端配置和需求會有所不同。請參閱Hazelcast文檔以獲得客戶端配置:http://docs.hazelcast.org/docs/3.5/manual/html-single/index.html

相關問題