elasticsearch/performans ­čç╣­čçĚ

elasticsearch/performans ­čç╣­čçĚ

- 7 mins

Giri┼č

Elasticsearch ├╝zerinde b├╝y├╝k boyuttaki verileri h─▒zl─▒ bir ┼čekilde i┼člemek ├žaba gerektiren i┼člerden biridir. Bu yaz─▒da bir ├žal─▒┼čma esnas─▒nda yap─▒lan elasticsearch performans iyile┼čtirmelerini ve nas─▒l yap─▒ld─▒─č─▒n─▒ anlatmaya ├žal─▒┼čaca─č─▒m.

Bu iyile┼čtirme i┼člemlerinin nas─▒l yap─▒ld─▒─č─▒na ge├žmeden once elasticsearch mimarisinde bulunan baz─▒ bile┼čenlerden bahsetmekte yarar var.

http://<elk-ip>:9200/_cat/shards

Bu performans iyile┼čtirme ad─▒mlar─▒, tek sunucu (node) ├╝zerinde ├žal─▒┼čan Elasticsearch ├╝zerinde yap─▒lm─▒┼čt─▒r, yani da─č─▒t─▒k bir sistem ├╝zerinde iyile┼čtirme yapmak buradaki anlat─▒lacaklardan farkl─▒ olacakt─▒r. (Baz─▒ k─▒s─▒mlar─▒ benzerlik g├Âsterse dahi)

Not : Bu iyile┼čtirme i┼člemleri, ├žal─▒┼čt─▒r─▒lan sunucu say─▒s─▒na (da─č─▒t─▒k sistem ise), internet h─▒z─▒na (da─č─▒t─▒k sistem ise), sunucuda ├žal─▒┼čan i┼čletim sisteminden, kulland─▒─č─▒ disk, CPU ve RAM kapasitesine g├Âre de─či┼čiklik g├Âsterebilir.

Paralel Bulk indeksleme

Elasticsearch ├╝zerinde indeksleme i┼člemi birka├ž farkl─▒ y├Ântem ile yap─▒labilmektedir bunlardan baz─▒lar─▒, tek tek indeksleme, bulk indeksleme ve parallel indekslemedir.

Tek tek indeksleme y├Ântemi, tahmin edece─činiz ├╝zere veri b├╝y├╝k oldu─čunda tercih edilecek bir y├Ântem de─čildir, nedeni ise her kay─▒t i├žin elasticsearche istekte bulunmas─▒ndan dolay─▒d─▒r. Yani 10000 adet sat─▒r i├žin 10000 istek g├Ânderilecek demektir, bunun yerine bulk indeksleme tercih edilir 10000 adet kay─▒t i├žin tek istek g├Ânderimi yapar b├Âylece hem istek say─▒s─▒ minimuma indirilmi┼č olur, hem de indeksleme s├╝resi azalt─▒lm─▒┼č olur. Bunun bir ad─▒m daha geli┼čmi┼či ise paralel bulk t─▒r, bu indeksleme y├Ânteminde ise birden fazla thread ile veri elasticsearche g├Ânderilecektir sa─člar. Bizim ├žal─▒┼čmam─▒zda paralel bulk i┼člemi kullan─▒lm─▒┼čt─▒r.

Bu ├žal─▒┼čmada, Elasticsearch ├╝n Python mod├╝lleri kullan─▒lm─▒┼čt─▒r, bu mod├╝lde paralel bulk kullan─▒m─▒ a┼ča─č─▒daki ┼čekildedir.

Paralel bulk kullanabilmek i├žin Python generator kullanmak tercih edilen y├Ântemlerden biridir, nedeni hem ram kullan─▒m─▒ az olur, hemde tekrarl─▒ (iterate) bir yap─▒ya sahiptir.

├ľrnek generator yap─▒s─▒ :

def gendata(docs_list):

     for json in docs_list:

        yield {
            "_index": "herhangibirsey",
            "_type": "_doc",
            "isim":json['isim'],
            "soyisim":json['soyisim'],
            "sehir": json['sehir'],
            "yas":json['yas'],
            "meslek":json['meslek']
        }

Bu generator yap─▒s─▒nda, gendata fonksiyonu docs_list ad─▒nda bir liste al─▒yor ve bu listenin i├žeri─či ┼ču ┼čekilde oldu─čunu varsay─▒yoruz:

docs_list= [{"isim": "Mehmet","soyisim": "Ataklar","sehir": "Kocaeli","yas": 45,"meslek": "Ogretmen"}]

gendata fonksiyonu docs_list listesi icerisindeki her bir dokumandan gereken alanlari alarak indeksleme fonksiyonuna vermektedir. Parallel bulk, Python script ├╝zerinden ┼ču ┼čekilde ├ža─čr─▒labilir.

 for response in parallel_bulk(elasticDeamon, gendata(doc_records), thread_count=7):
    pass 

