这是本节的多页打印视图。 .
HugeGraph (OLTP)
DeepWiki 提供实时更新的项目文档,内容更全面准确,适合快速了解项目最新情况。
GitHub 访问: https://github.com/apache/hugegraph
1 - HugeGraph Server 快速开始
1 HugeGraph Server 概述
apache/hugegraph 是 HugeGraph 图数据库的主仓库,包含 hugegraph-server、hugegraph-pd、hugegraph-store 等一级模块。本页介绍其中的 hugegraph-server 模块及其运行服务。
hugegraph-server 模块包含 hugegraph-core、hugegraph-api、hugegraph-dist 和存储适配等子模块。Core 实现属性图模型、事务与 TinkerPop 接口,API 提供 HTTP 服务并将客户端请求交给 Core 处理。图数据由 RocksDB(单机默认)、HStore(分布式)或 HBase 后端保存。
⚠️ 版本说明:本文以 HugeGraph 1.7.0 至
master分支的代码为参考,仅介绍 RocksDB、HStore 和 HBase。其他旧后端的使用与配置请参考 HugeGraph 1.5.x 文档。
名称说明:
HugeGraph表示整个项目或主仓库,hugegraph-server表示仓库中的 Server 模块,HugeGraphServer是服务进程的 Java 类名。下文的 Server 服务指运行中的图数据库服务。
2 依赖
2.1 安装 Java 11 (JDK 11)
HugeGraph 1.7.0 中的 hugegraph-server 模块使用 Java 11 编译,运行和源码构建均需使用 Java 11 或更高版本。
在继续阅读前,请先执行 java -version 命令确认 JDK 版本。
1.7.0 起不再支持 Java 8。
bin/hugegraph-server.sh在低于 Java 11 的环境下会直接拒绝启动。
安全检查默认开启,会安装
HugeSecurityManager,它要求 Java 11 到 23。JDK 24 移除了 Security Manager(JEP 486),因此在 Java 24 及更高版本上必须关闭该检查后再启动服务:bin/start-hugegraph.sh -s false。
源码构建还需要 Maven 3.5.0 或更高版本。
3 部署
有四种方式可以部署 Server 服务:
- 方式 1:使用 Docker 容器 (便于测试)
- 方式 2:下载 tar 包
- 方式 3:源码编译
- 方式 4:使用 tools 工具部署 (Outdated)
不要把 Gremlin、Cypher 等查询接口直接暴露到公网。生产环境应启用认证与授权,限制网络访问并保留审计日志;部署建议见安全指南。
3.1 使用 Docker 容器 (便于测试)
可参考 Docker 部署方式。
可以使用 docker run -itd --name=server -p 8080:8080 -e PASSWORD=xxx hugegraph/hugegraph:1.7.0 快速启动一个使用 RocksDB 后端的 Server 实例。
可选项:
- 可以使用
docker exec -it server bash进入容器执行运维或调试操作。 - 可以使用
docker run -itd --name=server -p 8080:8080 -e PRELOAD="true" hugegraph/hugegraph:1.7.0在启动时预加载一个内置样例图。可通过RESTful API进行验证,具体步骤可参考 5.1.4。 - 可以使用
-e PASSWORD=xxx开启鉴权模式并设置 admin 密码,具体步骤可参考 Config Authentication。
如果使用 Docker Desktop,则可以按如下方式设置相关选项:

