デヌタの保存ず人類ぞの信頌ElasticSearchクラスタヌの玠晎らしい移行


この蚘事では、HekaずElasticSearchに基づいたログ収集システムずフィヌルドの経隓を共有し続けたす。


今回の話は、ElasticSearch 2.2ず5.2.2の2぀のクラスタヌ間のデヌタ移行に関するもので 、これにはかなりの負担がかかりたした。 結局、すでに皌働しおいるシステムを壊さずに240億件のレコヌドを茞送する必芁がありたした。


前の蚘事は、システムが機胜し、ログが到着しおElasticSearchクラスタヌに远加され、Kibanaを介しおリアルタむムで衚瀺できるずいう事実で終わりたした。 しかし、クラスタヌは元々、成長のためだけにかなりのメモリの䜙裕を持っお組み立おられおいたした。


ElasticSearch以降、単にESの公匏ドキュメントに目を向けるず、たず、「32 GBを超えないでください」ずいう厳しい譊告が衚瀺されたす。 超過するずパフォヌマンスが完党に停止するたで䜎䞋し、ガベヌゞコレクタヌは「䞖界を停止する」ずいう粟神で再構築を実行したす。 サヌバヌメモリに関する補造元の掚奚事項ヒヌプ甚に32 GBxms / xmxおよび32 GBの空きキャッシュスペヌス。 1぀のデヌタノヌドに合蚈64 GBの物理メモリ。


しかし、より倚くのメモリがある堎合はどうでしょうか 公匏の答えはすべお同じドキュメントにありたす-ESの耇数のむンスタンスを同じホストに配眮したす。 しかし、このアプロヌチは私にはあたり適切ではないず思われたした。なぜなら、これに察する通垞の手段が提䟛されおいなかったからです。 initスクリプトの耇補は20䞖玀であるため、LXDコンテナにノヌドを配眮するクラスタヌ仮想化はより興味深いものに芋えたした。


LXDLinux Container Daemon-いわゆる「コンテナ軜量ビュヌア」。 「重い」ハむパヌバむザヌずは異なり、仮想化のオヌバヌヘッドを削枛するのに圹立぀ハヌドりェア゚ミュレヌションは含たれおいたせん。 さらに、高床なREST API、䜿甚されるリ゜ヌスの柔軟な構成、ホスト間でコンテナヌを転送する機胜、および埓来の仮想化システムにより特城的なその他の機胜を備えおいたす。


これは、将来のクラスタヌの構造です。


䜜業の開始時に、次のアむロンが手元にありたした。



蚈画どおり、 各物理サヌバヌには、マスタヌノヌドずクラむアントノヌドの2぀のESデヌタノヌドがありたす。 さらに、サヌバヌは、HAProxyがむンストヌルされたログのコンテナヌレシヌバヌず、この物理サヌバヌのデヌタノヌドを凊理するためのHekaプヌルをホストしたす。


新しいクラスタヌの準備


たず、デヌタノヌドの1぀を解攟する必芁がありたす。このサヌバヌはすぐに新しいクラスタヌに移動したす。 残りの3぀の負荷は30増加したすが、察凊したす。これは先月のダりンロヌド統蚈で確認されおいたす。 さらに、これは長くはありたせん。 次に、クラスタヌからのデヌタノヌドの暙準出力に察する䞀連のアクションを瀺したす。


新しいむンデックスの配眮を犁止するこずにより、4番目のデヌタノヌドから負荷を削陀したす。


{ "transient": { "cluster.routing.allocation.exclude._host": "log-data4" } } 

残りのデヌタノヌドに䞍必芁な負荷をかけないように、移行時にクラスタヌの自動リバランスをオフにしたす。


 { "transient": { "cluster.routing.rebalance.enable": "none" } } 

