1. 概要

これはHazelcastの紹介記事で、クラスターメンバーの作成方法、クラスターノード間でデータを共有するための分散 Map 、および集まる。

2. ヘーゼルキャストとは何ですか?

Hazelcastは、Java用の分散型インメモリデータグリッドプラットフォームです。 このアーキテクチャは、クラスター環境での高いスケーラビリティとデータ分散をサポートします。 ノードの自動検出とインテリジェントな同期をサポートします。

Hazelcastは、さまざまなエディションで利用できます。 すべてのHazelcastエディションの機能を確認するには、次のリンクを参照してください。 このチュートリアルでは、オープンソース版を使用します。

同様に、Hazelcastは、分散データ構造、分散コンピューティング、分散クエリなどのさまざまな機能を提供します。 この記事では、分散型マップに焦点を当てます。

3. Mavenの依存関係

Hazelcastは、さまざまな要件に対処するためのさまざまなライブラリを提供しています。 それらは、MavenCentralのcom.hazelcastグループにあります。

ただし、この記事では、スタンドアロンのHazelcastクラスターメンバーとHazelcastJavaクライアントを作成するために必要なコア依存関係のみを使用します。

<dependency>
    <groupId>com.hazelcast</groupId>
    <artifactId>hazelcast</artifactId>
    <version>4.0.2</version>
</dependency>

現在のバージョンは、Maven中央リポジトリで入手できます。

4. 最初のヘーゼルキャストアプリケーション

4.1. Hazelcastメンバーを作成する

メンバー(ノードとも呼ばれます)は自動的に結合してクラスターを形成します。 この自動結合は、メンバーがお互いを見つけるために使用するさまざまな検出メカニズムで行われます。

Hazelcast分散マップにデータを格納するメンバーを作成しましょう。

public class ServerNode {
    
    HazelcastInstance hzInstance = Hazelcast.newHazelcastInstance();
    ...
}

ServerNode アプリケーションを起動すると、コンソールに流れるテキストが表示されます。これは、クラスターに参加する必要がある新しいHazelcastノードをJVMに作成することを意味します。

Members [1] {
    Member [192.168.1.105]:5701 - 899898be-b8aa-49aa-8d28-40917ccba56c this
}

複数のノードを作成するには、ServerNodeアプリケーションの複数のインスタンスを開始できます。 その結果、Hazelcastは自動的に新しいメンバーを作成し、クラスターに追加します。

たとえば、 ServerNode アプリケーションを再度実行すると、コンソールに次のログが表示され、クラスターに2つのメンバーが存在することが示されます。

Members [2] {
  Member [192.168.1.105]:5701 - 899898be-b8aa-49aa-8d28-40917ccba56c
  Member [192.168.1.105]:5702 - d6b81800-2c78-4055-8a5f-7f5b65d49f30 this
}

4.2. 分散マップを作成します

次に、分散型を作成しましょう地図。 のインスタンスが必要です HazelcastInstance 分散型を構築するために以前に作成された地図伸びる java.util.concurrent.ConcurrentMap インターフェース。

Map<Long, String> map = hazelcastInstance.getMap("data");
...

最後に、マップにいくつかのエントリを追加しましょう。

FlakeIdGenerator idGenerator = hazelcastInstance.getFlakeIdGenerator("newid");
for (int i = 0; i < 10; i++) {
    map.put(idGenerator.newId(), "message" + i);
}

上記のように、mapに10個のエントリを追加しました。 FlakeIdGenerator を使用して、マップの一意のキーを確実に取得しました。 FlakeIdGenerator の詳細については、次のリンクを確認してください。

これは実際の例ではないかもしれませんが、分散マップに適用できる多くの操作の1つを示すためにのみ使用しました。 後で、クラスターメンバーによって追加されたエントリをHazelcastJavaクライアントから取得する方法を説明します。

内部的に、Hazelcastはマップエントリを分割し、クラスタメンバー間でエントリを分散および複製します。 Hazelcast Map の詳細については、次のリンクを確認してください。

4.3. HazelcastJavaクライアントを作成する

Hazelcastクライアントを使用すると、クラスターのメンバーでなくても、すべてのHazelcast操作を実行できます。 クラスタメンバーの1つに接続し、クラスタ全体のすべての操作をそのメンバーに委任します。

