Elasticsearch運転次元reroute index損失スライスの除去

2274 ワード

問題の背景:データ量が特に大きいログクラスタで、25台のマシンがあれば、1台あたり2つのesインスタンスを配置します.では、50個のノードがあり、クラスタのデータバランスとログデータ量が大きいことを考慮してレプリカに多くのリソースを消費するためにnumber_を設定するしかありません.of_shardsは50、[number_of_replicas]:[0]です.書き込みシーンは時間単位で大量のログを書き込み、あるマシンが停止した(データが復元できない)と、すべてのindexが対応するマシンに格納されているスライスを失い、クラスタがred状態になる.クラスタのred状態を復元するには,次の方法で復元する必要がある.この方法には一定の限界があり、すべてのindexが失われたスライス数は同じであり、1週間保存すれば24*7=168個のindexがあり、各indexのスライスは必ずしも同じではないと読者に聞かれる.しかし、es運維に詳しい学生は、esがindexを作成するのは以前のindex分布状況に基づいて分配されることを知っています.以前のindex分配が非常に均一で合理的であれば、新しいindexは現在のindexのスライス分配方式と同じです.つまり、168のindexのデータスライスが同じである可能性が高いです.したがって,この特徴を利用して処理を簡略化することができる.
問題処理:
  • まず新しいマシンを追加し、reloateスライス移行をクラスタ化しないように一時的に設定します.
  • は、以下のコマンドを使用して、red状態のindexをすべて巡回し、失われたスライスを空のスライスに設定して新しいマシンに割り当てる.次のコマンドは、失われたスライスが26,27,
  • であると仮定する.
    curl -XGET http://your_es_ip:your_es_port/_cat/indices | grep red | awk '{print $3}' | awk '{system("sh reroute.sh "$1)}'
    
    index=$1
    curl -XPOST 'http://your_es_ip:your_es_port/_cluster/reroute?pretty' -d '{
      "commands":[
        {
          "allocate_empty_primary":{
            "index": "'${index}'",
            "shard": 26,
            "node": "new_node_name1",
            "accept_data_loss": true
          }
        },
        {
          "allocate_empty_primary":{
            "index": "'${index}'",
            "shard": 27,
            "node": "new_node_name2",
            "accept_data_loss": true
          }
        }
      ]
    }'

    index分布が不均一な場合は_cat/shardsは各index異常のコマンドを探し出し,以下のコマンドを参照して処理できる.
     curl -XGET http://127.0.0.1:9200/_cat/shards | grep UNASSIGNED | awk '{print $1,$2}' | awk '{system("sh reroute.sh " $0)}'
    
    index=$1
    shard=$2
    
    curl -XPOST -H 'Content-Type: application/json' 'http://127.0.0.1:9201/_cluster/reroute?pretty' -d '{
      "commands": [
        {
          "allocate_empty_primary": {
            "index": "'${index}'",
            "shard": '${shard}',
            "node": "new_node_name",
            "accept_data_loss": true
          }
        }
      ]
    }'