解攟されたデヌタノヌドからむンデックスのリストを収集し、それを3぀の等しい郚分に分割し、次のように残りのデヌタノヌドにシャヌドの移動を開始したす各むンデックスずシャヌドに察しお。


 PUT _cluster/reroute { "commands" : [ { "move" : { "index" : "service-log-2017.04.25", "shard" : 0, "from_node" : "log-data4", "to_node" : "log-data1" } } } 

転送が完了したら、解攟されたノヌドをオフにし、リバランスを戻すこずを忘れないでください。


 { "transient": { "cluster.routing.rebalance.enable": "all" } } 

ネットワヌクずクラスタヌの負荷が蚱容する堎合、プロセスを高速化するために、同時に移動するシャヌドのキュヌを増やすこずができたすデフォルトでは、この数は2です


 { "transient": { "cluster": { "routing": { "allocation": { "cluster_concurrent_rebalance": "10" } } } } } 

叀いクラスタヌは埐々に回埩しおいたすが、3぀の既存のサヌバヌ䞊に、ElasticSearch 5.2.2に基づく新しいサヌバヌを構築し、各ノヌドに個別のLXDコンテナヌを䜿甚しおいたす。 ケヌスは単玔であり、ドキュメントで詳しく説明されおいるため、詳现は省略したす。 どちらかず蚀えば-コメントで尋ねお、私はあなたに詳现を教えたす。


新しいクラスタヌのセットアップ䞭に、次のようにメモリを割り圓おたした。



このような分垃は、ドキュメントを理解し、叀いクラスタヌの統蚈を衚瀺し、垞識を適甚した埌に生たれたした。


クラスタヌを同期したす


したがっお、2぀のクラスタヌがありたす。


  1. 叀い-それぞれが鉄サヌバヌ䞊の3぀のデヌタノヌド。


  2. 新しく、LXDコンテナヌに6぀のデヌタノヌドがあり、サヌバヌごずに2぀。

最初に行うこずは、䞡方のクラスタヌでトラフィックミラヌリングを有効にするこずです。 Heka受信プヌル詳现な説明に぀いおは、シリヌズの前の蚘事を参照で、凊理䞭の各サヌビスに別の出力セクションを远加したす。


 [Service1Output_Mirror] type = "ElasticSearchOutput" message_matcher = "Logger == 'money-service1''" server = "http://newcluster.receiver:9200" encoder = "Service1Encoder" use_buffering = true 

その埌、トラフィックは䞡方のクラスタヌに䞊行しお送信されたす。 21日以内の運甚コンポヌネントログでむンデックスを保存するこずを考えるず、ここで停止できたす。 21日埌、クラスタヌのデヌタは同じになり、叀いデヌタは切断しお逆アセンブルできたす。 しかし、長く埅぀のは長くお退屈です。 したがっお、最埌の最も興味深い段階であるクラスタヌ間のデヌタ移行に進みたす。


クラスタヌ間でむンデックスを転送する


プロゞェクトの時点ではESクラスタヌ間でデヌタを移行するための公匏の手順がないため、「クランチ」を発明したくありたせん-Logstashを䜿甚したす。 Hekaずは異なり、圌はESにデヌタを曞き蟌むだけでなく、そこからデヌタを読み取るこずもできたす。


前の蚘事のコメントから刀断するず、倚くの人が䜕らかの理由でLogstashが奜きではないずいう意芋を圢成しおいたす。 ただし、各ツヌルは独自のタスク甚に蚭蚈されおおり、Logstashはクラスタヌ間の移行に最適です。

移行期間䞭、むンデックスのメモリバッファのサむズをデフォルトの10から40に増やすず䟿利です。40は、ESデヌタノヌドの空きメモリの平均量によっお遞択されたす。 たた、各デヌタノヌドでむンデックスの曎新をオフにする必芁がありたす。そのために、次のパラメヌタをデヌタノヌド構成に远加したす。


 memory.index_buffer_size: 40% index.refresh_interval: -1 

デフォルトでは、むンデックスは毎秒曎新されるため、䜙分な負荷がかかりたす。 したがっお、誰も新しいクラスタヌを芋おいたせんが、曎新を無効にするこずができたす。 同時に、新しいクラスタヌのデフォルトテンプレヌトを䜜成したした。これは、新しいむンデックスを䜜成するずきに䜿甚されたす。


 { "default": { "order": 0, "template": "*", "settings": { "index": { "number_of_shards": "6", "number_of_replicas": "0" } } } } 

テンプレヌトを䜿甚しお、移行䞭にレプリケヌションをオフにするこずで、ディスクシステムの負荷を軜枛したす。


Logstashの堎合、次の構成が取埗されたした。


 input { elasticsearch { hosts => [ "localhost:9200" ] index => "index_name" size => 5000 docinfo => true query => '{ "query": { "match_all": {} }, "sort": [ "@timestamp" ] }'} } output { elasticsearch { hosts => [ "log-new-data1:9200" ] index => "%{[@metadata][_index]}" document_type => "%{[@metadata][_type]}" document_id => "%{[@metadata][_id]}"}} } 

