1. 概述

本文是一篇 Hazelcast 入门指南,我们将学习如何创建集群成员、使用分布式 Map 在集群节点间共享数据,以及构建 Java 客户端来连接和查询集群中的数据。

2. Hazelcast 是什么?

Hazelcast 是一个面向 Java 的分布式内存数据网格平台。其架构支持集群环境下的高可扩展性和数据分布,具备节点自动发现和智能同步特性。

Hazelcast 提供了不同版本,本教程使用开源版本。它还提供多种功能:

  • ✅ 分布式数据结构
  • ✅ 分布式计算
  • ✅ 分布式查询

本文将重点介绍分布式 Map 的使用。

3. Maven 依赖

Hazelcast 提供了多种库满足不同需求,可在 Maven Central 的 com.hazelcast 组下找到。本文只需核心依赖:

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

最新版本可在 Maven 中央仓库 查看。

4. 第一个 Hazelcast 应用

4.1 创建 Hazelcast 成员

成员(也称节点)会自动加入形成集群。自动加入通过多种发现机制实现。下面创建一个存储分布式 Map 数据的成员:

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

启动 ServerNode 后,控制台会显示类似内容,表示在 JVM 中创建了新节点并加入集群:

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

启动多个 ServerNode 实例即可创建多节点集群。例如再次运行后,控制台显示集群已有两个成员:

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 创建分布式 Map

使用之前创建的 HazelcastInstance 构建分布式 Map(继承自 java.util.concurrent.ConcurrentMap):

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

添加 10 条数据,使用 FlakeIdGenerator 确保键唯一:

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

⚠️ 虽然这不是生产级示例,但展示了分布式 Map 的基本操作。后续会通过客户端访问这些数据。

Hazelcast 内部会对 Map 条目分区并在集群成员间分布复制。更多细节参考官方文档

4.3 创建 Hazelcast Java 客户端

客户端无需加入集群即可执行所有 Hazelcast 操作,只需连接一个集群成员并委托操作:

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

就这么简单粗暴!

4.4 从客户端访问分布式 Map

使用客户端实例访问分布式 Map:

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

现在可以像普通 Map 一样操作,例如遍历条目:

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

5. 配置 Hazelcast

本节介绍如何通过 XML 和 API 配置网络,并使用管理中心监控节点。

启动时,Hazelcast 会按以下顺序查找配置:

  1. 系统属性 hazelcast.config 指定的路径
  2. 工作目录或 classpath 下的 hazelcast.xml
  3. 默认配置 hazelcast-default.xml(hazelcast.jar 内置)

5.1 网络配置

默认使用多播发现成员。若环境不支持多播,可配置 TCP/IP 集群:

XML 配置方式

<?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 API 配置方式

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);

💡 默认会尝试 100 个端口。本例设置起始端口 5701,端口数量 20,则成员加入时会尝试 5701-5721 端口。若需固定端口,设置 auto-increment="false"

5.2 管理中心配置

管理中心可监控集群状态、分析数据结构、更新配置、导出线程堆栈等。

使用方式:

  1. 部署 mancenter-*.war 到应用服务器
  2. 或从命令行启动(下载 Hazelcast ZIP

XML 配置管理中心 URL

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

Java API 配置

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

6. 总结

本文介绍了 Hazelcast 的基础概念。更多细节可参考官方手册。所有示例代码可在 GitHub 获取。


原始标题:An Introduction to Hazelcast

« 上一篇: Ehcache 介绍