ES脳裂問題

3511 ワード

ES脳裂問題
概要
通常のesクラスタには1つのプライマリノードしかありません.プライマリノードはクラスタ全体を管理し、クラスタのすべてのノードは同じノードをプライマリノードとして選択するので、そのノードにアクセスしてもクラスタのステータス情報を表示できます.脳裂問題の出現は,ノードから選択主ノードに分岐することにより,1つのクラスタに複数の主ノードが出現し,クラスタを分裂させ,クラスタを異常状態にするためである.
の原因となる
1、ネットの原因
イントラネットでは一般的にこの問題は発生せず、イントラネットトラフィックの状態を監視できます.外部ネットワークにネットワークの問題が発生する可能性が高い.
2、ノード負荷
プライマリノードは、クラスタの管理とデータの格納を担当し、アクセス量が多いとESインスタンスが反応せずに応答が停止する可能性があります.この場合、他のノードがプライマリノードにメッセージを送信する際にプライマリノードの応答が得られないと、プライマリノードが停止していると判断し、プライマリノードを再選択します.
3、メモリの回収
メモリを大規模に回収すると、esクラスタの応答が失われます.
したがって,イントラネット負荷の可能性が高く,イントラネットネットワークの可能性が高い.
プライマリノード選挙メカニズム
ESの自発的な選挙メカニズムを見てみましょう.
ESクラスタが構築されるとmasterが選出され,その他はslaveノードである.ただし、具体的な操作では、各ノードに書き込みと読み取りの操作が提供されます.つまり、どのノードに書き込みを行っても、このデータはクラスタ上のすべてのノードに割り当てられます.ここであるノードが削除された場合、slaveノードが削除された場合、まずデータが失われるかどうかに関心を持ちますか?いいえ.replicaをオンにすると、このデータは他のマシンでバックアップされているに違いありません.他のノードのバックアップスライスは、このスライスデータのプライマリスライスに自動的に昇格します.ここで注意したいのは、ここにしばらくyellow状態の時間があることです.メインノードが切れたらどうしますか?ノードからプライマリノードと接続できないことに気づいた場合、彼らは自分でノードのプライマリノードを選択することにします.しかし、ここには脳裂の問題があり、5台の機械があると仮定し、3台は1つの機械室にあり、2台は別の機械室にあり、2つの機械室の間の連絡が切れた後、各機械室のノードは自分で集まり、1つのメインノードを推挙する.この時点で2つのプライマリノードが存在し、マシンルーム間の連絡が回復すると、データの競合が発生します.
予防案
1、キャラクターの分離
esクラスタに2~3個のプライマリノードを構成し、管理のみを担当し、ストレージのみを担当させ、ノードからストレージのみを担当させます.また、ノードから自動検出メカニズムを無効にし、プライマリノードを指定します.ここにいるよymlファイルで、プライマリノード:
node.master=true
node.data=false

ノードから:
node.master=false
node.data=ture
discovery.zen.ping.multicast.enabled: false
discovery.zen.ping.unicast.hosts: ["host1", "host2:port"]

2、パラメータ配置
discovery.zen.ping_timeout: 3

このパラメータは、ノードからプライマリノードにアクセスした後、3秒以内に返信がない場合にデフォルトのプライマリノードがハングアップすることを指定します.これにより、脳クラックが発生する確率を減らすことができます.
discovery.zen.minimum_master_nodes: 2

このパラメータは,プライマリノードとなるスレーブノードの個数がこの数字を満たし,プライマリノードが掛けられていると考えられる場合に,新しいプライマリノードが選出されることを意味する.たとえば,ESクラスタには3つのスレーブノードがプライマリノードになる資格があるが,この場合,これら3つのノードはいずれもプライマリノードが掛かっていると考えて選挙を行うが,このパラメータの値が4であれば選挙は行わない.この値を適切に大きくして脳裂の出現確率を減らすことができ,公式に提案されているのは(n/2)+1,nが主ノードになる資格のあるノード数(node.master=true)である.
ここにはいくつかの例があります.
  • 10ノード(データを保存しながらmasterになれる)があれば、法定数は6です.
  • 候補マスターノードが3つ、dataノードが100個ある場合、法定数は2で、マスターできるノード数を数えればいいです.
  • ノードが2つある場合は、難題に直面します.法定数はもちろん2ですが、ノードが切れている場合はクラスタ全体が使用できません.1に設定するとクラスタの機能が保証されますが、クラスタの脳裂が保証されません.このような場合は、少なくとも3つのノードを保証したほうがいいです.

  • Elasticsearchはダイナミックなので、ノードを簡単に追加して削除できますが、この法定個数が変わります.各インデックスノードの構成を変更し、クラスタ全体を再起動しなければなりません.構成を有効にするためだけに、これは非常に苦痛です.
    これに基づいてdiscovery.zen.minimum_master_Nodes(他にもいくつかの構成)は、API呼び出しによって動的に構成することを可能にする.クラスタがオンラインで実行されると、次のように構成を変更できます.
    PUT /_cluster/settings
    {
        "persistent" : {
            "discovery.zen.minimum_master_nodes" : 2
        }
    }
    

    これは永続的な構成となり、構成項目の構成にかかわらず、これが優先的に有効になります.マスターノードを追加および削除する場合は、この構成を変更する必要があります.