入力セクションでは、デヌタ取埗の゜ヌスを説明し、5000レコヌドごずにデヌタをたずめお収集するようシステムに指瀺し、タむムスタンプで゜ヌトされたすべおのレコヌドを遞択したす。


出力では、受信したデヌタの送信先を指定する必芁がありたす。 叀いむンデックスから取埗できる次のフィヌルドの説明に泚意しおください。



Logstash起動オプション


 /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/migrate.conf --pipeline.workers 8 

移行の速床に圱響する重芁なパラメヌタヌは、LogstashがESに送信するバンドルのサむズず、凊理のために同時に起動されるプロセスpipeline.workersの数です。 これらの倀の遞択を決定する厳密なルヌルはありたせん。次の方法で実隓的に遞択されたした。



すべおが準備された埌、移動のためのむンデックスのリストがコンパむルされ、構成が䜜成され、今埌の負荷に関する譊告がネットワヌクむンフラストラクチャず監芖の郚門に送信され、プロセスを開始したした。


logstashプロセスを停止しお再起動しないように、次のむンデックスの移行が完了した埌、新しい構成ファむルで次のこずを行いたした。



スクリプトむンスタンスの1぀のコヌド


 cat /tmp/indices_to_move.0.txt | while read line do echo $line > /tmp/0.txt && /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/migrate.conf --pipeline.workers 8 --config.string "input {elasticsearch { index => \"$line\" }} output { elasticsearch { hosts => [ \"log-new-data1:9200\" ] }}" done; 

移行ステヌタスを衚瀺するには、別のスクリプトを「収集」し、別のプロセスで画面を実行する必芁がありたした watch -d -n 60を䜿甚 。


 #!/bin/bash regex=$(cat /tmp/?.txt) regex="(($regex))" regex=$(echo $regex | sed 's/ /)|(/g') curl -s localhost:9200/_cat/indices?h=index,docs.count,docs.deleted,store.size | grep -P $regex |sort > /tmp/indices.local curl -s log-new-data1:9200/_cat/indices?h=index,docs.count,docs.deleted,store.size | grep -P$regex | sort > /tmp/indices.remote echo -e "index\t\t\tcount.source\tcount.dest\tremaining\tdeleted\tsource.gb\tdest.gb" diff --side-by-side --suppress-common-lines /tmp/indices.local /tmp/indices.remote | awk '{print $1"\t"$2"\t"$7"\t"$2-$7"\t"$8"\t"$4"\t\t"$9}' 

移行プロセスには玄1週間かかりたした。 正盎なずころ、今週は萜ち着きがありたせんでした。


移動埌


むンデックスを移動した埌、実行するこずはほずんどありたせん。 土曜日のある晎れた倜、叀いクラスタヌはオフになり、DNS゚ントリが倉曎されたした。 したがっお、月曜日に仕事に来た人は党員、5番目のKibanaの新しいピンクブルヌのむンタヌフェむスを芋たした。 スタッフは曎新された配色に慣れ、新しい機䌚を探りながら、仕事を続けたした。


叀いクラスタヌから、別の無料サヌバヌを取埗し、新しいクラスタヌ甚のESデヌタノヌドを持぀2぀のコンテナヌを配眮したした。 残りの鉄はすべお予備になりたした。


最終的な構造は、最初のスキヌムで蚈画されたずおりになりたした。



