通过应用程序连接集群

本文介绍如何使用PythonGo连接阿里云ES。

准备工作

获取集群连接地址

  • VPC私网连接地址:通过VPC私网地址访问ES集群,延迟低,稳定性高。集群创建成功后,VPC私网地址默认开启。

  • 公网连接地址:通过公网访问ES集群,需手动开启:

    登录控制台,在集群配置与管理>安全配置页面,开启公网访问。开关打开后,待集群状态由生效中变更为生效时,表示开启成功。

    image

    重要

    公网地址会降低ES集群的安全性,如必须使用该地址,请设置IP白名单,使用结束后及时关闭。

设置IP白名单

为保障集群安全,您需要将待访问设备的IP地址加入VPC私网或者公网白名单,白名单配置完成后,立即生效,无需重启集群。

  1. 登录阿里云Elasticsearch控制台,在安全配置页面,单击修改设置VPC私网或者公网访问白名单。

    image

  2. 获取待访问设备的IP并将其添加至白名单中。

    Step 1:获取待访问设备IP

    您可以参照以下场景,获取待访问设备的IP地址。

    场景

    需获取的IP地址

    获取方式

    在本地设备中通过命令行连接ES集群。

    本地设备公网IP。

    说明

    如果您的本地设备处在家庭网络或公司局域网中,需要添加局域网的公网出口IP地址。

    通过curl ipinfo.io/ip查询本地设备公网IP。

    ECS实例中通过命令行连接ES集群

    ECSES在不同专有网络中,通过该ECS公网连接ES集群时,需获取ECS的公网IP。

    登录ECS控制台,在实例列表查看实例的公网或者私网IP地址。

    ECSES在同一专有网络中,通过该ECS私网连接ES集群时,需获取ECS的私网IP。

    Step 2:添加白名单

    1. 单击default分组右侧的配置 ,在弹出的对话框中添加IP白名单。

      • 如有需要,也可以单击新增IP白名单分组,自定义分组名称。

      • 分组仅用于IP地址管理,不会影响实际访问权限。所有分组中的IP地址对ES集群的访问权限是一致的。

      image

      配置类别

      格式和示例值

      重要注意事项

      IPv4地址格式

      • 单个IP:192.168.0.1

      • 网段:192.168.0.0/24

        建议将零散的IP合并为IP

      单个集群最多可配置300IP或者IP网段,多个IP或者IP网段之间用英文逗号隔开,且逗号前后不能有空格。

      • 公网默认地址:127.0.0.1,表示禁止所有IPv4地址访问。

      • VPC私网默认值:10.0.0.0/8

      • 0.0.0.0/0:允许所有IPv4访问。

        重要

        强烈建议不要配置 0.0.0.0/0,存在高危风险。

        部分集群版本(如7.16/8.5)和地域不支持 0.0.0.0/0,请以控制台界面或者报错提示为准。

      IPv6地址格式

      (仅杭州地域支持)

      • 单个IP:2401:XXXX:1000:24::5

      • 网段:2401:XXXX:1000::/48

      单个集群最多可配置300IP或者IP网段,多个IP或者IP网段之间用英文逗号隔开,且逗号前后不能有空格。

      • ::1:禁止所有IPv6地址访问

      • ::/0:允许所有IPv6访问

        重要

        强烈建议不要配置 ::/0,存在高危风险。

        部分集群版本不支持 ::/0,请以控制台界面或者报错提示为准。

    2. 配置完成后,单击确认

      image

注意事项

为确保兼容性,建议客户端使用的 Java、Python 或 Go 语言版本与ES集群底层运行时的版本保持一致。

示例代码

Java

