
Elasticsearch, büyük miktarda yapılandırılmamış veriyi hızlı bir şekilde aramak ve analiz etmek için kullanılan açık kaynak kodlu bir arama ve analiz motorudur. RESTful bir yapıya sahiptir ve özellikle log, işlem ve metin bazlı veri analitiği için idealdir. Elasticsearch, ölçeklenebilirliği sayesinde verileri indeksleyerek hızlı aramalar sağlar ve gerçek zamanlı analizlerle işletmelerin verilerini daha etkili kullanmalarına yardımcı olur. Büyük veri çözümlerinde yaygın olarak tercih edilen Elasticsearch, esneklik ve hız özellikleriyle öne çıkar.
Elasticsearch, ELK yığınının (Elastic, Logstash, Beats ve Kibana) bir parçası olarak çalışır. Ayrıca Grafana veya Knowi gibi diğer harici görselleştirme araçlarıyla da kullanılabilir.
İlk olarak Single Instance (tek node) bir Elasticsearch kurulum ve konfigürasyonu ardındanda 3 nodlu bir cluster kurulumu ile kurulumları inceliyor olacağız.
Bu yazıda single instance kurulum yapacağız, bir sonraki cluster kurulumunda master, ingest, data ve coordinator gibi node rollerini cluster kurulumunda detaylı açılıyor olacağız burada tek node bütün bu rollere sahip olacak.
Elasticsearch, çok yönlü ve güçlü özellikleriyle farklı alanlarda yaygın olarak kullanılmaktadır;
1. Log Analizi ve İzleme: Sistem loglarını hızlıca analiz etmek için kullanılır. Örneğin, Elastic Stack (ELK) ile sistemlerin log verilerini toplayıp gerçek zamanlı izlemeyi sağlar.
2. E-Ticaret: Arama motoru olarak kullanılarak ürün filtreleme, öneri ve kişiselleştirilmiş sonuçlar sunar.
3. Finansal Veriler: Hisse senedi fiyatları, işlem hacmi gibi büyük miktarda finansal veriyi analiz etmek için kullanılır.
4. Dokuman Aramaları: Döküman içerikleri indexlenerek dbüyük boyutlu döümanlar içerisinde istenen kelimlerin hızlıca araması işlerinde
Elasticsearch te bazı kavramlar RDBMS deki kavramlardan farklıdır bu kavramları o kavramlara dayandırarak karşılaştırmalı açıklamaya çalışırsak;
1. Tablo (RDBMS) – İndeks (Elasticsearch): RDBMS’de veriler tablolar halinde saklanırken Elasticsearch’te “indeks”ler veriyi saklar. İndeksler, veritabanındaki tablo benzeri yapılardır.
2. Satır (RDBMS) – Belge (Elasticsearch): RDBMS’deki her satır bir veri kaydıdır; Elasticsearch’te ise her veri kaydı “belge” olarak tanımlanır.
3. Sütun (RDBMS) – Alan (Elasticsearch): RDBMS’de sütunlar veritabanında bir alanı ifade ederken Elasticsearch’te “alan” olarak geçer ve belge içindeki bilgiyi temsil eder.
4. Primary Key (RDBMS) – _id (Elasticsearch): RDBMS’de “primary key” benzersiz bir kimliktir; Elasticsearch’te ise bu, _id alanıyla sağlanır ve her belgeyi benzersiz olarak tanımlar.
5. İlişki (Join): RDBMS’lerde tablolar arasında ilişkiler kurmak mümkündür (foreign key); Elasticsearch’te ise ilişkiler tam olarak desteklenmez ve genelde nested ya da parent-child belgeleriyle çözülür.
Elasticsearch, özellikle metin ve analiz gerektiren veriler için daha uygun ve esnektir, RDBMS ise katı veri bütünlüğü gerektiren yapılar için tercih edilir.
Temel kavramlardan bahsettikten sonra kuruluma başlayalım; kurulum ile ilgili olarak en güncel versiyon ve kurulum bilgileri oficial oılarak aşağıdaki linkten takip edilebilir;
https://www.elastic.co/guide/en/elasticsearch/reference/8.15/rpm.html#rpm-repo
Öncelikle repo dsoyamızı oluşturalım, sign GPG-KEY key indirelim
rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
Repo dosyamızı oluşturalım /etc/yum.repos.d/
dizini altında elasticsearch.repo dosyamızı oluşturalım ve içeriğini aşapıdaki gibi yapılandıralım;
[elasticsearch]
name=Elasticsearch repository for 8.x packages
baseurl=https://artifacts.elastic.co/packages/8.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=0
autorefresh=1
type=rpm-md
Şimdi elasticsearch indirebiliriz, ancak öncelikle jdk yüklümü kontrol edelim yoka yükleyelim, aslında elastic içerisinde bir open jdk içermekte ve ve bu jdk yı yüklemesekte çalışacaktır, ancak biz yinede makinede bir jdk yükü olmasını sağlayacağız.
# dnf install java-11-openjdk
# java -version
openjdk version "11.0.25" 2024-10-15 LTS
OpenJDK Runtime Environment (Red_Hat-11.0.25.0.9-1) (build 11.0.25+9-LTS)
OpenJDK 64-Bit Server VM (Red_Hat-11.0.25.0.9-1) (build 11.0.25+9-LTS, mixed mode, sharing)
# dnf install --enablerepo=elasticsearch elasticsearch
DigitalOcean Droplet Agent 57 kB/s | 3.3 kB 00:00
Elasticsearch repository for 8.x packages 88 MB/s | 74 MB 00:00
Dependencies resolved.
=========================================================================================================================================
Package Architecture Version Repository Size
=========================================================================================================================================
Installing:
elasticsearch x86_64 8.15.3-1 elasticsearch 581 M
Transaction Summary
=========================================================================================================================================
Install 1 Package
Total download size: 581 M
Installed size: 1.1 G
Is this ok [y/N]: y
Downloading Packages:
elasticsearch-8.15.3-x86_64.rpm 8.5 MB/s | 581 MB 01:08
-----------------------------------------------------------------------------------------------------------------------------------------
Total 8.5 MB/s | 581 MB 01:08
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Running scriptlet: elasticsearch-8.15.3-1.x86_64 1/1
Creating elasticsearch group... OK
Creating elasticsearch user... OK
Installing : elasticsearch-8.15.3-1.x86_64 1/1
Running scriptlet: elasticsearch-8.15.3-1.x86_64 1/1
--------------------------- Security autoconfiguration information ------------------------------
Authentication and authorization are enabled.
TLS for the transport and HTTP layers is enabled and configured.
The generated password for the elastic built-in superuser is : lo9RA4-bq7HGPXX+jxRl
If this node should join an existing cluster, you can reconfigure this with
'/usr/share/elasticsearch/bin/elasticsearch-reconfigure-node --enrollment-token <token-here>'
after creating an enrollment token on your existing cluster.
You can complete the following actions at any time:
Reset the password of the elastic built-in superuser with
'/usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic'.
Generate an enrollment token for Kibana instances with
'/usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s kibana'.
Generate an enrollment token for Elasticsearch nodes with
'/usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s node'.
-------------------------------------------------------------------------------------------------
### NOT starting on installation, please execute the following statements to configure elasticsearch service to start automatically using systemd
sudo systemctl daemon-reload
sudo systemctl enable elasticsearch.service
### You can start elasticsearch service by executing
sudo systemctl start elasticsearch.service
[/usr/lib/tmpfiles.d/elasticsearch.conf:1] Line references path below legacy directory /var/run/, updating /var/run/elasticsearch → /run/elasticsearch; please update the tmpfiles.d/ drop-in file accordingly.
Verifying : elasticsearch-8.15.3-1.x86_64 1/1
Installed:
elasticsearch-8.15.3-1.x86_64
Complete!
RPM i manuel indirmek için;
# wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.15.3-x86_64.rpm
Elastic kurulumunda yukarıdaki kurulum outputunda bazı yönergeler görünmektedir , bir clustera dahil olma vs, komutları biz burada single instance kurulum yaptığımız için elasticsearch super user password değişikliği ile servislerin enable ve start işlemleri yapılacak, ssl, tsl ve bazı güvenlik işlemleri otomatik yapılandırılmış olarak bize gelmektedir.
# sudo systemctl daemon-reload
# sudo systemctl enable elasticsearch.service
# sudo systemctl start elasticsearch.service
Elsaticsearch password değişimi için, default olarak elastic adında bir super user yapılandırılmış olarak gelir, daha sonra farklı user ve yetkiler tanımlayabilirsiniz, farklı bir super user tanımlayıp kullanabilirsinizde. elastic superuser şifresini saklamalıyız unutursak aşağıdaki gibi değiştirebiliriz
# /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic
This tool will reset the password of the [elastic] user to an autogenerated value.
The password will be printed in the console.
Please confirm that you would like to continue [y/N]y
Password for the [elastic] user successfully reset.
New value: -XXXXXXXXXXXXXXXX-
Elasticsearch durumunu gözlemek için aşağıdaki gibi kontrol edilebilir;
# export ELASTIC_PASSWORD="XXXXXXXXXXX"
# curl --cacert /etc/elasticsearch/certs/http_ca.crt -u elastic:$ELASTIC_PASSWORD https://localhost:9200
{
"name" : "elastcidb01",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "OuFO3bINR0GQfbeynt6_Uw",
"version" : {
"number" : "8.15.3",
"build_flavor" : "default",
"build_type" : "rpm",
"build_hash" : "f97532e680b555c3a05e73a74c28afb666923018",
"build_date" : "2024-10-09T22:08:00.328917561Z",
"build_snapshot" : false,
"lucene_version" : "9.11.1",
"minimum_wire_compatibility_version" : "7.17.0",
"minimum_index_compatibility_version" : "7.0.0"
},
"tagline" : "You Know, for Search"
}
# curl -X GET "https://localhost:9200/_cluster/health?wait_for_status=yellow&timeout=50s&pretty" --key certificates/elasticsearch-ca.pem -k -u elastic
Enter host password for user 'elastic':
{
"cluster_name" : "elasticsearch",
"status" : "green",
"timed_out" : false,
"number_of_nodes" : 1,
"number_of_data_nodes" : 1,
"active_primary_shards" : 1,
"active_shards" : 1,
"relocating_shards" : 0,
"initializing_shards" : 0,
"unassigned_shards" : 0,
"delayed_unassigned_shards" : 0,
"number_of_pending_tasks" : 0,
"number_of_in_flight_fetch" : 0,
"task_max_waiting_in_queue_millis" : 0,
"active_shards_percent_as_number" : 100.0
}
Tek node olduğu için index create drop işleminden sonra clsuter status u yellow a düşebilir, aşağıdaki komut ile nerede problem olduğunu tespit edebilirsiniz, aşağıda UNASSIGNED olan işler var bu cluster durumunu yellow yapar
curl -u elastic:$ELASTIC_PASSWORD --cacert /etc/elasticsearch/certs/http_ca.crt -X GET "https://localhost:9200/_cat/shards?v" index shard prirep state docs store dataset ip node
.slo-observability.sli-v3.3 0 p STARTED 0 249b 249b 127.0.0.1 elastcidb01
.internal.alerts-observability.threshold.alerts-default-000001 0 p STARTED 0 249b 249b 127.0.0.1 elastcidb01
.internal.alerts-observability.uptime.alerts-default-000001 0 p STARTED 0 249b 249b 127.0.0.1 elastcidb01
.ds-.kibana-event-log-ds-2024.10.30-000001 0 p STARTED 2 12.5kb 12.5kb 127.0.0.1 elastcidb01
.kibana_8.15.3_001 0 p STARTED 248 81.6kb 81.6kb 127.0.0.1 elastcidb01
.metrics-endpoint.metadata_united_default 0 p STARTED 0 249b 249b 127.0.0.1 elastcidb01
.kibana_task_manager_8.15.3_001 0 p STARTED 29 107.6kb 107.6kb 127.0.0.1 elastcidb01
.internal.alerts-ml.anomaly-detection-health.alerts-default-000001 0 p STARTED 0 249b 249b 127.0.0.1 elastcidb01
.internal.alerts-security.alerts-default-000001 0 p STARTED 0 249b 249b 127.0.0.1 elastcidb01
.internal.alerts-observability.logs.alerts-default-000001 0 p STARTED 0 249b 249b 127.0.0.1 elastcidb01
.security-7 0 p STARTED 151 392.9kb 392.9kb 127.0.0.1 elastcidb01
.slo-observability.summary-v3.3 0 p STARTED 0 249b 249b 127.0.0.1 elastcidb01
.apm-custom-link 0 p STARTED 0 249b 249b 127.0.0.1 elastcidb01
.geoip_databases 0 p STARTED 38 36.5mb 36.5mb 127.0.0.1 elastcidb01
.kibana_ingest_8.15.3_001 0 p STARTED 1727 5mb 5mb 127.0.0.1 elastcidb01
.transform-internal-007 0 p STARTED 6 61.5kb 61.5kb 127.0.0.1 elastcidb01
.ds-.items-default-2024.10.30-000001 0 p STARTED 0 249b 249b 127.0.0.1 elastcidb01
.ds-.items-default-2024.10.30-000001 0 r UNASSIGNED
.transform-notifications-000002 0 p STARTED 12 16.2kb 16.2kb 127.0.0.1 elastcidb01
Cluster durumu yellow , bunu n nedeni bir index in replika sayısı 0 değil ancak. bizim cluster tek node o yüzden bu hata laınıyor aşağıdaki gibi bir ayar ile bu durum düzelecektir. Tüm index replika countları 0 a çekilir.
curl -X PUT "https://localhost:9200/_settings" -u elastic:$ELASTIC_PASSWORD --cacert /etc/elasticsearch/certs/http_ca.crt -H 'Content-Type: application/json' -d'
{
"index" : {
"number_of_replicas" : 0
}
}
'
Bir yanıt yazın