ElasticSearchクラスタの原理とバージョンの問題のピット

4265 ワード

Elasticsearch設計の理念は分布式検索エンジンであり、下層実現はLuceneに基づいているのか、核心思想はマルチステートマシン上で複数のesプロセスインスタンスを起動し、1つのesクラスタを構成することである.
Esのインデックスデータストレージ構造:
Esでは、データを格納する基本単位はインデックスであり、1つのインデックスはデータベースのようなものである.typeは各テーブルに相当し、1つのindexには複数のtypeがあり、mappingはテーブルの構造定義に相当し、どのフィールドタイプが定義されているかなど、indexの1つのtypeに1行のデータを追加することをdocumentと呼び、各documentには複数のfiledがあり、各filedはこのdocumentの1つのフィールドの値を表します.
スライス:
検索に格納されたデータは、潜在的には単一ノードのハードウェアの格納制限を超える可能性があります.この問題を解決するために、elasticsearchはインデックスを複数のスライスに分割する機能を提供しています.インデックスを作成すると、希望するスライスの数を簡単に定義することができます.各スライス自体は全機能の完全に独立したインデックスです.クラスタ内の任意のノードに配置できます.
バックアップ:
ネットワークの場合、障害はいつでも発生する可能性があります.障害復旧メカニズムが必要です.この目的を達成するために、ESは1つ以上のコピーを作成して、コピースライスまたは短いコピーに入れることができます.レプリケーションは、es分散システムに高可用性と高同時処理能力を提供します.
Esのデータ書き込み、読み出し、取得プロセス
データ書込みプロセス
  • クライアントはcoordinating node(協調ノード)に要求
  • を送信する.
  • 協調ノードはdocumentをルーティングし、対応するnode
  • に要求を転送する.
  • node上のprimary shardは要求を処理し、replica node 4にデータを同期する.協調ノードは3プロセスを傍受し、primary nodeとすべてのreplica nodeが完了した後、書き込み結果をクライアント
  • に返す.
    データ読み込みプロセス
    照会、GETのある1本のデータ、あるdocumentを书いて、このdocumentは自动的にあなたに1つのグローバルな唯一のIDを割り当てることができて、同时にこのIDについてhashルートを行って対応するprimary shardの上で行って、もちろん手动的にIDを设定することができます
  • クライアントは、任意のnodeにいずれかの要求を送信し、協調ノード
  • となる.
  • 協調ノードはdocumentをルーティングし、要求を対応するnodeに転送する.このときround-robinランダムローテーションアルゴリズムを使用し、primary shardおよびすべてのreplicaの中からランダムに1つを選択し、リード要求負荷を均等に
  • させる.
  • 要求を受け付けるnodeは、協調ノード
  • にdocumentを返す.
  • 協調ノードは、クライアント
  • に結果を返す.
    データ・プロシージャの検索
  • クライアントは、調整ノード
  • に要求を送信する.
  • 協調ノードは、検索要求をすべてのshardに対応するprimary shardまたはreplica shard
  • に転送する.
  • query phase:shardごとに自分で検索した結果(実はいくつかの一意の識別)を協調ノードに返し、協調ノードがデータのマージ、ソート、ページングなどの操作を行い、最後の結果
  • を生成する.
  • fetch phaseは、次いで、協調ノードによって、一意の識別に基づいて各ノードにデータを引き抜く、クライアント
  • に最も常に戻る.
    ピットESバージョンの問題
    ESの使用中にいくつかのバージョンの互換性の問題に遭遇しました.ここにリストされています.
    次の2つの問題は、ES 2とES 5の後の互換性の問題である、ES 2.xバージョンではタイプString,5を使用する.x以降はタイプtext+keywordを使用します.
    –@Field注記は有効ではありません
    プロジェクトの開始は失敗しませんが、Error:No type specified for fieldに報告します.
    解決:FieldごとにTypeを追加します.
    教訓:私は前にこのErrorに気づいたが、プロジェクトの起動に成功したので、気にしなかったが、起動ログに隠されているErrorで、私がエラーを調べても原因が見つからなかった.だから:エラーログを見逃すことはできません!!
    @Field(type = FieldType.String, searchAnalyzer = "ik_max_word",analyzer = "ik_smart")
        private String tags; 
    
    /**
     *   index   type
     *       Document       (    )
     * ↓        
     *   failed to load elasticsearch nodes : org.elasticsearch.index.mapper.MapperParsingException: No type specified for field [testLong]
     * ↓    putMapping     (          )
     * ElasticsearchTemplate elasticsearchTemplate.putMapping(QuestionAnswerRecord.class);
     *    :
     *   Document          index
     *   not_analyzed    !not_analyzed    !not_analyzed    !
     */
    

    -Mappingの作成エラー
    ES2.xバージョンではタイプString,5を使用する.x以降はタイプtext+keywordを使用します.
    "type": "string",
    "index": "not_analyzed" //keyword  
    

    https://stackoverflow.com/questions/47452770/no-handler-for-type-string-declared-on-field-name
    https://stackoverflow.com/questions/37599410/elasticsearch-no-handler-for-type-keyword-declared-on-field-hostname
    SpringBootとESバージョンの競合問題
    解決するためにesバージョンを指定できますか?
    Esはlog 4 jバージョンに依存し、5.2のesはlog 4 j 2に対応する.7以下
    ES 5.x IKカードのインストール
    https://github.com/medcl/elasticsearch-analysis-ik
    binディレクトリの下(centosプラス./)
    elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v5.6.0/elasticsearch-analysis-ik-5.6.0.zip
    

    Elasticsearch外部ネットワークアクセス9200ポートアクセス
    システムcentos 6.5 127.0.0.1:9200にアクセスできますが、パブリックネットワークIP:9200の後ろのipにアクセスできないのは127.0.0.1のローカルエリアネットワークipです.どうやって解決しますか?
           config/elasticsearch.yml
    
    network.host: 0.0.0.0