连接

编辑

此页面包含创建 Elasticsearch .NET 客户端实例以连接到 Elasticsearch 集群所需的信息。

可以通过单个节点或通过使用节点池指定多个节点来连接到 Elasticsearch 集群。与单个节点相比,使用节点池具有一些优势,例如负载平衡和集群故障转移支持。客户端提供了方便的配置选项以连接到 Elastic Cloud 部署。

客户端应用程序应创建 ElasticsearchClient 的单个实例,并在整个应用程序的生命周期中使用该实例。在内部,客户端管理和维护与节点的 HTTP 连接,并重复使用它们以优化性能。如果您的应用程序使用依赖项注入容器,则客户端实例应注册为单例生命周期。

连接到云部署

编辑

Elastic Cloud 是开始使用 Elasticsearch 的最简单方法。当使用 .NET Elasticsearch 客户端连接到 Elastic Cloud 时,您应该始终使用 Cloud ID。创建集群后,您可以在“管理部署”页面中找到此值(如果您在 Kibana 中,请查看左上角)。

我们建议尽可能使用 Cloud ID,因为您的客户端将自动配置为最适合与 Elastic Cloud 一起使用,包括 HTTPS 和 HTTP 压缩。

连接到 Elasticsearch Service 部署是通过在配置 ElasticsearchClient 实例时提供部署的唯一 Cloud ID 来实现的。您还需要合适的凭据,例如用户名和密码或您的应用程序用于对部署进行身份验证的 API 密钥。

作为安全最佳实践,建议为每个应用程序创建一个专用的 API 密钥,其权限仅限于应用程序被授权执行的任何 API 调用所需的权限。

以下代码片段演示了如何创建连接到云中 Elasticsearch 部署的客户端实例。

using Elastic.Clients.Elasticsearch;
using Elastic.Transport;

var client = new ElasticsearchClient("<CLOUD_ID>", new ApiKey("<API_KEY>")); 

将上面的占位符字符串值替换为您应用程序的 Cloud ID 和配置的 API 密钥,以便访问您的部署。

连接到单个节点

编辑

单个节点配置最适合连接到在负载均衡器或反向代理后面运行的多节点集群,该集群通过单个 URL 公开。在本地应用程序开发期间使用单个节点也可能很方便。如果 URL 代表单个 Elasticsearch 节点,请注意,如果服务器无法访问或无响应,这将不提供任何弹性。

默认情况下,安全功能(如身份验证和 TLS)在 Elasticsearch 集群上启用。首次启动 Elasticsearch 时,将自动为 HTTP 层配置 TLS。将生成一个 CA 证书并存储在磁盘上,该证书用于为 Elasticsearch 集群的 HTTP 层的证书签名。

为了使客户端能够通过 HTTPS 与集群建立连接,客户端应用程序必须信任 CA 证书。最简单的选择是使用 CA 证书的十六进制编码的 SHA-256 指纹。首次启动 Elasticsearch 时,CA 指纹将输出到终端。您将在 Elasticsearch 的输出中看到如下所示的独特块(如果过了一段时间,您可能需要向上滚动)

----------------------------------------------------------------
-> Elasticsearch security features have been automatically configured!
-> Authentication is enabled and cluster connections are encrypted.

->  Password for the elastic user (reset with `bin/elasticsearch-reset-password -u elastic`):
  lhQpLELkjkrawaBoaz0Q

->  HTTP CA certificate SHA-256 fingerprint:
  a52dd93511e8c6045e21f16654b77c9ee0f34aea26d9f40320b531c474676228
...
----------------------------------------------------------------

记下 elastic 用户密码和 HTTP CA 指纹以备后续部分使用。

也可以使用以下命令随时从正在运行的集群中检索 CA 指纹

openssl x509 -fingerprint -sha256 -in config/certs/http_ca.crt

该命令返回安全证书,包括指纹。 issuer 应为 Elasticsearch security auto-configuration HTTP CA

issuer= /CN=Elasticsearch security auto-configuration HTTP CA
SHA256 Fingerprint=<FINGERPRINT>

访问 自动启用安全功能启动 Elastic Stack 文档以了解更多信息。

以下代码片段显示了如何使用 CA 指纹创建连接到 Elasticsearch 集群的单个节点的客户端实例

using Elastic.Clients.Elasticsearch;
using Elastic.Transport;

var settings = new ElasticsearchClientSettings(new Uri("https://127.0.0.1:9200"))
    .CertificateFingerprint("<FINGERPRINT>")
    .Authentication(new BasicAuthentication("<USERNAME>", "<PASSWORD>"));

var client = new ElasticsearchClient(settings);

前面的代码片段演示了如何通过提供用户名和密码进行基本身份验证来配置客户端以进行身份验证。如果需要,您也可以使用 ApiKey 身份验证,如云连接示例中所示。

使用节点池连接到多个节点

编辑

为了提供弹性,您应该为您的集群配置多个节点,客户端尝试与这些节点通信。默认情况下,客户端以循环方式为每个请求循环遍历节点。客户端还会跟踪不健康的节点,并避免向它们发送请求,直到它们恢复健康。

此配置最适合连接到已知的、小型集群,在这些集群中,您不需要嗅探来检测集群拓扑。

以下代码片段显示了如何使用静态节点池连接到多个节点

using Elastic.Clients.Elasticsearch;
using Elastic.Transport;

var nodes = new Uri[]
{
	new Uri("https://myserver1:9200"),
	new Uri("https://myserver2:9200"),
	new Uri("https://myserver3:9200")
};

var pool = new StaticNodePool(nodes);

var settings = new ElasticsearchClientSettings(pool)
    .CertificateFingerprint("<FINGERPRINT>")
    .Authentication(new ApiKey("<API_KEY>"));

var client = new ElasticsearchClient(settings);