此处以ES 8.17.0为例,介绍如何通过Java连接ES集群。

  1. 安装Java JDK,JDK版本为1.8及以上。

  2. 配置pom依赖。

    重要

    请将version设置为正确的ES版本号,只有当version设置正确时才能拉取相关依赖,本示例ES版本为8.17.0。

    <dependency>
        <groupId>co.elastic.clients</groupId>
        <artifactId>elasticsearch-java</artifactId>
        <version>8.17.0</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.12.3</version>
    </dependency>
  3. 连接ES集群并创建名为hr_test的索引。

    配置YML参数,开启自动创建索引:action.auto_create_index: true

    package org.example;
    import co.elastic.clients.elasticsearch.ElasticsearchClient;
    import co.elastic.clients.elasticsearch.cat.IndicesResponse;
    import co.elastic.clients.elasticsearch.indices.*;
    import co.elastic.clients.json.jackson.JacksonJsonpMapper;
    import co.elastic.clients.transport.ElasticsearchTransport;
    import co.elastic.clients.transport.rest_client.RestClientTransport;
    import org.apache.http.HttpHost;
    import org.apache.http.auth.AuthScope;
    import org.apache.http.auth.UsernamePasswordCredentials;
    import org.apache.http.client.CredentialsProvider;
    import org.apache.http.impl.client.BasicCredentialsProvider;
    import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
    import org.elasticsearch.client.*;
    import java.io.IOException;
    public class RestClientTest {
        public static void main(String[] args) {
            // 阿里云Elasticsearch集群需要basic auth验证。
            final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
            //访问用户名和密码为您创建阿里云Elasticsearch实例时设置的用户名和密码,也是Kibana控制台的登录用户名和密码。
            credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("{UserName}", "{YourPassword}"));
            // 通过builder创建rest client,配置http clientHttpClientConfigCallback。
            // 单击所创建的Elasticsearch实例ID,在基本信息页面获取公网地址,即为ES集群地址。
            RestClient restClient = RestClient.builder(new HttpHost("{YourEsHost}", 9200, "http"))
                    .setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
                        @Override
                        public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
                            return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
                        }
                    }).build();
    
            // 使用 Jackson 映射器创建传输
            ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());
            // 创建 API 客户端
            ElasticsearchClient elasticsearchClient = new ElasticsearchClient(transport);
            // 创建了一个名为 "foo" 的别名,并将其设置为写入别名 (write index),这意味着所有写入操作(例如索引、更新、删除文档)将自动路由到这个别名所对应的索引上。
            try {
                //创建索引
                CreateIndexResponse indexRequest = elasticsearchClient.indices().create(createIndexBuilder -> createIndexBuilder
                        .index("hr_test")
                        .aliases("foo", aliasBuilder -> aliasBuilder
                                .isWriteIndex(true)
                        )
                );
                //检查“indexRequest”请求的操作是否已被Elasticsearch集群确认
                boolean acknowledged = indexRequest.acknowledged();
                System.out.println("Index document successfully! " + acknowledged);
    
                //查看所有索引信息(health status index uuid pri rep)
                IndicesResponse indicesResponse = elasticsearchClient.cat().indices();
                indicesResponse.valueBody().forEach(info -> System.out.println(info.health() + "\t"+  info.status() + "\t" + info.index() + "\t" + info.uuid() +"\t" + info.pri() + "\t" + info.rep()));
    
    
                transport.close();
                restClient.close();
            } catch (IOException ioException) {
                // 异常处理。
            }
        }
    }
    

    成功执行后返回以下信息:

    image

Python

ES 8.x版本

# 安装指定版本的依赖
pip install elasticsearch==8.17.0
from elasticsearch import Elasticsearch

# 连接集群
es = Elasticsearch(
    hosts=['http://<YourEsHost>:9200'],
    basic_auth=('<UserName>', '<YourPassword>'),
)
# 获取并打印集群信息
res = es.info() 
print(res)

ES 7.x版本

# 安装指定版本的依赖
pip install elasticsearch==7.10.0

# 代码示例
from elasticsearch import Elasticsearch

# 连接集群
es = Elasticsearch(
    hosts=['http://<YourEsHost>:9200'],
    basic_auth=('<UserName>', '<YourPassword>'),
)

res = es.info()
print(res)

ES 6.x版本

# 安装指定版本的依赖
pip install elasticsearch==6.8.2

from elasticsearch import Elasticsearch

# 连接集群
es = Elasticsearch(
    hosts=['http://<YourEsHost>:9200'],
    basic_auth=('<UserName>', '<YourPassword>'),
)
res = es.info()
print(res)

ES 5.x版本

# 安装指定版本的依赖
pip install elasticsearch==5.5.3

from elasticsearch import Elasticsearch

# 连接集群
es = Elasticsearch(
    hosts=['http://<YourEsHost>:9200'],
    basic_auth=('<UserName>', '<YourPassword>'),
)
res = es.info()
print(res)

Go

以下以ES 8.x版本为例介绍如何通过Go连接ES,更多Go API Client的使用特性,请参见Elasticsearch Go Client

go get github.com/elastic/go-elasticsearch/v8
package main

import (
	"github.com/elastic/go-elasticsearch/v8"
	"log"
)

func main() {
	cfg := elasticsearch.Config{
		Addresses: []string{
			"http://<YourEsHost>:9200",
		},
		Username: "<UserName>",
		Password: "<YourPassword>",
	}

	es, err := elasticsearch.NewClient(cfg)
	if err != nil {
		log.Fatalf("Error creating the client: %s", err)
	}

	res, err := es.Info()
	if err != nil {
		log.Fatalf("Error getting response: %s", err)
	}

	defer res.Body.Close()
	log.Println(res)
}

参数

说明

UserName

用户名,固定为elastic

YourPassword

用户密码。

创建集群时设置密码,支持重置密码

http

访问协议,默认使用http协议。

为保障集群安全性,建议使用https协议,需手动开启https协议后才能使用。

image

通过https连接集群Python代码示例:

# 连接集群
es = Elasticsearch(
    hosts=['https://<YourEsHost>:9200'],
    basic_auth=('<UserName>', '<YourPassword>'),
)

YourEsHost

集群访问地址,支持:

  • 私网地址

  • 公网地址

登录ES控制台,通过集群基本信息页查看地址。

9200

端口号为9200,通过集群基本信息页查看端口号。