ApsaraDB for SelectDB, bir Elasticsearch kataloğu aracılığıyla Elasticsearch verilerini doğrudan sorgulamayı destekler; bu sayede verileri taşımanıza gerek kalmadan birleşik OLAP analizi yapabilirsiniz. Katalog, Elasticsearch dizin meta verilerini otomatik olarak eşler ve hem Elasticsearch içindeki çoklu dizin birleştirmelerini hem de SelectDB ile Elasticsearch arasındaki sistemler arası birleştirmeleri destekler.
Desteklenen sürümler: Elasticsearch 5.X ve üzeri.
Ön koşullar
Başlamadan önce aşağıdakileri yaptığınızdan emin olun:
Elasticsearch kümenizdeki tüm düğümlerin SelectDB örneğine bağlı olması gerekir. Düğümler aynı sanal özel cloud (VPC) içinde yer almalı veya VPC'ler arası bağlantı yapılandırılmalıdır. Ayrıntılar için bkz. ApsaraDB for SelectDB örneği ile bir veri kaynağı arasında bağlantı kurulamazsa ne yapmalıyım?
Elasticsearch kümesi düğümlerinin IP adreslerinin SelectDB örneği IP adresi izin listesine eklenmiş olması gerekir. Bkz. IP adresi izin listesi yapılandırma
SelectDB örneğinin VPC IP adreslerinin, eğer küme böyle bir liste uyguluyorsa, Elasticsearch kümesinin izin listesine eklenmiş olması gerekir. SelectDB VPC IP adreslerini bulmak için bkz. ApsaraDB SelectDB örneğimin ait olduğu VPC'deki IP adreslerini nasıl görüntülerim?
SelectDB katalogları hakkında temel bilgi sahibi olmanız gerekir. Bkz. Veri göl ambarı
Elasticsearch kataloğu oluşturma
CREATE CATALOG test_es PROPERTIES (
"type"="es",
"hosts"="http://127.0.0.1:9200",
"user"="test_user",
"password"="test_passwd",
"nodes_discovery"="false"
);
Elasticsearch'te veritabanı kavramı bulunmadığından, SelectDB katalog altında otomatik olarak default_db adlı tek bir veritabanı oluşturur. SWITCH komutuyla kataloğa geçtikten sonra SelectDB otomatik olarak default_db veritabanına girer; USE default_db ifadesini kullanmanıza gerek yoktur.
Parametreler
| Parametre | Zorunlu | Varsayılan | Açıklama |
|---|---|---|---|
hosts |
Evet | — | Elasticsearch veri kaynağının URL'si. Bir veya daha fazla URL ya da kümenin önünde bulunan bir Server Load Balancer (SLB) örneğinin URL'si kabul edilir. |
user |
Hayır | — | Elasticsearch veri kaynağına erişmek için kullanılan hesap. |
password |
Hayır | — | Hesabın parolası. |
doc_value_scan |
Hayır | true | Alan değerlerini sorgulamak için sütun tabanlı depolamayı (doc_values) etkinleştirin. |
keyword_sniff |
Hayır | true | TEXT alanlarını algılayıp bunlara karşılık gelen KEYWORD alt alanları üzerinden sorgulama yapar. false olarak ayarlanırsa, sorgular TEXT alanından alınan belirteçlerle eşleşir. |
nodes_discovery |
Hayır | true | Otomatik düğüm keşfini etkinleştirir. Alibaba Cloud Elasticsearch kullanırken, trafik bir SLB örneği üzerinden yönlendirildiği ve düğümler doğrudan açığa çıkarılmadığı için false olarak ayarlayın. |
ssl |
Hayır | false | HTTPS erişimini etkinleştirir. SelectDB, SSL sertifikasının geçerliliğinden bağımsız olarak frontend (FE) ve backend (BE) düğümlerinden gelen tüm HTTPS isteklerine güvenir. |
mapping_es_id |
Hayır | false | Elasticsearch dizininden gelen _id meta veri alanını eşler. |
like_push_down |
Hayır | true | LIKE koşullarını Elasticsearch joker karakterlerine dönüştürerek bunları Elasticsearch'e aktarır. Bu işlem, Elasticsearch tarafındaki CPU kullanımını artırır. |
include_hidden_index |
Hayır | false | Gizli dizinleri dahil eder. |
Yalnızca HTTP temel kimlik doğrulaması desteklenir. Hesabın/_cluster/state/ve_nodes/httpuç noktalarına okuma erişiminin yanı sıra dizinlerde okuma izninin olması gerekir. HTTPS etkinleştirilmemişse hesap ve parola isteğe bağlıdır. Birden fazla tür içeren Elasticsearch 5.x veya 6.x dizinleri için SelectDB yalnızca ilk türden veri okur.
Veri sorgulama
Katalogu oluşturduktan sonra, Elasticsearch tablolarını dahili SelectDB tablolarını sorguladığınız şekilde sorgulayabilirsiniz. Aşağıdaki üç yaklaşım da eşdeğerdir:
-- Switch to the catalog, then query
SWITCH test_es;
SELECT * FROM es_table LIMIT 10;
-- Use the fully qualified database path
USE test_es.default_db;
SELECT * FROM es_table LIMIT 10;
-- Use the fully qualified table name directly
SELECT * FROM test_es.default_db.es_table LIMIT 10;
Harici Elasticsearch tabloları için Rollup, ön toplama ve materyalleştirilmiş görünümler kullanılamaz.
Temel sorgular
SELECT * FROM es_table WHERE k1 > 1000 AND k3 = 'term' OR k4 LIKE 'fu*z_';
Gelişmiş esquery
SQL ile ifade edilemeyen sorguları — örneğin match_phrase ve geo_shape — doğrudan Elasticsearch'e aktarmak için esquery(field, QueryDSL) işlevini kullanın. field parametresi sorguyu bir dizinle ilişkilendirir. QueryDSL parametresi, tam olarak bir kök anahtarı olan bir JSON nesnesidir.
match_phrase sorgusu:
SELECT * FROM es_table WHERE esquery(k4, '{"match_phrase": {"k4": "selectdb on es"}}');
geo_shape sorgusu:
SELECT * FROM es_table WHERE esquery(k4, '{"geo_shape": {"location": {"shape": {"type": "envelope", "coordinates": [[13, 53], [14, 52]]}, "relation": "within"}}}');
bool sorgusu:
SELECT * FROM es_table WHERE esquery(k4, '{"bool": {"must": [{"terms": {"k1": [11, 12]}}, {"terms": {"k2": [100]}}]}}');
Sütun türü eşlemeleri
| Elasticsearch türü | SelectDB türü | Notlar |
|---|---|---|
| NULL | NULL | |
| BOOLEAN | BOOLEAN | |
| BYTE | TINYINT | |
| SHORT | SMALLINT | |
| INTEGER | INT | |
| LONG | BIGINT | |
| UNSIGNED_LONG | LARGEINT | |
| FLOAT | FLOAT | |
| HALF_FLOAT | FLOAT | |
| DOUBLE | DOUBLE | |
| SCALED_FLOAT | DOUBLE | |
| DATE | DATE | Desteklenen biçimler: varsayılan, yyyy-MM-dd HH:mm:ss, yyyy-MM-dd, epoch_millis |
| KEYWORD | STRING | |
| TEXT | STRING | |
| IP | STRING | |
| NESTED | STRING | |
| OBJECT | STRING | |
| OTHER | DESTEKLENMİYOR |
ARRAY türü
Elasticsearch'te açık bir ARRAY türü bulunmaz ancak bir alan sıfır veya daha fazla değer içerebilir. SelectDB'de bir alanı dizi olarak bildirmek için dizin eşlemesinde _meta.selectdb altına bir array_fields girişi ekleyin.
doc dizini için örnek veri yapısı:
{
"array_int_field": [1, 2, 3, 4],
"array_string_field": ["selectdb", "is", "the", "best"],
"id_field": "id-xxx-xxx",
"timestamp_field": "2022-11-12T12:08:56Z",
"array_object_field": [{"name": "xxx", "age": 18}]
}
Dizi alanlarını bildirmek için eşlemeyi güncelleyin:
# Elasticsearch 7.x and later
curl -X PUT "localhost:9200/doc/_mapping?pretty" -H 'Content-Type: application/json' -d '
{
"_meta": {
"selectdb": {
"array_fields": [
"array_int_field",
"array_string_field",
"array_object_field"
]
}
}
}'
# Elasticsearch 6.x and earlier
curl -X PUT "localhost:9200/doc/_mapping?pretty" -H 'Content-Type: application/json' -d '
{
"_doc": {
"_meta": {
"selectdb": {
"array_fields": [
"array_int_field",
"array_string_field",
"array_object_field"
]
}
}
}
}'
En iyi uygulamalar
Filtre koşulu aktarma
SelectDB, filtre koşullarını Elasticsearch'e aktararak yalnızca eşleşen verilerin döndürülmesini sağlar; bu sayede her iki sistemde de CPU, bellek ve G/Ç yükü azalır. Aşağıdaki tabloda SQL operatörlerinin Elasticsearch Query DSL ile nasıl eşleştiği gösterilmektedir.
| SQL sözdizimi | Elasticsearch sorgusu |
|---|---|
= |
term sorgusu |
IN |
terms sorgusu |
>, <, >=, <= |
range sorgusu |
AND |
bool.filter |
OR |
bool.should |
NOT |
bool.must_not |
NOT IN |
bool.must_not + terms sorgusu |
IS NOT NULL |
exists sorgusu |
IS NULL |
bool.must_not + exists sorgusu |
esquery |
Yerel Query DSL |
Sorguları hızlandırmak için sütun taramasını etkinleştirme
Alan değerlerini _source alanı yerine sütun tabanlı depolamadan (doc_values) okumak için enable_docvalue_scan parametresini true olarak ayarlayın. Yalnızca birkaç sütun sorgulandığında, sütun taraması _source üzerinden okumaya göre on kat daha hızlı olabilir.
Sütun taraması etkinleştirildiğinde SelectDB iki ilke uygular:
En iyi çaba: Sorgulanan tüm alanlarda
doc_valueetkinse SelectDB tamamen sütun tabanlı depolamadan okuma yapar.Otomatik geri dönüş: Sorgulanan alanlardan herhangi biri
doc_valueiçermiyorsa SelectDB tüm alanlar için_sourceüzerinden okumaya geri döner.
TEXT alanları sütun tabanlı depolamayı kullanamaz. Sorguda bir TEXT alanı varsa SelectDB
_sourceüzerinden okuma yapar.25 veya daha fazla alan sorgulandığında, sütun taraması ile
_sourcearasındaki performans farkı ihmal edilebilir düzeydedir.
KEYWORD alanlarını algılama
STRING alanlarındaki eşitlik sorguları için SelectDB'nin otomatik olarak KEYWORD alt alanlarını kullanmasını sağlamak amacıyla enable_keyword_sniff parametresini true olarak ayarlayın.
Elasticsearch bir dizini otomatik olarak oluşturduğunda STRING alanları hem bir TEXT alanı hem de bir KEYWORD alt alanı alır:
"k4": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
Keyword sniffing olmadan, k4 = "SelectDB On ES" SQL koşulu şu Query DSL'i oluşturur:
"term": {"k4": "SelectDB On ES"}
k4 bir TEXT alanı olduğundan değeri selectdb, on ve es belirteçlerine ayrıştırılır; bunların hiçbiri tam ifadeyle eşleşmediği için sonuç dönmez.
enable_keyword_sniff parametresi true olarak ayarlandığında SelectDB koşulu otomatik olarak KEYWORD alt alanını hedefleyecek şekilde yeniden yazar:
"term": {"k4.keyword": "SelectDB On ES"}
KEYWORD alanı orijinal değiştirilmemiş değeri sakladığından tam ifade doğru şekilde eşleşir.
Düğüm keşfini etkinleştirme
SelectDB'nin parçaları atanmış tüm Elasticsearch veri düğümlerini keşfetmesine olanak tanımak için nodes_discovery parametresini true olarak ayarlayın.
Alibaba Cloud Elasticsearch trafiği bir SLB örneği üzerinden yönlendirir; bu durum, küme düğümlerine doğrudan erişimi engeller. Alibaba Cloud Elasticsearch'e bağlanırkennodes_discoveryparametresini her zamanfalseolarak ayarlayın.
HTTPS'yi etkinleştirme
Elasticsearch kümesine HTTPS üzerinden bağlanmak için ssl parametresini true olarak ayarlayın. SelectDB, SSL sertifikasının geçerliliğinden bağımsız olarak FE ve BE düğümlerinden gelen tüm HTTPS isteklerine güvenir.
Zaman alanlarını işleme
Bu bölümdeki yönergeler yalnızca harici Elasticsearch tabloları için geçerlidir. Elasticsearch katalogları için zaman alanları otomatik olarak DATE veya DATETIME türüne eşlenir.
Geniş bir giriş aralığını desteklemek için Elasticsearch'teki tarih alanı biçimini yapılandırın:
"dt": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
}
SelectDB'de alanı date, datetime veya varchar olarak tanımlayın. Aşağıdaki filtre koşullarının tümü doğru şekilde aktarılır:
SELECT * FROM doe WHERE k2 > '2020-06-21';
SELECT * FROM doe WHERE k2 < '2020-06-21 12:00:00';
SELECT * FROM doe WHERE k2 < 1593497011;
SELECT * FROM doe WHERE k2 < now();
SELECT * FROM doe WHERE k2 < date_format(now(), '%Y-%m-%d');
Elasticsearch'te
formatayarlanmamışsa varsayılan değerstrict_date_optional_time||epoch_millisolur.Elasticsearch'te bir DATE alanına zaman damgası değerleri aktarırken zaman damgası milisaniye cinsinden olmalıdır. Elasticsearch, dahili işleme için milisaniye hassasiyeti gerektirir; diğer birimler hata oluşmasına neden olur.
_id alanını sorgulama
Elasticsearch, içe aktarma sırasında belirtilmemişse her belgeye otomatik olarak genel olarak benzersiz bir _id atar. Harici bir tablodan _id değerini sorgulamak için bunu bir VARCHAR sütunu olarak bildirin:
CREATE EXTERNAL TABLE `doe` (
`_id` varchar COMMENT "",
`city` varchar COMMENT ""
) ENGINE=ELASTICSEARCH
PROPERTIES (
"hosts" = "http://127.0.0.1:8200",
"user" = "root",
"password" = "root",
"index" = "doe"
);
Bir Elasticsearch kataloğundan _id değerini sorgulamak için mapping_es_id parametresini true olarak ayarlayın.
_idalanını yalnızca=veyaINoperatörü kullanarak filtreleyin._idalanının türüVARCHARolmalıdır.
Sınırlamalar
Rollup, ön toplama, materyalleştirilmiş görünümler: Harici Elasticsearch tabloları için desteklenmez.
Nasıl çalışır
+----------------------------------------------+
| |
| SelectDB +------------------+ |
| | FE +--------------+-------+
| | | Request Shard Location
| +--+-------------+-+ | |
| ^ ^ | |
| | | | |
| +-------------------+ +------------------+ | |
| | | | | | | | |
| | +----------+----+ | | +--+-----------+ | | |
| | | BE | | | | BE | | | |
| | +---------------+ | | +--------------+ | | |
+----------------------------------------------+ |
| | | | | | |
| | | | | | |
| HTTP SCROLL | | HTTP SCROLL | |
+-----------+---------------------+------------+ |
| | v | | v | | |
| | +------+--------+ | | +------+-------+ | | |
| | | | | | | | | | |
| | | DataNode | | | | DataNode +<-----------+
| | | | | | | | | | |
| | | +<--------------------------------+
| | +---------------+ | | |--------------| | | |
| +-------------------+ +------------------+ | |
| Same Physical Node | |
| | |
| +-----------------------+ | |
| | | | |
| | MasterNode +<-----------------+
| ES | | |
| +-----------------------+ |
+----------------------------------------------+
Sorgu akışı aşağıdaki gibi çalışır:
FE, yapılandırılmış ana bilgisayara tüm düğümler için HTTP bağlantı noktası bilgilerini ve dizinin parça dağılımını almak üzere bir istek gönderir. İstek başarısız olursa FE, başarılı olana kadar ana bilgisayar listesini sırayla tarar.
FE, düğüm ve dizin meta verilerine dayalı olarak bir sorgu yürütme planı oluşturur ve bunu ilgili BE'lere gönderir.
Her BE, HTTP Scroll API kullanarak akış modunda atanan Elasticsearch dizin parçalarından eşzamanlı olarak veri çeker; sorguya bağlı olarak
_source(satır tabanlı) veya doc_values (sütun tabanlı) üzerinden okuma yapar.SelectDB nihai sonuçları hesaplar ve döndürür.