Elasticsearch AWS EC2 Discovery Plugin’i ile Cluster Kurulumu

--

Bu yazıda elasticsearch servisinden ve EC2 discovery plugini ile yönetiminden kısaca bahsedeceğim. Keyifli okumalar.

Elasticsearch nedir ve niçin kullanılır?

Elasticsearch açık kaynak kodlu, Apache Lucene üzerinde geliştirilmiş RESTful API’a sahip bir search engine’dir. Verileri doküman bazlı depolar ve metinleri index’leyerek yazma ve okumada yüksek performans sağlar.

Mottoları olan “You know, for search!” söyleminden yola çıkarak, bu servisi search engine olarak kullanmamız gerektiğini düşünüyorum.

Elasticsearch Cluster

Çoğu ortamda olduğu gibi elasticsearch’te de control plane ile data plane’i ayırmak ve high-availability’i sağlamak gerekir. Bu yüzden cluster oluşturmamız ve ilgili instance’lara rollerini vererek bu servisi kullanmalıyız.

Clusterdaki her instance node olarak adlandırılır ve her node rollere sahiptir. Control plane’de yer alan node’lar master, data plane’dekiler ise data rolündedirler. Master node, cluster’ın yönetimi, node’ların durumu, yeni node eklenmesi-çıkarılması işlerinden, data node ise verinin depolanması, işlenmesi, okuma ve yazma gibi işlemlerden sorumludur.

Elasticsearch servisi cluster oluşumunda, gömülü ve defaultta gelen zen discovery’i kullanır. Zen discovery unicast iletişim sağlar bu yüzden servis konfigürasyonunda cluster dahil olacak tüm node’ların IP ya da IP çözümlemesini yapabilecek bir şekilde hostname veya DNS kaydı da girilebilir. Master election’ın sorunsuz bir şekilde gerçekleşmesi ve split brain’i önlemek için clusterdaki node sayısını tek sayı yapmanız ve master rolünü alacak node’un clusterdaki node sayısının, bir fazlasının yarısının “(n+1)/2” oyunu alacak şekilde yapılandırmanız gerekmektedir.

discovery.zen.minimum_master_nodes: 2
discovery.zen.ping.unicast.hosts: 10.10.10.1, 10.10.10.2, 10.10.10.3

Neden EC2 Discovery Plugin?

Kısa bir girişin ardından asıl konumuz olan EC2 discovery plugine neden ihtiyaç duyduğumuz ve kurulumunu nasıl yapacağımız kısmına geldik.

Elasticsearch servisinin konfigürasyonunda bir değişiklik yaptığınızda servisi baştan başlatmanız gerekir ve bu durum clustera yeni bir node eklemek istediğinizde clusterdaki tüm node’ların konf dosyalarına yeni ekleyeceğiniz node’un IP’sini yazmanıza ve servisi baştan başlatmanıza haliyle servis kesintisi vermenize yol açar. Tam bu noktada AWS güzelliğini konuşturuyor ve bu plugini bizlere sunuyor. Bu arada elasticsearch son versiyonunda (7.x) bu sorunu discovery modülünü değiştirerek çözdü. Dokümana buradan ulaşabilirsiniz.

Eğer AWS kullanıyorsanız elasticsearch’ü servis olarak da satın alabilirsiniz fakat maliyeti oldukça yüksek. Servis dokümantasyonunun çok iyi ve komünitenin oldukça kalabalık olması, maintainingi kolaylaştırıyor haliyle yüksek maliyetlere girmenize gerek kalmıyor.

Pluginin çalışma prensibi oldukça basit; AWS’in API’yla konuşup platformunuzu keşfediyor ve instance’ın özelliklerinden cluster’a dahil olması gereken node’ları seçip clusterı oluşturuyor. Pluginin çalışması için AWS tarafında yapmanız gerkenler;

1- Clustera dahil olacak instance’lara discovery için permission vermeliyiz bu yüzden IAM rolü tanımlamanız gerekir. IAM policy’sini aşağıdaki gibi tanımlayabilirsiniz.

{
"Statement": [
{
"Action": [
"ec2:DescribeInstances"
],
"Effect": "Allow",
"Resource": [
"*"
]
}
],
"Version": "2012-10-17"
}

2. Clustera dahil olacak her instance’a pluginin kullanacağı bir tag basmanız gerekiyor. Benim örneğimde key: elastic value: dev olacak.

  1. Bu işlemleri yaptıysanız kuruluma başlayabilirsiniz. İlk olarak servisin home directoy’sine geçip, plugini yüklemeliyiz. (CentOS 7 kullanıyorum, farklı bir OS kullanıyorsanız ya da servisin dizinini değiştirdiyseniz ona göre işlem yapın.)
cd /usr/share/elasticsearch/
sudo bin/elasticsearch-plugin install discovery-ec2

2. Daha sonrasında servisin konfigürasyon dosyasını aşağıdaki gibi düzenleyin.

vim /etc/elasticsearch/elasticsearch.ymldiscovery:
ec2:
endpoint: ec2.eu-central-1.amazonaws.com
discovery.ec2.tag.elastic: dev
discovery.zen.hosts_provider: ec2
discovery.ec2.any_group: true
discovery.ec2.host_type: private_ip
cloud.node.auto_attributes: true
cluster.routing.allocation.awareness.attributes: aws_availability_zone

Burada dikkat etmeniz gerekenler;

  1. endpoint: hangi regionda iseniz oranın API endpointini kullanmalısınız. Bu listeden Amazon VPC altında bulabilirsiniz.
  2. discovery.ec2.tag.{{ key }}: {{ value }} instance’a nasıl verdisyeniz öyle olmalı.
  3. discovery.ec2.host_type: <private_ip> dışında da seçenekler sunar. Private IP kullanmak istemiyorsanız buradaki dokümana göz atabilirsiniz.
  4. discovery.ec2.any_group: true discovery esnasında security group check yapmasını engeller. Eğer SG check yapmasını istiyorsanız defaultta true olan bu değeri false yapmalısınız ve ekstradan discovery.ec2.groups: sgName1; sgName2; sgName3 şeklinde instance’lara bağlanmış SG’ları tanımlanız gerekir.

Statik bir IP tanımlaması yapılmadığı için aynı özelliklerde yeni bir instance yaratıp, servis ve plugin kurulumundan sonra aynı konfigürasyonu yaptığınızda, yeni node discovery check sonrası clustera dahil olacak(default 1 saniyede bir). Son olarak servisi başlattığımız log dosyasında göreceğiniz şey şu olacak;

--

--