High-level mimari olarak Elasticsearch’ten kısaca bahsedecek olursak; bir Elasticsearch cluster, ayrı sunucular olarak tanımlayabileceğimiz node’lardan oluşmaktadır. Her node üzerinde, tanımlanan index’lere ait veri, shard’lar üzerinde dağıtımı sağlanarak tutulmaktadır. Shard kullanımı index üzerinde yapılan sorguların dağıtık mimari ile hızlı dönüş yapılmasında kullanılır. Replica tanımları ile de index verisi üzerinde sistemsel olarak yedeklilik sağlanmaktadır.
Bu yazıdaki esas amacımız; Elasticsearch’ün detaylı incelenmesi olmadığı için özet bir içerik ile genel bir bilgilendirme yapmaktır.Bu yazımızda firmamız Architecht bünyesinde koşulan bir migration projesinde, Kubernetes cluster’ında bulunan Elasticsearch uygulamasına ait index verilerinin farklı bir veri merkezi üzerinde koşan Elasticsearch instance’ına taşıması sırasında izlediğimiz adımları birlikte değerlendirmek istiyoruz. Uygulama kurulumları sırasında lokal ortam olarak MacOs işletim sistemi kullanılmıştır.
Teknik olarak bu süreçte uyguladığımız adımlar kısaca aşağıda listelenmiştir:
- Elasticdump Kurulumu
- Elasticdump Yetkilendirme
- Port-Forwarding
- Elasticdump Index Export
- Elasticdump Index Import
Elasticdump Kurulumu
Elasticdump uygulaması, Elasticsearch verilerinin farklı ortamlara export ve import edilme işlemleri sırasında kullanılan 3. parti bir uygulamadır.
Elasticdump’ın yüklenmesi NPM aracılığı ile yapılmaktadır. Uygulamanın kurulumunu aşağıdaki komut aracılığı ile gerçekleştirebilirsiniz. (NPM uygulamasının sistemde daha önce yüklenmiş olduğu varsayılmıştır. NPM’in yüklenmesi için brew install node komutunu kullanabilirsiniz.)
npm install elasticdump -g
Elasticdump Yetkilendirme
Elasticdump uygulamasının kullanıcı adı ve şifre ile korunan bir Elasticsearch instance’ına erişimi için öncelikle yetkilendirme dosyası hazırlanmalıdır. Kullanıcı adı ve şifre ile erişim gereksinimi olmayan instancelar’a erişimde bu adım atlanabilir.
- nano ini komutu ile dosya oluşturulur.
- Dosya içeriği kullanıcı adı ve şifre ile güncellenir.
user=apigo
password=xxxxxxxx
Dosya adının isimlendirme formatı isteğe bağlıdır. Buradaki amacımız Elasticsearch’e bağlanma sırasında user ve password bilgilerinin komut setine doğru formatta taşınmasının sağlanmasıdır.
Port Forwarding
Üzerinde çalıştığımız Elasticsearch instance’ları Kubernetes cluster üzerinde koşmaktadır.
Source ve target sistemleri üzerine erişim için kube-config dosyası üzerinde gerekli güncellemeler yapıldıktan sonra servis kontrolleri aşağıdaki komut ile yapılır. Erişim sağladığımız instance da Elasticsearch instance’ı elastic namespace’ini kullanmaktadır.kubectl get services -n elastic
Hedef ortam erişimi için port-forwarding işlemi aşağıdaki komut ile yapılır:kubectl port-forward svc/ apigo-es-default -n elastic 9200:9200
Port Forwarding işlemi Elasticsearch instance’ları üzerinde koşan servislere lokal ortam üzerinden erişim yapılabilmesini sağlamaktadır. Bu sayede 9200 portu üzerinden Elasticsearch API’lerine erişim yapılabilmektedir. External-IP tanımın bulunduğu cluster’lar için port yönlendirme yapılmasına gerek yoktur. Bu durumda erişim direkt External-IP üzerinden sağlanabilir.
Elasticdump Index Export
Port-forwarding işlemin yapılması Elasticdump uygulamasının localhost üzerinde 9200 portunu kullanarak Kubernetes Cluster’ına erişimin sağlanması için gereklidir. Eğer hedef ortamımız bir Kubernetes Cluster olmasaydı, dış ortama açık bir Elasticsearch adresine direkt olarak IP ve port üzerinden Elasticdump uygulamasının erişimi mümkün olacaktı.
Elasticdump uygulaması ile export işlemi aşağıdaki komut ile yapılmaktadır. Bu sayede lokal ortamınıza ilgili index verinin dışa aktarımı yapılmış olur.
elasticdump \
–httpAuthFile=./auth_file.ini \
–input=’http://localhost:9200/traffic-*’ \
–output=traffic_index.json \
–type=data
Komutun içeriğinden kısaca bahsedecek olursak; httpAuthFile parametresi ile hedef ortam erişim parametreleri düzenlenmektedir. Input parametresi hedef ortam adresini göstermektedir. “traffic-*” adres sonunda yer alan kısım ise index verisinin adıdır. “*” işareti ile “traffic-” ile başlayan tüm index tanımlarının export edilmesi sağlanmıştır. output parametresi ile export işlemi sonunda üretilecek dosya ismi gösterilmiştir. type parametresi ile de export içeriğinde verinin bulunması sağlanmıştır. (type değişkeni mapping olarak set edilseydi, sadece index tanımlarının mapping tanımları export ediliyor olacaktı. Data olarak yapılan export işleminde veri seti ve mapping yapısı birlikte olarak dışarı aktarılmaktadır.)
Elasticdump Index Import
Export’u alınan index verisinin target ortama import edilebilmesi için öncelikle port-forwarding işlemi hedef ortamı gösterecek şekilde tekrar yapılmalıdır.
kubectl get services -n elastic
kubectl port-forward svc/apigo-es-default -n elastic 9200:9200Yazma işleminin başarılı olabilmesi için NODE_TLS_REJECT_UNAUTHORIZED çevresel değişkeni set edilir.
export NODE_TLS_REJECT_UNAUTHORIZED=0
Yükleme işleminin son aşamasında Elasticdump uygulaması ile hedef ortam üzerine verilerin aktarımı yapılır.
elasticdump \
–httpAuthFile=./auth_file.ini \
–input=./ traffic_index.json \
–output=https://localhost:9200/ \
–type=data \
Yükleme sırasında yetkilendirme httpAuthFile parametresi ile yönetilmektedir. input olarak export sırasında aldığımız dosya gösterilmektedir. output parametresi ise hedef Elasticsearch instance’ını, type değişkeni de veri tipini göstermektedir.
Export ve import işlemlerinde input ve output değişkenlerinin aynı komut setinde amaca uygun olarak yer değiştirerek kullanımlarının yapıldığını görüyoruz.
Sonuç
Ortamlar arası veri taşıma işlemleri taşınan veri setinin büyüklüğü ile doğru orantılı olarak farklı sürelerde neticelenebilir. Uyguladığımız senaryo üzerinde Elasticsearch index’lerinin günlük olarak tutulması, migration sürecinde avantaj sağlayarak geçmiş verinin farklı zaman dilimlerinde taşınabilmesine olanak sağlamıştır. Bu sayede geçişin yapıldığı gece çalışmasında index’lerin import süresi kısalarak, ilgili son güne ait verinin aktarımının yapılması yeterli olmuştur.
Bu yazımızda Kubernetes ortamında koşan Elasticsearch instance’ları arasında veri taşıma sürecini temel bileşenlere değinerek sizlerle paylaştık. Daha farklı içerik ve konularda buluşmak dileği ile herkese iyi çalışmalar diliyorum.