Elasticsearch 2クライアントの違い

15715 ワード

Java接続ESには2つの接続方式がある(すなわちESのClientを取得する)
  • nodeを作成し、クラスタに参加し、このnodeによってclientを取得する.
  • はTransportClientを介してクラスタを接続する.

  • 区別する
    第1の方法は、esのnodeノードを追加的に起動することに相当します.ただ、このnodeは私たちが符号化して制御しているだけで、このnodeはデータを保存しないノードに設定することができます(特別な理由がなければ、このように設定する必要があります).このノードの構成は他のノードと変わらず、elasticsearch.ymlファイルで構成されています.プロファイルはclasspathディレクトリの下に配置されます.もちろん、nodeを構築するときにsettingsパラメータを設定するには、プログラミングを行うこともできます.
    Settings settings = ImmutableSettings.settingsBuilder().put("client.transport.ping_timeout", 1000)
                    .put("discovery.zen.ping.multicast.enabled", "false").put("timeout", 1)
                    .putArray("discovery.zen.ping.unicast.hosts", "l-flightdev18.f.dev.cn0.qunar.com:9300", "l-flightdev17.f.dev.cn0.qunar.com:9300")
                    .build();
             Node node = NodeBuilder.nodeBuilder().clusterName("flight_fuwu_order_index").client(true).settings(settings).node();
             Client client = node.client();

    第2の方法は、すべてのnodeノードのclientを取得し、リクエストを送信するときに現在使用可能なclientを巡回することに相当する(ここでは接続可能を指すことができるが、node自体は必ずしも使用可能ではない.例えば、nodeがリカバリ中であり、クラスタに参加していない場合、以下を参照).方法1と比較して、方法2は、現在node 1に遍歴しているが、アクセスしたデータはnode 2であり、要求はnode 1に先に送信され、node 1からnode 2に転送されるダブルホップ(double hop)を生成する.
    遍歴方式:AtomicIntegerによる原子加算を要求するたびに(最大値を超えたら0に設定)、現在使用可能なclient数で型をとる.
    現在使用可能なclientを取得する方法:スレッドプールを使用して、すべてのclientを巡り、clientが接続されていない場合は、一度接続を試み、接続が使用可能なclientに正常に追加され、clientが接続されている場合は、直接使用可能なclientに追加されます.
    パラメータclient.transport.sniffがtrueかどうかを設定することで、SimpleNodeSamplerを使用するかSnifNodesSamplerを使用するかを設定できます.デフォルト値はfalse、つまりSimpleNodeSamplerを使用します.
    具体的にはorg.elasticsearch.client.transport.TransportClientNodesServiceクラスで実装します.
    簡単に言えば、SimpleNodeSamplerは、現在使用可能なクライアントが構成で設定されているノードであることを制限しますが、SnifNodesSamplerは、このクライアントのnodeが構成中でなくても、発見されたすべてのクライアントを使用します.
    Settings settings = ImmutableSettings.settingsBuilder()
                        .put("cluster.name", clustersName)
                        .put("client.transport.ping_timeout",1000)
                        .put("discovery.zen.ping.multicast.enabled","false")
                        .put("timeout", 1)          
                        .put("client.transport.sniff", true)
                        .build();
             TransportClient transportClient = new TransportClient(settings);       
         for (String cluster : StringUtils.split(clusters,",")) {
            transportClient.addTransportAddress(new InetSocketTransportAddress("host1", 9300))
            .addTransportAddress(new InetSocketTransportAddress("host2", 9300));
         }

    方法2に問題があるのは、クラスタ内のnodeがオフになった後、再加入するとき、nodeが利用可能かどうかを判断することによって、このときこのclientを使用してリクエストを送信するときに異常が発生するためである.メソッドは、まだクラスタに参加していないnodeのため、自分で作成したnodeには見えません.
    Elasticsearch自体はJAVAが開発したもので、生まれながらにしてJAVAへのサポート能力が一番なので、JAVAでElasticsearchを開発するのはいい選択だと思います.JAVAの開発はCSモード、クライアント要求、サービス側応答、すべての操作が完全に非同期であることがわかります.また、クライアント上で操作すると、多くの操作がクライアント上で完了し、システム効率が向上します.JAVAクライアントもサービス側も同じプログラムを使用しています.
    コンフィギュレーション
    mvnウェアハウス、mvnプロジェクトでpom.xmlでmvnウェアハウスを追加できます.
    <dependency>
        <groupId>org.elasticsearchgroupId>
        <artifactId>elasticsearchartifactId>
        <version>${es.version}version>
    dependency>

    独立したjarパッケージにします.独立したjarパッケージにしたい場合は、すべての依存が含まれています.mvnのmaven-assembly-pluginプラグインは使用できません.META-INF/services構造をうまく処理できないからです.maven-shade-pluginプラグインでパッケージできます.例:
    <plugin>
        <groupId>org.apache.maven.pluginsgroupId>
        <artifactId>maven-shade-pluginartifactId>
        <version>2.4.1version>
        <executions>
            <execution>
                <phase>packagephase>
                <goals><goal>shadegoal>goals>
                <configuration>
                    <transformers>
                        <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
                    transformers>
                configuration>
            execution>
        executions>plugin>

    main関数がある場合は、java-jar yourjar.jarの実行を呼び出すときに、プラグイン構成に一言追加するだけです.たとえば、次のようにします.
    "org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
        com.secisland.es.demo.main
    

    JAVAクライアントを呼び出すには、さまざまな方法があります.
    1つの方法は、ノードをクラスタに追加し、データを格納しないことです.
    もう1つは,ノードをクライアントとしてクラスタに接続することである.
    注:クライアント・バージョンはクラスタ・バージョンと一致する必要があります.そうしないと、予知できないエラーが発生する可能性があります.
    組み込みノードクライアント
    ノードベースのクライアントをインスタンス化します.これはElasticsearchの操作を実行する最も簡単な方法です.例:
    import static org.elasticsearch.node.NodeBuilder.*;
    // on startup
    Node node = nodeBuilder().node();
    Client client = node.client();
    // on shutdown
    node.close();

    ノードを開始するとElasticsearchクラスタに追加されます.cluster.nameを設定して異なるクラスタを構成するか、clusterNameメソッドを明示的に使用してオブジェクトを作成できます.プロジェクトエンジニアリングでcluster.nameを定義し、/src/main/resources/elasticsearch.ymlファイルに構成できます.classpathでelasticsearch.ymlファイルが見つかる限り、ノードが起動するとこのファイルがロードされます.プロファイルの定義:
    cluster.name: secilog

    またはjavaコードで次のように指定します.
    Node node = nodeBuilder().clusterName("secilog").node();
    Client client = node.client();

    クライアントを使用する利点は、Elasticsearchサービス側の特性に依存して実行する必要がある操作をノードに自動的にルーティングすることであり、クラスタノードをクライアントとして追加する場合、このノードにデータ保存を追加することはできません.これは構成によって達成できます.node.dataをfalseまたはnode.client設定trueに設定します.これはNodeBuilderの方法で実現できます.
    import static org.elasticsearch.node.NodeBuilder.*;
    
    // on startup
    //            http  
    Node node =
        nodeBuilder()
            .settings(Settings.settingsBuilder().put("http.enabled", false))
            .client(true)
        .node();
    
    Client client = node.client();
    
    // on shutdown
    node.close();

    もう1つの一般的なクライアントは、単位/統合テストで使用されます.この場合、「ローカル(local)」ノードを1つ起動するだけです.ここでのlocalノードは、Java仮想マシン(JVM)を共通に使用することを意味します.この場合、2つのサービスは互いに自分を発見し、クラスタを形成する.例:
    import static org.elasticsearch.node.NodeBuilder.*;
    
    // on startup
    Node node = nodeBuilder().local(true).node();
    Client client = node.client();
    
    // on shutdown
    node.close();

    組み込みノードの欠点:
  • 頻繁に1つ以上のノードを起動および停止すると、クラスタに不要なノイズが作成されます.
  • は、他のノードのように組み込みノードクライアントが外部要求に応答する.

  • 注意:eclipseで開発した場合、エラーが発生する可能性があります.
    Exception in thread "main" java.lang.IllegalStateException: path.home is not configured

    解決方法:mainメソッドのクラスでrun configurationsを右クリックし、Argumentsラベルページの下のvm argumentsに-des.path.home=-des.path.homeと入力します.例:
    -Des.path.home=D:\elasticsearch-2.2.0

    接続されたクライアント
    クライアントはTransportClientオブジェクトを介してリモート接続を使用してElasticsearchクラスタに接続できます.この場合、クラスタを追加する必要はなく、データベース接続などの従来のCSプログラムのアーキテクチャと比較します.例:
    // on startup
    Client client = TransportClient.builder().build()
            .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("host1"), 9300))
            .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("host2"), 9300));
    
    // on shutdown
    client.close();

    注意:クラスタ名がElasticsearchでない場合は、クラスタ名を設定するか、elasticsearch.ymlプロファイルを使用してクライアントエンジニアリングで構成する必要があります.1つのクラスタ内の複数のノードを接続できます.
    Settings settings = Settings.settingsBuilder()
            .put("cluster.name", "secilog").build();
    Client client = TransportClient.builder().settings(settings).build();

    Client.transport.sniffをtrueに設定してクライアントにクラスタ全体の状態を嗅ぎ取り、クラスタ内の他のマシンのipアドレスをクライアントに追加することができます.このようなメリットは、クラスタ内のすべてのクラスタのipを接続クライアントに手動で設定する必要がなく、自動的に追加し、クラスタに追加されたマシンを自動的に発見することです.
    Settings settings = Settings.settingsBuilder()
            .put("client.transport.sniff", true).build();
    TransportClient client = TransportClient.builder().settings(settings).build();

    その他のパラメータの説明
    client.transport.ignore_cluster_name      //   true                 。
    client.transport.ping_timeout             //       ping     ,  5 。
    client.transport.nodes_sampler_interval   //          ,  5

    転載先:http://www.mamicode.com/info-detail-1324613.html
    8/24/2017 10:13:30 AM