注意:Docker Compose 文件使用桥接网络(
hg-net),适用于 Linux 和 Mac(Docker Desktop)。如需运行 3 节点分布式集群,请为 Docker Desktop 分配至少 12 GB 内存(设置 → 资源 → 内存)。Linux 上 Docker 直接使用宿主机内存。
如果希望通过一个配置文件统一管理 HugeGraph 的多个服务实例,则可以使用 docker compose。
docker/ 目录下提供了四个 compose 文件:
| 拓扑 | compose 文件 | 服务 |
|---|---|---|
| 单机(推荐从这里开始) | docker-compose.yml | 1 个 RocksDB Server + 1 个 Hubble |
| 最小 HStore | docker-compose-hstore.yml | 1 PD + 1 Store + 1 Server + 1 Hubble |
| HA 参考 | docker-compose-3pd-3store-3server.yml | 3 PD + 3 Store + 3 Server + 1 Hubble |
| 最小 HStore 拓扑的源码构建覆盖文件 | docker-compose.dev.yml | (需与 docker-compose-hstore.yml 一起使用) |
单机拓扑将 Server 暴露在 8080 端口,Hubble 暴露在 127.0.0.1:8088。HUGEGRAPH_VERSION 决定 Server、PD 和 Store 的镜像 tag,Hubble 由 HUBBLE_IMAGE 单独选择。
compose 文件从 HUGEGRAPH_ADMIN_PASSWORD 读取管理员密码,从 HUGEGRAPH_AUTH_TOKEN_SECRET 读取 JWT 密钥,通常放在 docker/.env 文件中。HUGEGRAPH_ADMIN_PASSWORD 非空即开启鉴权,Hubble 会自动识别该模式。若直接使用 docker run,则改为传入 -e PASSWORD=xxx。
完整的部署指南请参阅 docker/README.md。
注意:
HugeGraph 的 Docker 镜像主要用于便捷地快速启动 HugeGraph,并不是 ASF 官方发布物料包。你可以从 ASF Release Distribution Policy 中了解更多细节。
推荐使用
release tag(如1.7.0/1.x.0) 以获取稳定版。使用latesttag 可以使用开发中的最新功能。
3.2 下载 tar 包
3.3 源码编译
源码编译前请确保本机有安装 wget/curl 命令
下载 HugeGraph 源代码
编译打包生成 tar 包
构建成功时日志中会出现:
执行成功后,在 hugegraph 目录下生成 *hugegraph-*.tar.gz 文件,就是编译生成的 tar 包。
默认构建会打包 rocksdb、hbase 和 hstore 三个后端模块,并把它们记录在 hugegraph-dist jar 内的 backend.properties 资源的 backends 配置项中。若只需要包含 RocksDB 的精简发布包,可加上 -Drocksdb-only:
3.4 使用 tools 工具部署 (Outdated)
HugeGraph-Tools 提供一键部署命令,可以下载、解压、配置并启动 Server 服务和 HugeGraph-Hubble。HugeGraph-Toolchain 发布包中已包含这些工具。
注:
${version}为版本号,最新版本号可参考 Download 页面,或直接从 Download 页面点击链接下载
HugeGraph-Tools 的总入口脚本是 bin/hugegraph,用户可以使用 help 子命令查看其用法,这里只介绍一键部署的命令。
{hugegraph-version} 表示要部署的 Server 服务及 HugeGraphStudio 版本,可在 conf/version-mapping.yaml 中查看版本信息。{install-path} 指定安装目录,{download-path-prefix} 可选,用于指定 tar 包下载地址。例如部署 0.6 版本时,可以执行 bin/hugegraph deploy -v 0.6 -p services。
4 配置
如果需要快速启动 HugeGraph 仅用于测试,那么只需要进行少数几个配置项的修改即可(见下一节)。
5 启动
5.1 使用启动脚本启动
启动流程分为首次启动和非首次启动两种情况。首次启动前需要先初始化后端数据库,然后再启动服务。
如果服务曾被手动停止,或因其他原因需要再次启动,由于后端数据库已持久化存在,通常可以直接启动服务。
HugeGraphServer 启动时会连接后端存储并检查其版本信息。如果后端尚未初始化,或者已初始化但版本不匹配(例如存在旧版本数据),HugeGraphServer 会启动失败并给出错误信息。
如果需要外部访问 HugeGraphServer,请修改 rest-server.properties 的 restserver.url 配置项(默认为 http://127.0.0.1:8080),修改成机器名或 IP 地址。
由于各种后端所需的配置(hugegraph.properties)及启动步骤略有不同,下面逐一对各后端的配置及启动做介绍。
注: 如果想要开启 HugeGraph 权限系统,在启动 Server 之前应按照 Server 鉴权配置 进行配置。(尤其是生产环境/外网环境须开启)
5.1.1 分布式存储 (HStore)
分布式存储是 HugeGraph 1.5.0 之后推出的新特性,它基于 HugeGraph-PD 和 HugeGraph-Store 组件实现了分布式的数据存储和计算。
要使用分布式存储引擎,需要先部署 HugeGraph-PD 和 HugeGraph-Store,详见 HugeGraph-PD 快速入门 和 HugeGraph-Store 快速入门。
确保 PD 和 Store 服务均已启动后
- 修改 Server 服务的
hugegraph.properties配置:
发布包中自带该后端的模板文件 conf/graphs/hstore.properties.template,可将其复制覆盖 conf/graphs/hugegraph.properties 后修改 pd.peers。
任务调度器由后端决定,无需配置 task.scheduler_type:hstore 使用分布式调度器,其余后端使用本地调度器。为兼容旧配置,该键仍可存在,但会被忽略并打印一条警告日志。
- 修改 Server 服务的
rest-server.properties配置:
如果配置多个 Server 节点,需要为每个节点修改 rest-server.properties 配置文件,例如:
节点 1(主节点):
节点 2(工作节点):
同时,还需要修改每个节点的 gremlin-server.yaml 中的端口配置:
节点 1:
节点 2:
启动 Server:
使用分布式存储引擎的启动顺序为:
- 启动 HugeGraph-PD
- 启动 HugeGraph-Store
- 启动 Server 服务
HStore 的元数据和存储由 PD、Store 管理,init-store 会跳过该后端。开启鉴权时,执行 init-store 仍会创建内置的 admin 账号。如果该账号已由存储侧持有,可在 rest-server.properties 中设置 init_store.enabled=false 以整体跳过这一步,Docker 的 HStore 拓扑即采用这种方式。
验证服务是否正常启动:
停止服务的顺序应该与启动顺序相反:
- 停止 Server 服务
- 停止 HugeGraph-Store
- 停止 HugeGraph-PD
Docker 分布式集群
通过 Docker-Compose 运行完整的分布式集群(3 PD + 3 Store + 3 Server):
服务通过 hg-net 桥接网络上的容器主机名进行通信。配置通过环境变量注入:
该拓扑设置了 HG_SERVER_REQUIRE_AUTH_TOKEN_SECRET: "true",因此在只提供密码而没有共享 JWT 密钥时 Server 会拒绝启动。启动前请在 docker/.env 中同时写入 HUGEGRAPH_ADMIN_PASSWORD 和 HUGEGRAPH_AUTH_TOKEN_SECRET。完整的变量说明见 Docker 集群指南。
验证集群:
运行时日志可通过 docker logs <container-name>(如 docker logs hg-pd0)直接查看,无需进入容器。
完整的环境变量参考、端口表和故障排查指南请参阅 docker/README.md。
5.1.2 RocksDB / ToplingDB
以下从本地 properties 文件启动图的示例要求在 conf/rest-server.properties 中设置:
当前源码默认值是 false,上游发布模板尚未写出该选项。
RocksDB 是一个嵌入式的数据库,不需要手动安装部署,要求 GCC 版本 >= 4.3.0(GLIBCXX_3.4.10),如不满足,需要提前升级 GCC
修改 hugegraph.properties
初始化数据库(第一次启动时或在 conf/graphs/ 下手动添加了新配置时需要进行初始化)
启动 server
提示的 url 与 rest-server.properties 中配置的 restserver.url 一致
ToplingDB (Beta): 作为 RocksDB 的高性能替代方案,配置方式请参考: ToplingDB Quick Start
5.1.3 HBase
5.1.4 启动 server 的时候创建示例图
在启动脚本时携带 -p true 参数,表示开启 preload,即创建示例图。
并且使用 RESTful API 请求 HugeGraphServer 得到如下结果:
代表创建示例图成功。
5.1.5 启动脚本的参数
bin/start-hugegraph.sh 支持以下参数。每个参数都需要带值,即写作 -d false,不能只写 -d。
| 参数 | 取值 | 默认值 | 作用 |
|---|---|---|---|
-d | true、false | true | 守护进程模式。-d false 时脚本留在前台,并把 SIGTERM/SIGINT 转发给服务进程 |
-g | zgc 或 ZGC | 不填则用 G1GC | 选择垃圾回收器。只接受 ZGC,其他取值会直接终止启动;ZGC 需要 Java 11 及以上 |
-m | true、false | false | 安装基于 crontab 的监控任务(bin/start-monitor.sh),仅用于虚拟机和物理机部署 |
-p | true、false | false | 预加载示例图,见 5.1.4 |
-s | true、false | true | 开启安全检查(HugeSecurityManager)。要求 Java 11 到 23,且 conf/java-security.properties 可读 |
-j | JVM 参数 | 空 | 追加到服务命令行的额外 JVM 参数 |
-t | 秒 | 30 | 判定启动失败前等待服务响应的时长 |
-y | true、false | false | 开启 OpenTelemetry agent 上报链路追踪 |
bin/stop-hugegraph.sh 支持 -m true|false(默认 true),用于控制停止服务时是否同时移除 crontab 监控任务。
5.2 使用 Docker
在 3.1 使用 Docker 容器 中,我们已经介绍了如何使用 docker 部署 Server 服务。还可以通过切换后端存储或设置参数,在 Server 启动时加载样例图。
5.2.1 启动 server 的时候创建示例图
在 Docker 启动时设置环境变量 PRELOAD=true,即可在启动脚本执行过程中加载样例数据。
使用
docker run使用
docker run -itd --name=server -p 8080:8080 -e PRELOAD=true hugegraph/hugegraph:1.7.0使用
docker-compose创建
docker-compose.yml,具体文件如下,在环境变量中设置 PRELOAD=true。其中,example.groovy是一个预定义的脚本,用于预加载样例数据。如果有需要,可以通过挂载新的example.groovy脚本改变预加载的数据。使用命令
docker compose up -d启动容器
使用 RESTful API 请求 HugeGraphServer 得到如下结果:
代表创建示例图成功。
6 访问 Server
6.1 服务启动状态校验
jps 查看服务进程
curl 请求 RESTful API
返回结果 200,代表 server 启动正常
6.2 请求 Server
HugeGraphServer 的 RESTful API 包括多种类型的资源,典型的包括 graph、schema、gremlin、traverser 和 task
graph包含vertices、edgesschema包含vertexlabels、propertykeys、edgelabels、indexlabelsgremlin包含各种Gremlin语句,如g.v(),可以同步或者异步执行traverser包含各种高级查询,包括最短路径、交叉点、N 步可达邻居等task包含异步任务的查询和删除
6.2.1 获取 hugegraph 的顶点及相关属性
说明
由于图的点和边很多,对于 list 型的请求,比如获取所有顶点,获取所有边等,Server 会将数据压缩再返回,所以使用 curl 时得到一堆乱码,可以重定向至
gunzip进行解压。推荐使用 Chrome 浏览器 + Restlet 插件发送 HTTP 请求进行测试。当前 HugeGraphServer 的默认配置只能是本机访问,可以修改配置,使其能在其他机器访问。
响应体如下:
详细的 API 请参考 RESTful-API 文档。
另外也可以通过访问 localhost:8080/swagger-ui/index.html 查看 API。

在使用 Swagger UI 调试 HugeGraph 提供的 API 时,如果 HugeGraph Server 开启了鉴权模式,可以在 Swagger 页面输入鉴权信息。

当前 HugeGraph 支持基于 Basic 和 Bearer 两种形式设置鉴权信息。

7 停止 Server
8 使用 IntelliJ IDEA 调试 Server
2 - HugeGraph-PD Quick Start
1 HugeGraph-PD 概述
HugeGraph-PD(Placement Driver)是 HugeGraph 分布式版本的元数据管理组件,负责管理图数据的分布和存储节点的协调。它在分布式 HugeGraph 中扮演着核心角色,维护集群状态并协调 HugeGraph-Store 存储节点。
PD 将集群元数据保存在 pd.data-path 下的内嵌 RocksDB 中,并通过 Raft 在各 PD 节点之间复制,因此 3 节点或 5 节点的 PD 集群在少数节点宕机时仍可继续提供服务。在此基础上,PD 还负责注册和激活 Store 节点、分配与再平衡分区、跟踪 Store 心跳,并响应来自 Store 和 Server 的服务发现请求。
PD 监听三个端口:
| 端口 | 默认值 | 配置项 | 使用方 |
|---|---|---|---|
| gRPC | 8686 | grpc.port | Store 和 Server 客户端 |
| REST | 8620 | server.port | 管理接口、健康检查、监控指标 |
| Raft | 8610 | raft.address | 仅其他 PD 节点 |
2 依赖
2.1 前置条件
- 操作系统:Linux 或 macOS(Windows 尚未经过完整测试)
- Java 版本:≥ 11
- Maven 版本:≥ 3.5.0
3 部署
有两种方式可以部署 HugeGraph-PD 组件:
- 方式 1:下载 tar 包
- 方式 2:源码编译
3.1 下载 tar 包
从 Apache HugeGraph 官方下载页面下载最新版本的 HugeGraph-PD:
3.2 源码编译
只编译 PD 发布包及其依赖模块:
解压后的发布目录只包含三个子目录:bin(启停脚本)、conf(application.yml、application.yml.template、log4j2.xml、verify-license.json)和 lib(hg-pd-service jar 包)。
3.3 Docker 部署
HugeGraph-PD Docker 镜像已发布在 Docker Hub,镜像名为 hugegraph/pd。
注: 后续步骤皆假设你本地已拉取
hugegraph主仓库代码 (至少是 docker 目录)
使用 docker-compose 模式部署完整的 3 节点集群(PD + Store + Server):
单 PD、单 Store、单 Server 的最小拓扑对应 docker-compose-hstore.yml。
通过 docker run 运行单个 PD 节点时,通过环境变量提供配置:
环境变量参考:
| 变量 | 必填 | 默认值 | 对应配置项 | 描述 |
|---|---|---|---|---|
HG_PD_GRPC_HOST | 是 | 无 | grpc.host | 本节点的 gRPC 主机名/IP(Docker 中使用 pd0,裸机使用 192.168.1.10) |
HG_PD_RAFT_ADDRESS | 是 | 无 | raft.address | 本节点的 Raft 地址(如 pd0:8610) |
HG_PD_RAFT_PEERS_LIST | 是 | 无 | raft.peers-list | 所有 PD 节点的 Raft 地址(如 pd0:8610,pd1:8610,pd2:8610) |
HG_PD_INITIAL_STORE_LIST | 是 | 无 | pd.initial-store-list | 预期的 Store gRPC 地址(如 store0:8500,store1:8500,store2:8500) |
HG_PD_GRPC_PORT | 否 | 8686 | grpc.port | gRPC 服务端口 |
HG_PD_REST_PORT | 否 | 8620 | server.port | REST API 端口 |
HG_PD_DATA_PATH | 否 | /hugegraph-pd/pd_data | pd.data-path | 元数据存储路径 |
HG_PD_INITIAL_STORE_COUNT | 否 | 1 | pd.initial-store-count | 集群可用所需的最小 Store 数量 |
缺少上述四个必填变量中的任意一个时,entrypoint 会拒绝启动。它把这些值转换成 SPRING_APPLICATION_JSON 覆盖项,因此无需修改镜像内的 conf/application.yml;未被 HG_PD_* 变量覆盖的配置项仍沿用该文件中的值。JAVA_OPTS 会透传给 JVM。
注意:在 Docker 桥接网络中,
HG_PD_GRPC_HOST和HG_PD_RAFT_ADDRESS应使用容器主机名(如pd0)而非 IP 地址。
已弃用的别名:
GRPC_HOST、RAFT_ADDRESS、RAFT_PEERS、PD_INITIAL_STORE_LIST仍可使用,但会输出弃用警告。新部署请使用HG_PD_*名称。
镜像内置 HEALTHCHECK,每 15 秒探测 8620 端口上的 GET /v1/health,启动宽限期 90 秒、重试 3 次,因此 docker ps 能反映真实的 PD 健康状态。entrypoint 以 -d false 调用启动脚本,容器进程就是 Java 进程本身,Java 退出时容器随之退出并触发 Docker 的重启策略。镜像还设置了 STDOUT_MODE=true,因此运行时日志可通过 docker logs <container-name>(如 docker logs hg-pd0)直接查看,无需进入容器。
完整的集群部署指南请参阅 docker/README.md。
4 配置
PD 的主要配置文件为 conf/application.yml,以下是发布包中自带的内容:
conf/application.yml.template 是另一份带占位符($GRPC_PORT$、$RAFT_ADDRESS$ 等)的副本,供自动生成配置的部署工具使用,PD 本身不读取它。启动脚本通过 -Dspring.config.location 指定的始终是 conf/application.yml。
4.1 配置项参考
conf/application.yml 中未出现的配置项会回退到下表的内置默认值;没有内置默认值的配置项必须存在,否则 PD 无法启动。
gRPC 与 REST
| 配置项 | 发布包中的值 | 内置默认值 | 描述 |
|---|---|---|---|
grpc.host | 127.0.0.1 | 无,必填 | 本 PD 对外公布的 gRPC 地址。Store 和 Server 会连到这个地址,因此分布式部署时必须填可访问的 IPv4 地址或主机名,不能用 127.0.0.1 或 0.0.0.0。 |
grpc.port | 8686 | 无,必填 | gRPC 端口。 |
server.port | 8620 | 无,必填 | REST API 端口,同时也是 Raft 成员信息中公布的 REST 端口。 |
application.yml.template 中还有 grpc.netty-server.max-inbound-message-size: 100MB,但 PD 在代码中把 gRPC 服务端的入站消息上限固定为 1 GB,该配置项实际不生效。
Raft
| 配置项 | 发布包中的值 | 内置默认值 | 描述 |
|---|---|---|---|
raft.address | 127.0.0.1:8610 | 无,必填 | 本节点的 Raft 地址,格式为 host:port。每个节点必须不同,且必须出现在 raft.peers-list 中。 |
raft.peers-list | 127.0.0.1:8610 | 无,必填 | 逗号分隔的全部 PD 节点 Raft 地址(含本节点)。所有节点上必须完全一致。 |
raft.enable | 未设置 | true | 为 true 时元数据写入经过 Raft 状态机;为 false 时 PD 直接写本地存储,不做复制。 |
raft.ip-whitelist.enabled | 未设置 | true | 为 true 时 Raft RPC 端口只接受由 raft.peers-list 解析出的地址的连接,其他连接会被断开并记录 Blocked connection from <ip>。peer 列表变更时白名单会重新解析,但主机名不变而 IP 变化的情况(例如容器重启)仍需重启 PD。 |
raft.snapshotInterval | 未设置 | 300 | Raft 快照生成间隔(秒)。 |
raft.rpc-timeout | 未设置 | 10000 | Raft RPC 的连接、请求和安装快照超时时间(毫秒)。 |
PD 核心
| 配置项 | 发布包中的值 | 内置默认值 | 描述 |
|---|---|---|---|
pd.data-path | ./pd_data | 无,必填 | 元数据目录。rocksdb/ 子目录存放 RocksDB 数据,pd_raft/ 子目录存放 Raft 日志、元信息和快照。 |
pd.patrol-interval | 1800 | 300 | 巡检周期(秒)。巡检会检查各 Store 上的分区健康状况并平衡分区数量。 |
pd.initial-store-count | 1 | 3 | 活跃 Store 节点的最小数量。低于该值时集群状态变为 Cluster_Not_Ready,整个集群视为不可用。建议设为实际部署的 Store 数量。 |
pd.initial-store-list | 127.0.0.1:8500 | 空 | 逗号分隔的 Store gRPC 地址(ip:port),列表中的 Store 注册后自动激活。条目也可以带分组 id,写作 store_address/group_id。 |
pd.cluster_id | 未设置 | 1 | 集群 id,用于区分不同的 PD 集群。 |
Store 管理
| 配置项 | 发布包中的值 | 内置默认值 | 描述 |
|---|---|---|---|
store.keepAlive-timeout | 未设置 | 300 | 心跳超时时间(秒)。超过该时间未收到心跳,Store 视为临时不可用,其分区 leader 转移到其他副本。 |
store.max-down-time | 172800 | 1800 | 超过该时间(秒)后 Store 视为永久不可用,其副本重新分配到其他机器。 |
store.monitor_data_enabled | true | false | 是否持久化 Store 监控采样数据。 |
store.monitor_data_interval | 1 minute | 1 minute | 采样间隔,格式为 <数字> <单位>,单位为 second、minute、hour、day、month、year 之一;省略数字时按 1 计。 |
store.monitor_data_retention | 1 day | 1 day | 监控数据保留时长,格式同上。 |
分区
| 配置项 | 发布包中的值 | 内置默认值 | 描述 |
|---|---|---|---|
partition.default-shard-count | 1 | 3 | 每个分区的副本数。生产集群建议设为 3。 |
partition.store-max-shard-count | 12 | 24 | 单个 Store 最多承载的分区副本数。 |
初始分区数由这两个配置项和 pd.initial-store-list 的长度推导得出:
服务发现、License 与监控
| 配置项 | 发布包中的值 | 内置默认值 | 描述 |
|---|---|---|---|
discovery.heartbeat-try-count | 未设置 | 3 | 客户端注册后连续丢失多少次心跳就删除其注册信息。 |
license.verify-path | ./conf/verify-license.json | 无,必填 | License 校验描述文件路径,由 /v1/license 接口读取。 |
license.license-path | ./conf/hugegraph.license | 无,必填 | License 文件路径。发布包只带 verify-license.json,不带 license 文件,因此在提供该文件之前 license 接口会返回错误。 |
auth.secret-key | 未设置 | 内置常量 | 用于给内部客户端签发 PD token 的 HS256 密钥。 |
management.metrics.export.prometheus.enabled | true | Spring Boot 默认值 | 是否暴露 /actuator/prometheus。 |
management.endpoints.web.exposure.include | "*" | Spring Boot 默认值 | 需要暴露的 actuator 端点。 |
logging.config | file:./conf/log4j2.xml | 无 | Log4j2 配置文件,会写出 logs/hugegraph-pd.log、logs/hugegraph-pd_raft.log 和 logs/audit-hugegraph-pd.log。 |
线程池
| 配置项 | 内置默认值 | 描述 |
|---|---|---|
thread.pool.grpc.core | 600 | 处理 gRPC 请求的线程池核心线程数。 |
thread.pool.grpc.max | 1000 | 该线程池的最大线程数。 |
thread.pool.grpc.queue | 无上限 | 该线程池的队列容量。 |
job.uninterruptibleThreadPool.core | 0 | 元数据后台任务线程池的核心线程数。小于等于 0 时取可用处理器数的一半。 |
job.uninterruptibleThreadPool.max | 256 | 该线程池的最大线程数。 |
job.uninterruptibleThreadPool.queue | 无上限 | 该线程池的队列容量。 |
4.2 单节点配置
发布包自带的 conf/application.yml 本身就是一份可用的单节点配置,适用于开发和测试:单节点 PD 不存在 Raft 多数派可失,partition.default-shard-count: 1 表示每个分区只有一个副本。
4.3 三节点集群配置
生产环境请部署 3 个或 5 个 PD 节点,节点数取奇数以保证 Raft 总能形成多数派。3 节点集群可容忍 1 个节点故障。raft.peers-list 必须列出全部节点,并且在所有节点上逐字节一致;grpc.host 和 raft.address 每个节点各不相同。
节点 1(192.168.1.10):
节点 2(192.168.1.11)和节点 3(192.168.1.12)使用同一份配置,只把 grpc.host 和 raft.address 换成自己的地址:
若要在同一台机器上启动 3 个 PD 节点做测试,需为每个节点分别指定 pd.data-path 和各自的端口,例如 raft 端口 8610/8611/8612、gRPC 端口 8686/8687/8688、REST 端口 8620/8621/8622。
在 Docker 桥接网络中,同样的配置来自环境变量,并使用容器主机名而非 IP 地址:
5 启动与停止
5.1 启动 PD
在 PD 安装目录下执行:
脚本要求 PATH 或 JAVA_HOME 中有 11 及以上版本的 JDK;如果发现已有 Java 进程在使用本安装目录的 conf 目录,脚本会直接退出,不做任何事。
支持的参数:
| 参数 | 取值 | 默认值 | 描述 |
|---|---|---|---|
-d | true、false | true | 守护进程模式,详见下文。 |
-g | zgc、ZGC | 不设置 | 垃圾回收器。不带该参数即使用默认的 G1GC;填其他值(包括 g1)会导致启动中止。 |
-j | JVM 参数 | 空 | 额外的 JVM 参数,例如 -j "-Xmx8g -Xms8g"。 |
-y | true、false | false | 挂载 OpenTelemetry Java agent。首次使用时会把 agent 下载到 plugins/ 并校验 MD5,trace 通过 gRPC 上报到 http://127.0.0.1:4317。 |
-d 参数控制守护进程模式:
-d true(默认):以后台守护进程方式运行,脚本立即返回。-d false:以前台模式运行,脚本通过exec替换为 Java 进程,容器/进程管理器的进程即为 Java 本身。在 Docker 或进程管理器(systemd、supervisord)下运行时请使用此参数,以便在崩溃时自动检测并重启服务。
每个参数都有对应的环境变量:DAEMON、GC_OPTION、USER_OPTION 和 OPEN_TELEMETRY。设置 JAVA_OPTIONS 会完全替换脚本计算出的堆参数,否则脚本会根据可用内存在 512 MB 到 32 GB 之间选择堆大小。设置 STDOUT_MODE=true 时 JVM 输出保留在 stdout,不再重定向到 logs/hugegraph-pd-stdout.log,Docker 镜像正是这样做的。
启动成功后,可以在 logs/hugegraph-pd-stdout.log 中看到类似以下的日志:
进程号会写入 bin/pid。
5.2 停止 PD
在 PD 安装目录下执行:
脚本读取 bin/pid,向该进程发送终止信号,最多等待 30 秒直到进程退出,然后删除 pid 文件。如果 bin/pid 不存在,脚本会提示并正常退出。
6 分布式集群的启动顺序
请按以下顺序启动各组件:
- 全部 PD 节点。它们组成 Raft 组并选出 leader。等到每个节点都能响应
GET /v1/health再继续。 - 全部 Store 节点。每个 Store 通过 gRPC 向 PD 注册,PD 会自动激活
pd.initial-store-list中列出的 Store。等到GET /v1/stores中每个 Store 的state都是Up再继续。 - 全部 Server 节点。Server 读取
pd.peers,并依赖 PD 报告至少有一个存活的 Store 才能完成分区分配。
Docker Compose 的各个拓扑正是这样编排的:Store 容器通过 depends_on 加 condition: service_healthy 等待 PD 的 /v1/health 健康检查,Server 容器以同样方式等待 Store 的健康检查,Server 的 entrypoint 还会轮询 PD 的 /v1/stores,直到有 Store 报告 Up 才启动 HugeGraph。
停止时顺序相反:先停 Server,再停 Store,最后停 PD。
7 验证
7.1 REST API 认证
除 /actuator/*、/v1/health 和 /v1/prom/targets/* 之外,PD 的所有 REST 路径都要求带 HTTP Basic Authorization 头,且用户名必须是内部服务名 hg、store、hubble、vermeer 之一。不带该头的请求会得到:
目前不校验密码,任意值均可。Server 自带的 bin/wait-storage.sh 使用 store:admin,并支持用 PD_AUTH_USER 和 PD_AUTH_PASSWORD 覆盖,因此下面的示例使用同样的凭据:
警告:该校验只用于区分 HugeGraph 自身组件与其他流量。请勿把 PD 的 REST 或 gRPC 端口暴露到不可信网络,应通过防火墙规则或安全组加以限制,并保持
raft.ip-whitelist.enabled开启,使 Raft 端口只接受配置中的 peer。
7.2 健康检查
GET /v1/health 不需要凭据,Docker 健康检查用的就是它。它返回 200 且响应体为空:
Spring Boot actuator 端点同样可用,输出更直观:
如果返回 {"status":"UP"},则表示 PD 服务已成功启动。
7.3 集群与成员状态
查看 PD 成员以及当前的 Raft leader:
响应中包含 pdList、选出的 pdLeader、numOfService、numOfNormalService 和 stateCountMap。健康的 3 节点 PD 集群中,numOfService 和 numOfNormalService 都应为 3,且恰好有一个成员的 role 为 Leader。
GET /v1/cluster 在成员列表之外还返回 Store 列表、图列表和集群整体状态;GET / 返回一份简要汇总(leader 地址、集群状态、成员数、Store 数、图数量、分区数)。
7.4 Store 状态
也可以通过 PD API 查看 Store 节点状态:
如果响应中 state 为 Up,说明对应的 Store 节点运行正常。下面的示例只有一个 Store 节点。在一个健康的 3 节点部署中,storeId 列表应包含 3 个 ID,且 stateCountMap.Up、numOfService 和 numOfNormalService 都应为 3。
7.5 其他 REST 接口
下表中的路径均相对于 http://<pd-host>:8620,除注明外都需要 7.1 中的 Basic 认证头。
| 方法与路径 | 描述 |
|---|---|
GET / | 集群简要统计:leader、状态、成员数、Store 数、图数量、分区数 |
GET /v1/health | 健康检查,无需认证 |
GET /v1/cluster | 集群完整统计:PD 成员、Store、图、分区 |
GET /v1/members | PD 成员列表,含角色和选出的 leader |
POST /v1/members/change | 修改 Raft peer 列表,请求体 {"peerList": "..."} |
GET /v1/stores | 已注册的 Store 节点及其状态和统计信息 |
GET /v1/store/{storeId} | 单个 Store 节点 |
POST /v1/store/{storeId} | 修改 Store 状态,请求体 {"storeState": "..."} |
DELETE /v1/store/{storeId} | 从集群中移除 Store |
POST /v1/store/log | Store 状态变更日志,请求体 {"startTime": "...", "endTime": "..."} |
GET /v1/storesAndStats | Store 原始元数据,用于调试 |
GET /v1/store_monitor/{storeId} | Store 监控采样数据(文本) |
GET /v1/store_monitor/json/{storeId} | Store 监控采样数据(JSON) |
GET /v1/shards | 所有分区的所有副本,含 store id、角色、状态和进度 |
GET /v1/shardGroups | Shard 分组 |
GET /v1/shardGroupsCache | PD 内存缓存中的 shard 分组 |
GET /v1/shardLeaders | 按 Store raft 地址分组的分区 leader |
GET /v1/balanceLeaders | 在各 Store 之间重新平衡分区 leader |
GET /v1/partitions | 分区列表及其状态和统计信息 |
GET /v1/highLevelPartitions | 分区列表,含各图的 key 数量和数据大小 |
GET /v1/partitionsAndStats | 分区原始元数据,用于调试 |
POST /v1/partitions/log | 分区变更日志,请求体 {"startTime": "...", "endTime": "..."} |
GET /v1/resetPartitionState | 重置所有分区的状态 |
GET /v1/graphs | 图列表 |
GET /v1/graph/** | 按名称查询单个图 |
POST /v1/graph/** | 修改图的分区数,请求体 {"partitionCount": N} |
GET /v1/graph/partitionSizeRange | 集群允许的分区数上下限 |
GET /v1/graph-spaces | 图空间列表 |
GET /v1/graph-spaces/** | 单个图空间 |
POST /v1/graph-spaces/** | 修改图空间 |
POST /v1/registry | 注册一个服务实例用于服务发现 |
POST /v1/registryInfo | 查询已注册的实例 |
GET /v1/allInfo | 所有已注册的实例 |
GET /v1/license | License 信息 |
GET /v1/license/machineInfo | License 校验看到的 IP 和 MAC 地址 |
GET /v1/task/patrolStores | 立即执行 Store 巡检任务 |
GET /v1/task/patrolPartitions | 立即执行分区巡检任务 |
GET /v1/task/balancePartitions | 在各 Store 之间重新平衡分区 |
GET /v1/task/splitPartitions | 立即执行自动分区拆分 |
GET /v1/task/balanceLeaders | 重新平衡分区 leader |
GET /v1/task/compact | 让 Store 节点对其分区的 RocksDB 文件做 compaction |
GET /v1/prom/targets/{appName} | Prometheus 服务发现目标,无需认证 |
GET /v1/prom/targets-all | 所有应用类型的 Prometheus 目标 |
GET /v1/prom/sd_config | Prometheus HTTP 服务发现配置 |
GET /actuator/health | Spring Boot 健康检查,无需认证 |
GET /actuator/metrics | Spring Boot 监控指标,无需认证 |
GET /actuator/prometheus | Prometheus 抓取端点,无需认证 |
两个 log 接口接受形如 {"startTime": "...", "endTime": "..."} 的时间范围,yyyy-MM-dd HH:mm:ss 和 yyyy-MM-dd 都是可接受的格式。
PD 以 hg 前缀注册自己的指标,因此 /actuator/prometheus 除标准 JVM 指标外还会暴露 hg_up、hg_graphs、hg_stores 和 hg_terms,在存在图之后还会有按图统计的分区和大小指标。
3 - HugeGraph-Store Quick Start
1 HugeGraph-Store 概述
HugeGraph-Store 是 HugeGraph 分布式版本的存储节点组件,负责实际存储和管理图数据。它与 HugeGraph-PD 协同工作,共同构成 HugeGraph 的分布式存储引擎,提供高可用性和水平扩展能力。
每个 Store 节点使用 RocksDB 保存图数据,并通过 Raft(JRaft)进行复制:每个分区是一个独立的 Raft 组,因此分区在丢失少数副本时仍可继续工作。Store 节点之间并不直接感知彼此,它们向 PD 注册,由 PD 下发分区分配,并通过心跳上报状态。HugeGraph-Server 先从 PD 查询分区位置,再通过 gRPC 访问 Store。
2 依赖
2.1 前置条件
- 操作系统:Linux 或 macOS(Windows 尚未经过完整测试)
- Java 版本:≥ 11(编译期强制校验,
bin/start-hugegraph-store.sh启动时会再次检查) - Maven 版本:≥ 3.5.0
- 如需进行多节点部署,请先部署 HugeGraph-PD
3 部署
有两种方式可以部署 HugeGraph-Store 组件:
- 方式 1:下载 tar 包
- 方式 2:源码编译
3.1 下载 tar 包
从 Apache HugeGraph 官方下载页面下载最新版本的 HugeGraph-Store:
3.2 源码编译
如果只想单独编译 Store 而不是整个仓库,需要先编译 hugegraph-struct,因为 Store 依赖它:
生成的目录只包含 bin/、conf/ 和 lib/hg-store-node-{version}.jar。
3.3 Docker 部署
HugeGraph-Store Docker 镜像已发布在 Docker Hub,镜像名是 hugegraph/store。
注: 后续步骤皆假设你本地已拉取
hugegraph主仓库代码 (至少是 docker 目录)
有两个 compose 文件包含 Store:
| Compose 文件 | 拓扑 | 用途 |
|---|---|---|
docker-compose-hstore.yml | 1 PD + 1 Store + 1 Server + 1 Hubble | 最小分布式部署 |
docker-compose-3pd-3store-3server.yml | 3 PD + 3 Store + 3 Server + 1 Hubble | 多节点参考部署 |
通过 docker run 运行单个 Store 节点:
环境变量参考:
| 变量 | 必填 | 默认值 | 对应配置项 | 描述 |
|---|---|---|---|---|
HG_STORE_PD_ADDRESS | 是 | n/a | pdserver.address | PD gRPC 地址(如 pd0:8686,pd1:8686,pd2:8686) |
HG_STORE_GRPC_HOST | 是 | n/a | grpc.host | 本节点的 gRPC 主机名/IP(如 store0) |
HG_STORE_RAFT_ADDRESS | 是 | n/a | raft.address | 本节点的 Raft 地址(如 store0:8510) |
HG_STORE_GRPC_PORT | 否 | 8500 | grpc.port | gRPC 服务端口 |
HG_STORE_REST_PORT | 否 | 8520 | server.port | REST API 端口 |
HG_STORE_DATA_PATH | 否 | /hugegraph-store/storage | app.data-path | 数据存储路径 |
入口脚本会把这些变量转换为 SPRING_APPLICATION_JSON,覆盖在 conf/application.yml 之上,然后执行 bin/start-hugegraph-store.sh -d false -j "$JAVA_OPTS"。上表未覆盖的配置项仍需要修改 conf/application.yml,或者自行提供 SPRING_APPLICATION_JSON。
镜像细节:
JAVA_OPTS默认值为-XX:+UnlockExperimentalVMOptions -XX:+UseContainerSupport -XX:MaxRAMPercentage=50 -XshowSettings:vmSTDOUT_MODE=true,因此 Java 日志输出到容器 stdout,而不是logs/hugegraph-store-server.logHEALTHCHECK在 90 秒启动期后每 15 秒访问一次GET http://localhost:8520/v1/health- 镜像只声明了
EXPOSE 8520;如果需要从 Docker 网络之外访问 8500 和 8510,请自行发布这两个端口
注意:在 Docker 桥接网络中,
HG_STORE_GRPC_HOST应使用容器主机名(如store0)而非 IP 地址。
已弃用的别名:
PD_ADDRESS、GRPC_HOST、RAFT_ADDRESS仍可使用,但会输出弃用警告。新部署请使用HG_STORE_*名称。
4 配置
Store 从 conf/ 读取两个配置文件:
application.yml,主配置文件(PD 地址、各端口、Raft、数据路径)application-pd.yml,由application.yml中的spring.profiles.include: pd引入,包含 RocksDB 内存设置和 Actuator 暴露配置
4.1 application.yml
发布包中自带的文件内容如下:
4.2 application-pd.yml
4.3 配置项参考
下表中「模板值」是上面两个文件中的取值,「代码默认值」是配置项缺失时节点使用的回退值;模板未列出的配置项应以代码默认值为准。
核心
| 配置项 | 模板值 | 代码默认值 | 说明 |
|---|---|---|---|
pdserver.address | localhost:8686 | 必填 | PD gRPC 地址,多个地址用逗号分隔。Store 在此注册并获取分区分配。必须填写 PD 的 grpc.port,不是 PD 的 REST 端口。 |
grpc.host | 127.0.0.1 | 必填 | 本节点对外公布的 gRPC 地址。应设置为可路由的 IP 或主机名,127.0.0.1 只适用于单机部署。 |
grpc.port | 8500 | 必填 | gRPC 端口,Server 和 Store 客户端连接此端口。 |
grpc.netty-server.max-inbound-message-size | 1000MB | gRPC 默认值 | 单个入站 gRPC 消息的最大大小,由 grpc-spring-boot-starter 的 Netty 服务端读取。 |
grpc.server.wait-time | 未设置 | 3600 | 扫描流等待客户端消费一页数据的秒数,超时后服务端中止该流。 |
server.port | 8520 | 必填 | REST 和 Actuator 端口,同时以 rest.port 标签上报给 PD。 |
Raft
| 配置项 | 模板值 | 代码默认值 | 说明 |
|---|---|---|---|
raft.address | 127.0.0.1:8510 | 必填 | 本节点的 Raft 服务地址,格式为 host:port,必须能被其他 Store 节点访问。这里不需要配置 peer 列表:分区 Raft 组的成员由 PD 下发。 |
raft.disruptorBufferSize | 1024 | 0 | Raft 任务队列大小。设为 0 时按 rocksdb.total_memory_size 推导:将该内存量的 GB 数取最接近的 2 的幂,再乘以 32。 |
raft.max-log-file-size | 600000000000 | 50000000000 | Raft 日志的最大字节数。 |
raft.snapshotInterval | 1800 | 300 | 生成 Raft 快照的时间间隔,单位秒。 |
raft.snapshotLogIndexMargin | 未设置 | 0 | 距上次快照的最小 applied index 差值,达到后才真正生成快照。设为 0 关闭该判断。 |
raft.rpc-timeout | 未设置 | 10000 | Raft RPC 超时时间,单位毫秒。 |
raft.metrics | 未设置 | true | 采集 JRaft 节点指标,可通过 /metrics/raft 读取。 |
raft.useRocksDBSegmentLogStorage | 未设置 | true | 使用 RocksDB 分段日志存储保存 Raft 日志。 |
raft.maxSegmentFileSize | 未设置 | 67108864 | 分段日志文件大小,单位字节(64 MB)。 |
raft.maxReplicatorInflightMsgs | 未设置 | 256 | 每个 follower 的最大在途复制请求数。 |
raft.maxEntriesSize | 未设置 | 256 | 单次 AppendEntries 请求包含的最大条目数。 |
raft.maxBodySize | 未设置 | 524288 | 单次 AppendEntries 请求的最大字节数。 |
ave-logEntry-size-ratio | 未设置 | 0.95 | 估算日志条目平均大小时的平滑系数。注意该配置项位于顶层,不在 raft 下。 |
存储与标签
| 配置项 | 模板值 | 代码默认值 | 说明 |
|---|---|---|---|
app.data-path | ./storage | store | RocksDB 数据目录。用逗号分隔多个路径可将分区分散到多块磁盘。 |
app.raft-path | 已注释 | 空 | Raft 日志和快照目录。为空时回退到 app.data-path。 |
app.fake-pd | 未设置 | false | 内置 PD 模式,仅用于单机测试,不要用于生产。 |
app.placeholder-size | 未设置 | 10 | 启动时在每个数据路径下创建的 placeholder 占位文件大小,单位 GB,便于紧急情况下释放空间。设为 0 关闭。 |
app.label.<name> | 未设置 | 无 | 随 store 心跳上报给 PD 的自定义键值标签。节点会自动追加 rest.port。 |
RocksDB
| 配置项 | 模板值 | 代码默认值 | 说明 |
|---|---|---|---|
rocksdb.total_memory_size | 32000000000 | 51539607552 | 本节点所有 RocksDB 实例共享的内存预算。缺失或为 0 时使用 JVM 最大堆内存。 |
rocksdb.write_buffer_size | 32000000 | 33554432 | memtable 大小,单位字节。缺失或为 0 时取 total_memory_size / 1000。 |
rocksdb.min_write_buffer_number_to_merge | 16 | 16 | 落盘前合并的 memtable 数量。 |
rocksdb.write_buffer_ratio | 未设置 | 0.66 | total_memory_size 中分配给写缓存的比例,其余作为 block cache。 |
org/apache/hugegraph/rocksdb/access/RocksDBOptions.java 中定义的其他选项都可以加在同一个 rocksdb: 块下,例如 rocksdb.max_background_jobs、rocksdb.level0_file_num_compaction_trigger 或 rocksdb.bloom_filter_bits_per_key。
线程池
| 配置项 | 代码默认值 | 说明 |
|---|---|---|
thread.pool.grpc.core | 600 | 处理 gRPC 请求的核心线程数。 |
thread.pool.grpc.max | 1000 | gRPC 最大线程数。 |
thread.pool.grpc.queue | 2147483647 | gRPC 任务队列容量。 |
thread.pool.scan.core | 128 | 处理扫描的核心线程数。设为 0 时取 CPU 核数的 4 倍。 |
thread.pool.scan.max | 1000 | 扫描最大线程数。 |
thread.pool.scan.queue | 0 | 扫描任务队列容量。 |
查询下推
| 配置项 | 代码默认值 | 说明 |
|---|---|---|
query.push-down.threads | 1500 | 下推查询的线程池大小。 |
query.push-down.fetch_batch | 20000 | 单次请求拉取的行数。 |
query.push-down.fetch_timeout | 300000 | 拉取超时时间,单位毫秒。 |
query.push-down.memory_limit_count | 50000 | 排序等内存操作的行数上限。 |
query.push-down.index_size_limit_count | 50000 | 索引 sst 文件大小上限,单位 kB。 |
后台任务
| 配置项 | 代码默认值 | 说明 |
|---|---|---|
job.interruptableThreadPool.core | 128 | TTL 清理线程池的核心线程数。设为 0 时取 CPU 核数。 |
job.interruptableThreadPool.max | 256 | TTL 清理线程池的最大线程数。设为 0 时取 CPU 核数的 4 倍。 |
job.interruptableThreadPool.queue | 2147483647 | TTL 清理线程池的队列容量。 |
job.uninterruptibleThreadPool.core | 0 | 存储引擎不可中断任务线程池的核心线程数。设为 0 时取 CPU 核数。 |
job.uninterruptibleThreadPool.max | 256 | 不可中断任务线程池的最大线程数。 |
job.uninterruptibleThreadPool.queue | 2147483647 | 不可中断任务线程池的队列容量。 |
job.cleaner.batch.size | 10000 | TTL 清理任务每批删除的 key 数量。 |
job.start-time | 0 | 每日 TTL 清理执行的小时数(0 到 23)。超出该范围时回退为 19。 |
内置 PD 模式
仅用于单机开发调试,通过 app.fake-pd: true 开启。此时节点自行扮演 PD 角色,并忽略 pdserver.address。
| 配置项 | 代码默认值 | 说明 |
|---|---|---|
fake-pd.store-list | '' | 伪集群中各 Store 节点的 gRPC 地址。 |
fake-pd.peers-list | '' | 同一批节点的 Raft 地址。 |
fake-pd.partition-count | 3 | 分区数量。 |
fake-pd.shard-count | 3 | 每个分区的副本数。 |
诊断
| 配置项 | 代码默认值 | 说明 |
|---|---|---|
arthas.telnetPort | 8566 | 调用 /v1/arthasstart 后 Arthas 的 telnet 端口。 |
arthas.httpPort | 8565 | Arthas HTTP 端口。 |
arthas.ip | 0.0.0.0 | Arthas 监听地址。 |
arthas.disabledCommands | jad | 需要禁用的 Arthas 命令。 |
4.4 各节点需要区分的配置
对于多节点部署,需要为每个 Store 节点修改以下配置:
grpc.host和grpc.port(其他组件访问本节点的地址)raft.address(Raft 协议地址)server.port(REST 端口)app.data-path(数据存储路径)
pdserver.address 在所有节点上保持一致,它列出的是整个 PD 集群。
5 启动与停止
5.1 启动 Store
确保 PD 服务已经启动,然后在 Store 安装目录下执行:
启动脚本支持四个参数:
| 参数 | 取值 | 默认值 | 说明 |
|---|---|---|---|
-d | true、false | true | 守护进程模式,见下文。 |
-g | ZGC、zgc | 未设置 | 垃圾回收器。不传该参数即使用默认的 G1。除 ZGC 和 zgc 之外的任何取值都会直接退出,包括 g1,尽管脚本自身的用法提示里写了它。 |
-j | JVM 参数字符串 | 空 | 附加的 JVM 参数,例如 -j "-Xmx16g -Xms8g"。 |
-y | true、false | false | 挂载 OpenTelemetry Java agent(首次使用时下载到 plugins/),并将 trace 导出到 127.0.0.1:4317。 |
守护进程模式:
-d true(默认):以后台守护进程方式运行,脚本立即返回,并把 Java 进程号写入bin/pid。-d false:以前台模式运行,脚本通过exec替换为 Java 进程,容器或进程管理器的进程即为 Java 本身。在 Docker 或进程管理器(systemd、supervisord)下运行时请使用此参数,以便在崩溃时自动检测并重启服务。
JVM 内存方面,如果没有自行设置 JAVA_OPTIONS:-Xms512m,-Xmx 取空闲内存的一半并限制在 512 MB 到 2048 MB 之间。脚本还会加上 -XX:MetaspaceSize=256M、OOM 时把堆转储写入 logs/,以及滚动的 GC 日志 logs/gc.log。生产节点通常需要大得多的堆,请显式指定,例如 -j "-Xmx32g -Xms32g"。
当 ulimit -n 或 ulimit -u 低于 1024 时脚本会拒绝启动;在 x86_64 和 arm64 上,如果能成功下载并校验对应的动态库,脚本会预加载 jemalloc。
启动成功后,可以在 logs/hugegraph-store-server.log 中看到类似以下的日志:
5.2 停止 Store
在 Store 安装目录下执行:
脚本读取 bin/pid,向该进程发送信号,最多等待 30 秒直至进程退出,然后删除 pid 文件。如果 bin/pid 不存在,脚本直接退出且不做任何操作。
5.3 重启 Store
该脚本依次 source 停止脚本和启动脚本,并转发 5.1 中的参数。
5.4 启动顺序
- 先启动 PD。每个 Store 的
grpc.host:grpc.port都应出现在 PD 的pd.initial-store-list中,否则 PD 只会把该节点登记为Pending而不会置为Up,分区分配也就无法完成。 - 再启动 Store。Store 早于 PD 启动并不致命:心跳线程会持续重试注册,并在 PD 可用之前打印
store heartbeat error: PD UNREACHABLE。 - 最后启动 HugeGraph-Server,此时所有 Store 节点都应上报
state: "Up"。Server 需要分区就绪之后才能初始化或打开图。
compose 文件用 depends_on: condition: service_healthy 表达同样的顺序:Store 等待所有 PD 健康检查通过,Server 等待所有 Store 健康检查通过。
6 多节点部署示例
以下是一个三节点部署的配置示例:
6.1 三节点配置参考
- 3 PD 节点
- raft 端口:8610, 8611, 8612
- rpc 端口:8686, 8687, 8688
- rest 端口:8620, 8621, 8622
- 3 Store 节点
- raft 端口:8510, 8511, 8512
- rpc 端口:8500, 8501, 8502
- rest 端口:8520, 8521, 8522
6.2 Store 节点配置
对于三个 Store 节点,每个节点的主要配置差异如下:
节点 A:
节点 B:
节点 C:
所有节点都应该指向相同的 PD 集群:
同时每个 PD 节点都应列出三个 Store 的 gRPC 地址:
6.3 Docker 分布式集群配置
3 节点 Store 集群包含在 docker/docker-compose-3pd-3store-3server.yml 中。每个 Store 节点拥有独立的主机名和环境变量:
每个节点的容器内端口都是 8500/8510/8520,只有映射到宿主机的端口不同。PD 节点相应地设置 HG_PD_INITIAL_STORE_LIST: store0:8500,store1:8500,store2:8500。
Store 节点仅在所有 PD 节点通过健康检查后才会启动,其中 docker-compose 中的 healthcheck 实际访问的是 PD 的 REST 接口 /v1/health(也可以通过 Actuator 暴露的 /actuator/health 进行手动检查),并通过 depends_on: condition: service_healthy 强制执行依赖关系。
运行时日志可通过 docker logs <container-name>(如 docker logs hg-store0)直接查看,无需进入容器。
完整的部署指南请参阅 docker/README.md。
7 验证 Store 服务
确认 Store 服务是否正常运行:
如果返回 {"status":"UP"},则表示 Store 服务已成功启动。
GET /v1/health 是 Docker 镜像和 compose 文件使用的轻量检查接口,它返回 HTTP 200 且响应体为空,因此应使用 curl -fsS 并检查退出码,而不是检查输出内容:
7.1 Store REST 接口
Store 节点在 server.port 上提供以下只读接口:
| 方法 | 路径 | 描述 |
|---|---|---|
| GET | /v1/health | 存活探测,HTTP 200 且响应体为空 |
| GET | /actuator/health | Spring Boot Actuator 健康检查,返回 {"status":"UP"} |
| GET | /actuator/prometheus | Prometheus 抓取接口 |
| GET | / | 节点概览,包含 leaderCount 和 partitionCount |
| GET | /-/state | 节点状态,取值为 STARTING、ONLINE、STOPPING |
| GET | /-/echo?name=<text> | 回显检查 |
| GET | /-/scan | 当前扫描流的状态 |
| GET | /v1/partitions | 本节点上的所有 Raft 组及分区指标。加上 ?flags=accurate 可获取精确的 key 数量,但更慢。 |
| GET | /v1/partition/{id} | 按分区 id 查询单个 Raft 组,包含角色、leader、peers 和已提交索引 |
| GET | /metrics/system | 主机 CPU 和内存指标 |
| GET | /metrics/drive | 数据路径所在磁盘的指标 |
| GET | /metrics/raft | JRaft 节点指标,需要 raft.metrics: true |
Actuator 和 Prometheus 之所以可访问,是因为自带配置设置了 management.endpoints.web.exposure.include: "*" 和 management.metrics.export.prometheus.enabled: true。
节点还提供一批会修改状态或执行重负载操作的运维接口:PUT /-/state、GET /-/cleaner、GET /v1/partition/dump/{id}、GET /v1/partition/clean/{id}、POST /v1/compat?id=<partition>、GET /v1/arthasstart、POST /raft/options,以及 /fix/* 和 /test/* 两组接口。请仅在排查问题时使用,并且不要把 REST 端口暴露到不可信网络。
7.2 通过 PD 检查注册结果
也可以通过 PD API 查看集群中的 Store 节点状态:
PD 的 REST 端口默认开启 basic 认证:用户名必须是 hg、store、hubble、vermeer 之一,密码目前还不校验。不带凭据的请求会返回 {"status":-1,"error":"Unauthorized!"}。只有 /v1/health、/actuator/* 和 /v1/prom/targets/* 不需要认证。
如果 Store 配置成功,上述接口响应中应包含当前节点的状态信息,其中 state 为 Up 表示节点运行正常。如果节点长期停留在 Pending,通常是因为它没有出现在 PD 的 pd.initial-store-list 中。
下方示例仅展示 1 个 Store 节点的返回结果。如果 3 个节点都已正确配置并正在运行,则响应中的 storeId 列表应包含 3 个 ID,且 stateCountMap.Up、numOfService 和 numOfNormalService 都应为 3。