JanusGraph 索引后端之 Elasticsearch 安装配置

Elasticsearch是一个分布式RESTful搜索和分析引擎,能够解决越来越多的用例。 作为Elastic Stack的核心,它集中存储您的数据,以便您可以发现预期并发现意外情况。

-- Elasticsearch Overview

JanusGraph 支持 Elasticsearch 作为索引后端。 以下是 JanusGraph 支持的一些 Elasticsearch 功能:

  • Full-Text:支持所有 Text 谓词搜索给定单词、前缀或正则表达式匹配的文本属性。
  • Geo:支持所有在给定查询几何体中相交、within、不相交或包含的 Geo 谓词搜索地理属性。 支持用于索引的点、圆、框、线和多边形。 支持圆、框和多边形用于查询点属性和所有形状以查询非点属性。
  • Numeric Range:支持所有数字比较。
  • Flexible Configuration:支持远程操作和自定义的开放式设置。
  • Collections:支持索引 SET 和 LIST 基数的属性。
  • Temporal:纳秒粒度时间索引。
  • Custom Analyzer:选择使用自定义分析器。
  • Not Query-normal-form:支持 Query-normal-form(QNF)以外的查询。 JanusGraph 的 QNF 是 CNF(conjunctive normal form)的变体,在可能的情况下否定内联。

有关哪些版本的 Elasticsearch 可与 JanusGraph 配合使用的详细信息,请参阅 附录B,版本兼容性