Indeks yenileme aral─▒─č─▒n─▒ kald─▒rma (refresh_interval)

Node ├╝zerinde bulunan indeks e, bulk indexleme i┼člemi yap─▒l─▒rken, indeks yenileme aral─▒─č─▒ bulk indeksleme s├╝resi boyunca ortadan kald─▒r─▒lmal─▒d─▒r. ├ç├╝nk├╝ elasticsearch ├╝n her yenileme yapmas─▒ sunucu ├╝zerinde segment olu┼čturmas─▒n─▒ sa─člamaktad─▒r, bu hem makinen kaynaklar─▒na dezavantaj olarak yans─▒maktad─▒r, ram ve cpu kullan─▒m─▒n─▒ art─▒ran pahal─▒ bir i┼člemdir.

Kibana ├╝zerinde bulunan ÔÇťDev ToolsÔÇŁ k─▒sm─▒ndan a┼ča─č─▒daki verilen komut ile kald─▒r─▒labilir.

PUT /<indeks-ismi>/_settings

{
    "index": {

        "refresh_interval": -1

    }

}

Terminal ├╝zerinden:

curl -X PUT "<elk-ip>:9200/<index-ismi>/_settings" -H 'Content-Type: application/json' -d' { "index" : { "refresh_interval" : -1 } } '

Bulk indeksleme i┼člemi sona erdi─činde ise, ayn─▒ komutlar kullan─▒larak, yenileme aral─▒─č─▒ ÔÇťnullÔÇŁ a e┼čitlenebilir. B├Âylece kullan─▒c─▒ kibana ├╝zerinden, yenileme aral─▒─č─▒n─▒ kendisi ayarlayabilir.

PUT /<index-ismi>/_settings

{

    "index": {

        "refresh_interval": null



    }

}

Indeks kopyalar─▒n─▒ devre d─▒┼č─▒ b─▒rakmak (Replica)

Kula─ča ho┼č gelmesede indeks kopyalar─▒n─▒ (replicas) devre d─▒┼č─▒ b─▒rakmak indeksleme h─▒z─▒n─▒ art─▒r─▒r, en b├╝y├╝k dezavantaj─▒ indeksi herhangi bir hata durumunda veri kayb─▒na kar┼č─▒ savunmas─▒z b─▒rak─▒r.

Kibana ÔÇťDevToolsÔÇŁ k─▒sm─▒ndan kopyalar─▒n devre d─▒┼č─▒ b─▒rak─▒lmas─▒.

PUT /<indeks-ismi>/_settings

{

    "index" : {

        "number_of_replicas" : 0

    }

}

Terminal ├╝zerinden:

curl -X PUT "<elk-ip>:9200/<index-ismi>/_settings" -H 'Content-Type: application/json' -d' { "index" : { "number_of_replicas" : 0 } } '

Swap alan─▒n─▒ kald─▒rmak. (Sunucu ├╝zerindeki)

Elasticsearch├╝ h─▒zl─▒ yapan fakt├Ârlerden en ├Ânemlisi ram ├╝zerinden i┼člem yapmas─▒d─▒r. Linux sunucular─▒nda bulunan swap alan─▒, ram de yeterli alan kalmad─▒─č─▒nda veya ram ├╝zerinde uzun s├╝re i┼člem yap─▒lmayan (aktif olmayan) dosyalar─▒n disk ├╝zerinde k─▒sa s├╝reli─čine saklanmas─▒ndan olu┼čan aland─▒r. Bu elasticsearh i├žin dezavantaj olabilmektedir, elasticsearch├╝n tamamen ram ├╝zerinden i┼člem yapmas─▒n─▒ sa─člamak ad─▒na swap alan─▒n─▒ kald─▒rmak indeksleme ve arama yapma h─▒z─▒n─▒ art─▒racakt─▒r.

Swap alan─▒n─▒ ge├žici olarak ┼ču ┼čekilde kald─▒rabilirsiniz, terminal ├╝zerinden bu komutu yazman─▒z yeterlidir.

$ swapoff -a

Swap alan─▒n─▒ tamamen kald─▒rabilmek i├žin ÔÇťrootÔÇŁ yetkisi ile /etc/fstab dosyas─▒ i├žerisinde swap kelimesi ge├žen k─▒sm─▒ yorum sat─▒r─▒ yapman─▒z yeterli olacakt─▒r.

Swap alan─▒n─▒ ortadan kald─▒rd─▒ktan sonra sunucu ├╝zerinde ├žal─▒┼čan elasticsearch ayarlar─▒nda ufak bir de─či┼čiklik yapmak gerekecektir.

/etc/elasticsearch/elasticsearch.yml

elasticsearch.yml dosyas─▒ i├žerisine ┼ču parametreyi eklemeniz gerekmektedir.

bootstrap.mlockall: true 