ネイティブクライアントを作成しましょう:

ClientConfig config = new ClientConfig();
config.setClusterName("dev");
HazelcastInstance hazelcastInstanceClient = HazelcastClient.newHazelcastClient(config);

それは簡単です。

4.4. Javaクライアントから分散マップにアクセス

次に、前に作成した HazelcastInstance のインスタンスを使用して、分散Mapにアクセスします。

Map<Long, String> map = hazelcastInstanceClient.getMap("data");
...

これで、クラスターのメンバーでなくても、マップで操作を実行できます。 たとえば、エントリを繰り返し処理してみましょう。

for (Entry<Long, String> entry : map.entrySet()) {
    ...
}

5. Hazelcastの構成

このセクションでは、宣言型(XML)およびプログラム型(API)を使用してHazelcastネットワークを構成し、Hazelcast管理センターを使用して実行中のノードを監視および管理する方法に焦点を当てます。

Hazelcastの起動中に、hazelcast.configシステムプロパティを探します。 設定されている場合、その値がパスとして使用されます。 それ以外の場合、Hazelcastは作業ディレクトリまたはクラスパスでhazelcast.xmlファイルを検索します。

上記のいずれも機能しない場合、Hazelcastはデフォルト構成をロードします。 hazelcast.jarに付属するhazelcast-default.xml

5.1. ネットワーク設定

デフォルトでは、Hazelcastは、クラスターを形成できる他のメンバーを検出するためにマルチキャストを使用します。 マルチキャストが環境で推奨される検出方法ではない場合は、完全なTCP/IPクラスター用にHazelcastを構成できます。

宣言型構成を使用してTCP/IPクラスターを構成しましょう。

<?xml version="1.0" encoding="UTF-8"?>
<hazelcast xmlns="http://www.hazelcast.com/schema/config"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.hazelcast.com/schema/config
                               http://www.hazelcast.com/schema/config/hazelcast-config-4.0.xsd";
    <network>
        <port auto-increment="true" port-count="20">5701</port>
        <join>
            <multicast enabled="false"/>
            <tcp-ip enabled="true">
                <member>machine1</member>
                <member>localhost</member>
            </tcp-ip>
        </join>
    </network>
</hazelcast>

または、Java構成アプローチを使用することもできます。

Config config = new Config();
NetworkConfig network = config.getNetworkConfig();
network.setPort(5701).setPortCount(20);
network.setPortAutoIncrement(true);
JoinConfig join = network.getJoin();
join.getMulticastConfig().setEnabled(false);
join.getTcpIpConfig()
  .addMember("machine1")
  .addMember("localhost").setEnabled(true);

デフォルトでは、Hazelcastは100個のポートをバインドしようとします。 上記の例では、ポートの値を5701に設定し、ポート数を20に制限すると、メンバーがクラスターに参加しているときに、Hazelcastは5701と5721の間のポートを見つけようとします。

ポートを1つだけ使用する場合は、auto-incrementfalseに設定して自動インクリメント機能を無効にできます。

5.2. 管理センターの構成

管理センターでは、クラスターの全体的な状態を監視できます。また、データ構造を詳細に分析および参照したり、マップ構成を更新したり、ノードからスレッドダンプを取得したりすることもできます。

Hazelcast管理センターを使用するには、mancenter-versionwarアプリケーションをJavaアプリケーションサーバー/コンテナーにデプロイするか、コマンドラインからHazelcastManagementCenterを起動します。 最新のHazelcastZIPは、hazelcast.orgからダウンロードできます。 ZIPには、mancenter-versionwarファイルが含まれています。

WebアプリケーションのURLをhazelcast.xml に追加して、Hazelcastノードを構成し、Hazelcastメンバーに管理センターと通信させることができます。

それでは、宣言型構成を使用して管理センターを構成しましょう。

<management-center enabled="true">
    http://localhost:8080/mancenter
</management-center>

同様に、プログラムによる構成は次のとおりです。

ManagementCenterConfig manCenterCfg = new ManagementCenterConfig();
manCenterCfg.setEnabled(true).setUrl("http://localhost:8080/mancenter");

6. 結論

この記事では、Hazelcastに関する入門的な概念について説明しました。 詳細については、リファレンスマニュアルをご覧ください。

いつものように、この記事のすべてのコードは、GitHubから入手できます。