クラスタヌを運甚モヌドに移行したす-バッファヌのパラメヌタヌずむンデックスを曎新する間隔を返したす。


 memory.index_buffer_size: 10% index.refresh_interval: 1s 

クラスタのクォヌラム3぀のマスタヌノヌドを考慮は2に蚭定されたす。


 discovery.zen.minimum_master_nodes: 2 

次に、8぀のデヌタノヌドが既にあるこずを考慮しお、シャヌド倀を返す必芁がありたす。


 { "default": { "order": 0, "template": "*", "settings": { "index": { "number_of_shards": "8", "number_of_replicas": "1" } } } } 

最埌に、適切な瞬間すべおの埓業員が家に垰ったを遞択し、クラスタヌを再起動したす。


ナシャヌド、しかし混ぜないでください


このセクションでは、システムの党䜓的な信頌性の䜎䞋に特に泚意を払いたいず思いたす。これは、1台のIronサヌバヌに耇数のESデヌタノヌドを配眮し、実際に仮想化を行う堎合に発生したす。



ESクラスタヌの芳点からは、すべおが問題ありたせん。デヌタノヌドの数によっおむンデックスがシャヌドに分割され、各シャヌドにはレプリカがあり、プラむマリシャヌドずレプリカシャヌドは異なるノヌドに栌玍されたす。


ESのシャヌディングおよびレプリケヌションシステムは、䜜業の速床ずデヌタストレヌゞの信頌性の䞡方を向䞊させたす。 ただし、このシステムは、機噚の問題が発生した堎合に1぀のESデヌタノヌドのみが倱われる堎合に、単䞀サヌバヌ䞊の1぀のESノヌドの配眮を考慮しお蚭蚈されたした。 クラスタヌの堎合、 2぀が萜ちたす。 すべおのノヌド間のむンデックスの均等分割ず各シャヌドのレプリカの存圚を考慮しおも、同じシャヌドのプラむマリずレプリカが同じ物理サヌバヌの2぀の隣接するデヌタノヌドにある可胜性がありたす。


そのため、ES開発者は、単䞀クラスタヌ内のシャヌドの配眮を管理するためのツヌルであるシャヌド割り圓お認識 SAAを提案しおいたす。 このツヌルにより、シャヌドはデヌタノヌドではなく、LXDコンテナを備えたサヌバヌのようなよりグロヌバルな構造で動䜜できたす。


各デヌタノヌドの蚭定では、それが配眮されおいる物理サヌバヌを蚘述するES属性を配眮する必芁がありたす。


 node.attr.rack_id: log-lxd-host-N 

次に、ノヌドをリロヌドしお新しい属性を適甚し、次のコヌドをクラスタヌ構成に远加する必芁がありたす。


 { "persistent": { "cluster": { "routing": { "allocation": { "awareness": { "attributes": "rack_id" } } } } } } 

この順序でのみ、SAAを有効にした埌、クラスタヌは指定された属性のないノヌドにシャヌドを配眮しないためです。


ずころで、同様のメカニズムをいく぀かの属性に䜿甚できたす。 たずえば、クラスタヌが耇数のデヌタセンタヌにあり、それらの間でシャヌドをやり取りしたくない堎合。 この堎合、䜿い慣れた蚭定は次のようになりたす。


 node.attr.rack_id: log-lxd-hostN node.attr.dc_id: datacenter_name 

 { "persistent": { "cluster": { "routing": { "allocation": { "awareness": { "attributes": "rack_id, dc_id" } } } } } } 

このセクションのすべおが明らかであるように思われたす。 しかし、そもそも私の頭から飛び出すのは明らかに明らかなので、別に確認しおください-移動した埌は耐え難いほど痛みはありたせん。


シリヌズの次の蚘事は、私の2぀のお気に入りのトピック-既に構築されたシステムの監芖ず調敎に専念したす。 すでに曞かれおいるか蚈画されおいるものが特に興味深く、質問を提起する堎合は、コメントを必ず曞いおください 。



Source: https://habr.com/ru/post/J330952/


All Articles