Bu i┼člem elasticsearch ├╝n tamamen RAM ├╝zerinden i┼člem yapmas─▒n─▒ sa─člayacakt─▒r.

JVM Heap Alan─▒n─▒ Art─▒rmak

Elasticsearch JVM heap, verileri h─▒zl─▒ bir ┼čekilde i┼člemek ve veriler ├╝zerindeki i┼člemleri yapabilmek i├žin elasticsearche ├Âzel olarak ayr─▒lm─▒┼č bir alan. Bu alan normalde (default olarak) 1 GB alana sahiptir, e─čer sunucu ├╝zerinde yeterli miktarda RAM mevcut ise bu alan─▒ art─▒rmak indeksleme ve i┼člem yapma h─▒z─▒n─▒ art─▒racakt─▒r.

Burada ├Ânemli olan JVM Heap alan─▒ 64 Bit yap─▒ya sahip bir sunucu i├žin maksimum 32 GB a kadar art─▒r─▒lmal─▒d─▒r, sunucu ├╝zerinde ├žok daha fazla RAM olsa dahi 32 GB limiti ge├žmemek gerekmektedir. Bununla ilgili detayl─▒ a├ž─▒klamaya buradan eri┼čebilirsiniz: https://www.elastic.co/guide/en/elasticsearch/guide/current/heap-sizing.html

JVM Heap alan─▒ ayarlan─▒rken genellikle fiziksel ram boyutunun yar─▒s─▒ kadar heap alan─▒ vermek tercih edilir, 32 GB boyutunu ge├žmeyecek ┼čekilde.

JVM Heap ayarlar─▒ ┼ču ┼čekilde yap─▒labilir, Debian tabanl─▒ bir i┼čletim sisteminde elasticsearch ├╝n bulundu─ču dizin alt─▒nda jvm.options ad─▒nda bir dosya bulunmaktad─▒r.

E─čer heap alan─▒n─▒ 16 GB ayarlamak isterseniz(fiziksel RAM in en az 32 GB oldu─čundan emin olunuz ), jvm.options dosyas─▒ i├žerisine ┼ču ┼čekilde kaydedebilirsiniz.

/etc/elasticsearch/jvm.options

    ## bu jvm.options dosyas─▒ i├žerisine a┼ča─č─▒da verilen parametler girilir.

-Xms16GB
-Xmx16GB  

Bu parametreler, jvm.options dosyas─▒ i├žerisine kaydedildikten sonraki ad─▒mda ise elasticsearch servisini yeniden ba┼člatmay─▒ unutmay─▒n─▒z.

sudo service elasticsearch restart

SSD veya RAID 0 disk kullan─▒m─▒

HDD disklere g├Âre ├žok h─▒zl─▒ olan SSD diskler, elasticsearch ├╝n veriyi daha h─▒zl─▒ i┼člemesine, verimlili─či art─▒rmas─▒na direkt olarak etki edecektir. RAID diskleri kullan─▒rken RAID 0 haricindeki tiplerini kullanmak tercih edilmez.

Bu k─▒s─▒mda elasticsearch performans─▒n─▒ art─▒rmak i├žin yap─▒lmas─▒ gerekli olabilecek baz─▒ ad─▒mlardan bahsedildi bunlar ├Âzet olarak.

Bu, elasticsearch performans iyile┼čtirme ad─▒mlar─▒n─▒ g├Âsteren birinci k─▒s─▒m, ikinci k─▒s─▒mda, elasticsearch ├╝zerinde indeks olu┼čtururken, mapping sisteminin verimize g├Âre nas─▒l yap─▒land─▒r─▒lmas─▒ gerekti─činden, indeks ├╝zerinde otomatik olarak olu┼čturulan baz─▒ alanlar─▒n kald─▒r─▒lmas─▒ndan, optimum shard say─▒s─▒n─▒n belirlenmesinden, indeks performans (benchmarking) ├Âl├ž├╝mlerinden ve Grafana ├╝zerinden elasticsearch de─čerlerinin (CPU,I/O, RAM, DISK kullan─▒m─▒n─▒n) izlenmesi anlat─▒lacakt─▒r.

Bu ├žal─▒┼čma esnas─▒nda yararlan─▒lan kaynaklar

https://blog.codecentric.de/en/2014/05/elasticsearch-indexing-performance-cheatsheet>

https://www.elastic.co/guide/en/elasticsearch/reference/master/tune-for-indexing-speed.html

https://www.elastic.co/guide/en/elasticsearch/guide/current/heap-sizing.htm

https://elasticsearch-py.readthedocs.io/en/master

Ahmet Turkmen

Ahmet Turkmen

Software Engineer

comments powered by Disqus
rss facebook twitter github gitlab youtube mail spotify lastfm instagram linkedin google google-plus pinterest medium cool-kubernetes stackoverflow reddit quora quora dev