重要:从 Elasticsearch 5.0 开始,JanusGraph 使用沙盒 Painless scripts 进行内联更新,默认情况下在 Elasticsearch 5.x 中启用。 将 JanusGraph 与 Elasticsearch 2.x 一起使用需要通过在 Elasticsearch 集群上将 script.engine.groovy.inline.update 设置为 `true 来启用 Groovy 内联脚本(有关详细信息,请参阅动 态脚本文档)。

27.1 运行 Elasticsearch

JanusGraph 支持与正在运行的 Elasticsearch 集群的连接。JanusGraph 提供了两个选项来运行本地 Elasticsearch 实例以便快速入门。JanusGraph 服务(参见第7.1节“入门”,译著:参见翻译 Chapter 7. JanusGraph Server)会自动启动本地 Elasticsearch 实例。另外,JanusGraph 发行版包含一个完整的 Elasticsearch 发行版,允许用户手动启动本地 Elasticsearch 实例(有关详细信息,请参阅 此页面)。

$ elasticsearch/bin/elasticsearch

提示:出于安全原因,Elasticsearch 必须在非 root 帐户下运行

27.2 Elasticsearch 配置概述

JanusGraph 支持与正在运行的 Elasticsearch 集群的 HTTP(S) 客户端连接。 有关哪些版本的 Elasticsearch 可以与 JanusGraph 中的不同客户端类型一起使用的详细信息,请参阅 附录B,版本兼容性

提示:JanusGraph 的索引选项以字符串 index.[X]. 开头。 其中 [X] 是后端的用户定义名称。 在构建混合索引时,必须将此用户定义的名称传递给 JanusGraph 的 ManagementSystem 接口,如 第11.1.2节“混合索引” 中所述,以便 JanusGraph 知道可能使用多个已配置的索引后端。 本章中的配置片段使用名称 search,而对选项的讨论通常在同一位置写入 [X]。 只要在 JanusGraph 的配置中以及管理索引时一致使用,确切的索引名称就不重要了。

贴士:建议索引名称仅包含字母、数字、小写字符和连字符,并且它们以小写字母开头。

27.2.1 连接 Elasticsearch

像下面这样指定 Elasticsearch client:

index.search.backend=elasticsearch

连接到 Elasticsearch 时,必须提供 Elasticsearch 实例的单个或主机名列表。 这些是通过 JanusGraph 的 index.[X].hostname 键提供的。

index.search.backend=elasticsearch
index.search.hostname=10.0.0.10:9200

此处指定的每个 host 或 host:port 对将添加到 HTTP 客户端的请求目标轮询调度列表中。 这是一个最小配置,它将在 10.0.0.10 上默认的 Elasticsearch HTTP 端口(9200)上轮询调度,在 10.0.0.20 端口 7777 轮询调度:

index.search.backend=elasticsearch
index.search.hostname=10.0.0.10, 10.0.0.20:7777

27.2.1.1 JanusGraph index.[X]index.[X].elasticsearch 选项

JanusGraph 仅使用 index-namehealth-request-timeout 的默认值。有关这些选项及其可接受值的说明,请参见 第15章,配置参考

  • index.[X].elasticsearch.index-name
  • index.[X].elasticsearch.health-request-timeout

27.2.2 REST 客户端选项

REST 客户端接受 index.[X].bulk-refresh 选项。 此选项控制何时使更改对搜索可见。 有关更多信息,请参阅 refresh 文档

27.2.3 REST 客户端 HTTPS 配置

可以通过将 index.[X].elasticsearch.ssl.enabled 配置选项设置为 true 来启用对 HTTP 的 SSL 支持。

请注意,根据您的配置,如果您的 HTTPS 端口号与 REST API 的默认端口号(9200)不同,则可能需要更改 index.[X].port 的值。

启用 SSL 后,您还可以配置信任库的位置和密码。 这可以按如下方式完成:

index.search.elasticsearch.ssl.truststore.location=/path/to/your/truststore.jks
index.search.elasticsearch.ssl.truststore.password=truststorepwd

请注意,这些设置仅适用于 Elasticsearch REST 客户端,不会影响 JanusGraph 中的任何其他 SSL 连接。

还支持客户端密钥库的配置:

index.search.elasticsearch.ssl.keystore.location=/path/to/your/keystore.jks
index.search.elasticsearch.ssl.keystore.storepassword=keystorepwd
index.search.elasticsearch.ssl.keystore.keypassword=keypwd

任何密码都可以为空。

如果需要,可以通过将 index.[X].elasticsearch.ssl.disable-hostname-verification 属性值设置为 true 来禁用 SSL 主机名验证,并且可以通过设置index.[X].elasticsearch.ssl.allow-self-signed-certificates 属性值为 true 来启用对自签名 SSL 证书的支持。

贴士:建议不要依赖自签名SSL证书或禁用生产系统的主机名验证,因为它会严重限制客户端与 Elasticsearch 服务器提供安全通信通道的能力。 这可能导致泄露机密数据,这可能是您的 JanusGraph 索引的一部分。

27.2.4 REST 客户端 HTTP 身份验证

REST 客户端支持以下身份验证选项:基本 HTTP 身份验证(用户名/密码)和基于用户提供的实现的自定义身份验证。

这些身份验证方法独立于上述 SSL 客户端身份验证。

27.2.4.1 REST 客户端基本 HTTP 身份验证

无论 SSL 支持的状态如何,都可以使用基本 HTTP 身份验证。 可选地,可以通过 index.[X].elasticsearch.http.auth.basic.realm 属性指定认证领域(authentication realm)。

index.search.elasticsearch.http.auth.type=basic
index.search.elasticsearch.http.auth.basic.username=httpuser
index.search.elasticsearch.http.auth.basic.password=httppassword

贴士:强烈建议在使用此选项时使用 SSL(例如,将 index.[X].elasticsearch.ssl.enabled 设置为 true),因为在通过未加密的连接发送时可以拦截凭据!

27.2.4.2 REST 客户端自定义 HTTP 身份验证

可以通过提供自己的实现来实现其他身份验证方法。 自定义身份验证器配置如下:

index.search.elasticsearch.elasticsearch.http.auth.custom.args=arg1,arg2,...
</code>
index.search.elasticsearch.http.auth.custom.authenticator-class=fully.qualified.class.Name
index.search.elasticsearch.elasticsearch.http.auth.custom.authenticator-args=arg1,arg2,...

参数列表是可选的,可以为空。

指定的类必须实现 org.janusgraph.diskstorage.es.rest.util.RestClientAuthenticator 接口或扩展 org.janusgraph.diskstorage.es.rest.util.RestClientAuthenticatorBase 类。

该实现可以访问HTTP客户端配置,并可以根据需要自定义客户端。有关更多信息,请参阅 附录A,API文档(JavaDoc)

例如,以下代码段实现了一个身份验证器,允许 Elasticsearch REST 客户端进行身份验证并获得针对 AWS IAM 的授权:

import java.io.IOException;
import java.time.LocalDateTime;
import java.time.ZoneOffset;

import org.apache.http.HttpRequestInterceptor;
import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
import org.janusgraph.diskstorage.es.rest.util.RestClientAuthenticatorBase;

import com.amazonaws.auth.DefaultAWSCredentialsProviderChain;
import com.amazonaws.regions.DefaultAwsRegionProviderChain;
import com.google.common.base.Supplier;

import vc.inreach.aws.request.AWSSigner;
import vc.inreach.aws.request.AWSSigningRequestInterceptor;

/**
 * <p>
 * Elasticsearch REST HTTP(S) client callback implementing AWS request signing.
 * </p>
 * <p>
 * The signer is based on AWS SDK default provider chain, allowing multiple options for providing
 * the caller credentials. See {@link DefaultAWSCredentialsProviderChain} documentation for the details.
 * </p>
 */
public class AWSV4AuthHttpClientConfigCallback extends RestClientAuthenticatorBase {

    private static final String AWS_SERVICE_NAME = "es";
    private HttpRequestInterceptor awsSigningInterceptor;

    public AWSV4AuthHttpClientConfigCallback(final String[] args) {
        // does not require any configuration
    }

    @Override
    public void init() throws IOException {
        DefaultAWSCredentialsProviderChain awsCredentialsProvider = new DefaultAWSCredentialsProviderChain();
        final Supplier<LocalDateTime> clock = () -> LocalDateTime.now(ZoneOffset.UTC);

        // using default region provider chain
        // (http://docs.aws.amazon.com/sdk-for-java/v2/developer-guide/java-dg-region-selection.html)
        DefaultAwsRegionProviderChain regionProviderChain = new DefaultAwsRegionProviderChain();
        final String awsRegion = regionProviderChain.getRegion();

        final AWSSigner awsSigner = new AWSSigner(awsCredentialsProvider, awsRegion, AWS_SERVICE_NAME, clock);
        this.awsSigningInterceptor = new AWSSigningRequestInterceptor(awsSigner);
    }

    @Override
    public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
        return httpClientBuilder.addInterceptorLast(awsSigningInterceptor);/
    }
}

此自定义身份验证器不使用任何构造函数参数。


翻译自官方文档原文地址:JanusGraph Documentation > Index Backends > Elasticsearch

如果觉得这对你有用,请随意赞赏,给与作者支持
评论 0
最新评论