Hubungkan ke kluster Alibaba Cloud Elasticsearch menggunakan Java, Python, atau Go.
Sebelum Anda mulai
Dapatkan titik akhir kluster
Anda dapat menghubungkan ke kluster Elasticsearch melalui titik akhir internal melalui jaringan pribadi VPC atau titik akhir publik.
-
Titik akhir internal: Menyediakan koneksi berlatensi rendah dan stabilitas tinggi ke kluster Elasticsearch Anda. Titik akhir ini diaktifkan secara default saat pembuatan kluster.
-
Titik akhir publik: Memungkinkan Anda menghubungkan ke kluster Elasticsearch melalui internet. Anda harus mengaktifkan titik akhir ini secara manual.
Aktifkan akses publik
-
Masuk ke Konsol Elasticsearch dan buka halaman Basic Information instans Anda.
-
Pada panel navigasi, pilih Configuration and Management > Security Settings, lalu aktifkan akses publik. Akses publik diaktifkan setelah status kluster berubah dari Initializing menjadi Valid.
Setelah akses publik diaktifkan, titik akhir publik memiliki format
es-cn-<instance_ID>.public.elasticsearch.aliyuncs.com. Daftar putih IP publik kosong secara default dan harus dikonfigurasi.PentingPenggunaan titik akhir publik dapat membahayakan keamanan kluster Elasticsearch Anda. Jika menggunakan titik akhir publik, pastikan untuk mengonfigurasi daftar putih IP dan menonaktifkan akses publik setelah selesai.
Konfigurasikan daftar putih IP
Untuk mengamankan kluster Anda, tambahkan alamat IP perangkat yang akan digunakan untuk mengakses ke daftar putih jaringan pribadi VPC atau daftar putih IP publik kluster Elasticsearch. Hanya perangkat dengan alamat IP dalam daftar putih yang dapat mengakses kluster.
-
Dapatkan alamat IP perangkat yang akan digunakan untuk akses.
Tabel berikut menjelaskan cara mendapatkan alamat IP untuk berbagai skenario.
Skenario
Alamat IP
Metode
Hubungkan ke kluster Elasticsearch dari perangkat lokal
Alamat IP publik perangkat lokal Anda.
Jika perangkat lokal Anda berada dalam jaringan area lokal (LAN), seperti jaringan rumah atau perusahaan, tambahkan alamat IP publik gerbang LAN ke daftar putih IP publik kluster.
Jalankan perintah
curl ipinfo.io/ipuntuk menemukan IP publik perangkat lokal Anda.Hubungkan ke kluster Elasticsearch dari Instance ECS di VPC berbeda
IP publik Instance ECS tersebut.
Masuk ke Konsol ECS untuk melihatnya dalam daftar instans.
Hubungkan ke kluster Elasticsearch dari Instance ECS di VPC yang sama
IP privat Instance ECS tersebut.
Masuk ke Konsol ECS untuk melihatnya dalam daftar instans.
-
Tambahkan alamat IP tersebut ke grup daftar putih.
-
Masuk ke Konsol Elasticsearch. Pada halaman Basic Information instans Anda, pilih Configuration and Management > Security Settings di panel navigasi, lalu klik Modify untuk mengonfigurasi jaringan pribadi VPC atau daftar putih IP publik.
-
Klik Configure di sebelah kanan grup default. Pada kotak dialog yang muncul, tambahkan alamat IP ke daftar putih jaringan pribadi VPC atau IP publik. Anda dapat menambahkan hingga 300 alamat IP atau Blok CIDR ke kluster. Pisahkan beberapa entri dengan koma (,) tanpa spasi di sekitarnya.
-
Anda juga dapat mengklik Add IP address whitelist Group untuk membuat grup kustom.
-
Grup daftar putih hanya digunakan untuk manajemen alamat IP dan tidak memengaruhi izin akses. Semua alamat IP di seluruh grup memiliki izin yang sama.
Jenis konfigurasi
Format dan contoh
Catatan penting
Format alamat IPv4
-
IP tunggal:
192.168.0.1 -
Blok CIDR:
192.168.0.0/24
-
Tolak semua akses:
127.0.0.1 -
Izinkan semua akses:
0.0.0.0/0PentingIni menimbulkan risiko keamanan tinggi. Kami sangat menyarankan agar Anda tidak mengonfigurasi
0.0.0.0/0.Beberapa versi kluster (seperti 7.16 dan 8.5) dan wilayah tidak mendukung
0.0.0.0/0. Lihat UI konsol atau pesan error untuk detailnya.
Format alamat IPv6
(Didukung hanya untuk kluster arsitektur penerapan v2 di wilayah Tiongkok (Hangzhou))
-
IP tunggal:
2401:XXXX:1000:24::5 -
Blok CIDR:
2401:XXXX:1000::/48
-
Tolak semua akses:
::1 -
Izinkan semua akses:
::/0PentingIni menimbulkan risiko keamanan tinggi. Kami sangat menyarankan agar Anda tidak mengonfigurasi
::/0.Beberapa versi kluster tidak mendukung
::/0. Lihat petunjuk UI konsol atau konfigurasi untuk detailnya.
-
-
Klik OK.
-
Protokol dan sertifikat
-
Pastikan versi klien (Java, Python, atau Go) sesuai dengan waktu proses dasar kluster ES.
-
HTTPS publik: Menggunakan sertifikat yang dikeluarkan oleh CA. Tidak diperlukan konfigurasi klien khusus — hubungkan langsung melalui
https://. -
HTTPS privat: Menggunakan Sertifikat tanda tangan sendiri. Lewati verifikasi sertifikat di klien seperti yang ditunjukkan di bawah.
Hubungkan ke kluster
Java
-
Instal Java Development Kit (JDK) 1.8 atau yang lebih baru.
-
Konfigurasikan dependensi Maven.
PentingAtur
versionagar sesuai dengan versi kluster Anda (8.17.0 dalam contoh ini). Nilaiversionyang tidak sesuai menyebabkan kegagalan resolusi dependensi.<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> -
Konfigurasikan parameter YML untuk mengaktifkan pembuatan indeks otomatis:
action.auto_create_index: true. Contoh berikut membuat indeks bernama hr_test.
Contoh koneksi dasar
Berlaku untuk koneksi HTTPS publik atau HTTP privat:
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) {
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("{UserName}", "{YourPassword}"));
// Gunakan "https" untuk akses HTTPS publik atau "http" untuk akses HTTP privat.
RestClient restClient = RestClient.builder(new HttpHost("{YourEsHost}", 9200, "https"))
.setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
@Override
public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
}
}).build();
ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());
ElasticsearchClient elasticsearchClient = new ElasticsearchClient(transport);
try {
CreateIndexResponse indexRequest = elasticsearchClient.indices().create(createIndexBuilder -> createIndexBuilder
.index("hr_test")
.aliases("foo", aliasBuilder -> aliasBuilder.isWriteIndex(true))
);
System.out.println("Dokumen indeks berhasil dibuat! " + indexRequest.acknowledged());
transport.close();
restClient.close();
} catch (IOException ioException) {
// Tangani pengecualian.
}
}
}
Contoh koneksi HTTPS privat
Untuk HTTPS privat, lewati verifikasi sertifikat:
package org.example;
import co.elastic.clients.elasticsearch.ElasticsearchClient;
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.conn.ssl.NoopHostnameVerifier;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
import org.apache.http.ssl.SSLContexts;
import org.elasticsearch.client.*;
import javax.net.ssl.SSLContext;
public class RestClientTestPrivateHttps {
public static void main(String[] args) throws Exception {
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("{UserName}", "{YourPassword}"));
// Buat SSLContext yang mempercayai semua sertifikat.
SSLContext sslContext = SSLContexts.custom()
.loadTrustMaterial(null, (chain, authType) -> true) // Percaya semua sertifikat.
.build();
RestClient restClient = RestClient.builder(new HttpHost("{YourEsHost}", 9200, "https"))
.setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
@Override
public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
return httpClientBuilder
.setDefaultCredentialsProvider(credentialsProvider)
.setSSLContext(sslContext) // Atur SSLContext.
.setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE); // Lewati verifikasi hostname.
}
}).build();
ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());
ElasticsearchClient elasticsearchClient = new ElasticsearchClient(transport);
// Lakukan operasi.
System.out.println(elasticsearchClient.info());
transport.close();
restClient.close();
}
}
Python
Contoh-contoh ini menggunakan ES 8.17.0. Ganti dengan versi kluster Anda.
Contoh koneksi dasar
Berlaku untuk koneksi HTTPS publik atau HTTP privat:
pip install elasticsearch==8.17.0from elasticsearch import Elasticsearch
es = Elasticsearch(
hosts=['https://<YourEsHost>:9200'], # Gunakan 'https://' untuk akses HTTPS publik atau 'http://' untuk akses HTTP privat.
basic_auth=('<UserName>', '<YourPassword>'),
)
print(es.info())
Contoh koneksi HTTPS privat
from elasticsearch import Elasticsearch
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) # Nonaktifkan peringatan SSL (opsional).
es = Elasticsearch(
hosts=['https://<YourEsHost>:9200'],
basic_auth=('<UserName>', '<YourPassword>'),
verify_certs=False, # Lewati verifikasi sertifikat.
ssl_show_warn=False, # Nonaktifkan peringatan SSL.
)
print(es.info())
Go
Contoh-contoh ini menggunakan Elasticsearch Go Client untuk kluster ES 8.x.
Contoh koneksi dasar
Berlaku untuk koneksi HTTPS publik atau HTTP privat:
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{"https://<YourEsHost>:9200"}, // Gunakan "https://" untuk akses HTTPS publik atau "http://" untuk akses HTTP privat.
Username: "<UserName>",
Password: "<YourPassword>",
}
es, _ := elasticsearch.NewClient(cfg)
res, _ := es.Info()
defer res.Body.Close()
log.Println(res)
}
Contoh koneksi HTTPS privat
package main
import (
"crypto/tls""net/http""github.com/elastic/go-elasticsearch/v8""log"
)
func main() {
cfg := elasticsearch.Config{
Addresses: []string{"https://<YourEsHost>:9200"},
Username: "<UserName>",
Password: "<YourPassword>",
Transport: &http.Transport{
TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, // Lewati verifikasi sertifikat.
},
}
es, _ := elasticsearch.NewClient(cfg)
res, _ := es.Info()
defer res.Body.Close()
log.Println(res)
}
Parameter
|
Parameter |
Deskripsi |
|
UserName |
Username default adalah Hindari akun ini di lingkungan produksi. Buat peran kustom dengan izin detail halus menggunakan Manage user permissions by using Elasticsearch X-Pack roles. |
|
YourPassword |
Password untuk |
|
https |
Protokol akses. HTTP diaktifkan secara default. Untuk keamanan, aktifkan HTTPS secara manual. Di Konsol Elasticsearch, buka halaman Basic Information instans Anda, lalu pilih Configuration and Management > Security Settings untuk mengaktifkan HTTPS. Penting
|
|
YourEsHost |
Titik akhir kluster (VPC atau publik) dari Prasyarat:
|
|
9200 |
Port akses kluster. Default: 9200 untuk akses VPC maupun publik. |
FAQ
Jika status kluster sehat tetapi klien tidak dapat terhubung, lakukan troubleshooting menggunakan metode berikut.
Diagnostik tabel rute
Jika koneksi ES gagal dalam VPC yang sama, periksa tabel rute. Instalasi Docker dapat mengubah informasi rute, sehingga entri rute ke segmen jaringan ES hilang atau mengarah ke gerbang yang salah. Jalankan perintah berikut pada Instance ECS untuk melihat tabel rute:
route -n
Periksa apakah terdapat entri rute ke segmen jaringan ES dalam output. Jika entri rute hilang atau gerbang salah, perbaiki konfigurasi rute dan coba kembali koneksi. Periksa juga apakah firewall perusahaan memblokir trafik ke segmen jaringan ES.
Verifikasi domain dan port
Gunakan perintah curl untuk memverifikasi bahwa nama domain dan port telah ditentukan dengan benar:
curl -u {UserName}:{YourPassword} https://{YourEsHost}:9200
Tanggapan "Could not resolve host" menunjukkan kesalahan pengetikan nama domain. Kesalahan umum termasuk karakter yang hilang dalam nama domain atau penghilangan nomor port.
Konfigurasi parameter timeout klien
Klien Java tidak mengatur timeout koneksi atau timeout soket secara default. Pada jaringan yang tidak stabil, koneksi dapat menggantung tanpa batas. Gunakan setRequestConfigCallback untuk mengonfigurasi parameter timeout:
RestClient restClient = RestClient.builder(new HttpHost("{YourEsHost}", 9200, "https"))
.setRequestConfigCallback(builder -> builder
.setConnectTimeout(10000)
.setSocketTimeout(30000))
.setHttpClientConfigCallback(httpClientBuilder ->
httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider))
.build();
ConnectTimeout mengontrol durasi menunggu koneksi terbentuk — diatur ke 10.000 milidetik (10 detik). SocketTimeout mengontrol durasi menunggu data dibaca — diatur ke 30.000 milidetik (30 detik). Sesuaikan nilai-nilai ini berdasarkan lingkungan jaringan Anda.
Cara menguji latensi jaringan dari Instance ECS ke kluster Elasticsearch dan catatan tentang akses jaringan publik
Instance ECS di luar VPC kluster Anda dapat memanggil Elasticsearch melalui titik akhir publik, dan akses publik merupakan metode koneksi yang didukung. Sebelum menggunakannya, pastikan akses publik telah diaktifkan untuk kluster dan alamat IP publik Instance ECS berada dalam daftar putih akses publik. Keduanya dijelaskan di awal topik ini.
Koneksi publik melewati lebih banyak hop dan jalur jaringan yang lebih panjang dibandingkan koneksi melalui titik akhir internal di jaringan pribadi VPC, sehingga latensinya jauh lebih tinggi dan lebih sensitif terhadap jitter tautan. Untuk lingkungan produksi, gunakan titik akhir internal melalui jaringan pribadi VPC. Cadangkan akses publik untuk pengujian, troubleshooting sementara, atau kasus di mana jalur jaringan pribadi tidak dapat dibentuk.
Untuk mengukur kualitas jaringan antara Instance ECS dan kluster, jalankan salah satu pemeriksaan berikut pada Instance ECS.
-
Gunakan ping untuk memverifikasi konektivitas dasar dan amati waktu round-trip (RTT):
ping {YourEsHost}Periksa RTT rata-rata dan tingkat kehilangan paket dalam output. RTT rata-rata yang tinggi atau adanya kehilangan paket menunjukkan kualitas tautan yang buruk. Beberapa lingkungan jaringan dan kebijakan keamanan memblokir ICMP, sehingga hasil ping yang tidak dapat dijangkau tidak selalu berarti layanan Elasticsearch tidak tersedia. Dalam kasus tersebut, konfirmasi konektivitas port dengan perintah curl dalam entri "Verifikasi domain dan port" FAQ ini.
-
Gunakan MTR untuk pelacakan jalur jaringan hop-per-hop guna menemukan bottleneck. MTR adalah tool diagnostik jaringan umum yang harus Anda instal sendiri pada Instance ECS:
mtr -r -c 100 {YourEsHost}Tinjau tingkat kehilangan paket dan latensi setiap hop. Jika tingkat kehilangan paket atau latensi terus meningkat mulai dari hop tertentu, bottleneck berada di hop tersebut atau setelahnya. Ini membantu mengidentifikasi apakah masalah berada di sisi ECS, di jaringan publik perantara, atau di sisi akses.
Jika latensi yang diukur tinggi dan workload Anda sensitif terhadap latensi, beralihlah ke titik akhir internal melalui jaringan pribadi VPC di wilayah dan VPC yang sama. Kemudian sesuaikan timeout koneksi dan pembacaan seperti yang dijelaskan dalam entri "Konfigurasi parameter timeout klien" FAQ ini.
Penanganan kesalahan "No alive nodes found" yang sering terjadi dan tetap muncul setelah penskalaan kluster
Kesalahan No alive nodes found berarti klien tidak dapat menemukan node yang tersedia dalam daftar node yang dikelolanya. Biasanya disebabkan oleh konektivitas jaringan yang tidak stabil, timeout permintaan, atau routing abnormal antara klien dan kluster, bukan karena sumber daya kluster yang tidak mencukupi. Oleh karena itu, penskalaan kluster sering kali tidak menyelesaikan kesalahan ini. Selidiki koneksi jaringan terlebih dahulu.
-
Identifikasi jalur jaringan yang digunakan klien untuk mencapai kluster. Tentukan apakah klien terhubung melalui titik akhir internal di jaringan pribadi VPC atau melalui titik akhir publik. Lalu periksa adanya akses lintas wilayah, akses lintas-VPC, atau jalur jaringan publik yang panjang, yang semuanya membuat probing node lebih rentan gagal karena jitter jaringan.
Untuk koneksi jaringan publik atau koneksi antar-wilayah, ukur kualitas tautan seperti yang dijelaskan dalam entri "Cara menguji latensi jaringan dari Instance ECS ke kluster Elasticsearch dan catatan tentang akses jaringan publik" FAQ ini. Kemudian beralihlah ke titik akhir internal melalui jaringan pribadi VPC di wilayah dan VPC yang sama.
-
Periksa konteks log klien. Alih-alih hanya membaca baris
No alive nodes found, periksa kesalahan yang dicatat di sekitarnya untuk timeout koneksi, timeout soket, kegagalan Proses jabat tangan SSL/TLS, atau kegagalan verifikasi sertifikat. Kesalahan pendamping tersebut menentukan tindakan selanjutnya: sesuaikan parameter timeout atau perbaiki konfigurasi protokol dan sertifikat yang dijelaskan dalam bagian "Protokol dan sertifikat" topik ini. -
Gabungkan pemeriksaan yang telah disediakan FAQ ini. Ikuti entri "Diagnostik tabel rute" untuk memverifikasi bahwa entri rute ke segmen jaringan ES ada dan mengarah ke gerbang yang benar. Misalnya, instalasi Docker dapat mengubah informasi rute. Verifikasi juga bahwa tidak ada firewall yang memblokir trafik ke segmen jaringan ES.
Kemudian ikuti entri "Konfigurasi parameter timeout klien" untuk mengatur timeout koneksi dan timeout soket eksplisit di klien. Timeout eksplisit mencegah permintaan menggantung terlalu lama pada jaringan yang tidak stabil dan menyebabkan node dianggap tidak tersedia.
Jika tidak ada pemeriksaan lapisan jaringan ini yang mengungkap masalah, gunakan data pemantauan kluster untuk mengonfirmasi apakah benar-benar terjadi bottleneck sumber daya. Jangan anggap penskalaan kluster sebagai solusi pertama.