zoukankan      html  css  js  c++  java
  • 与Elasticsearch交互的客户端

    1.访问ES的方式

    访问es的方式有两种,一种是http方式,还有一种是java客户端方式。

    其中Java客户端又分为:
    1.1.Node client:

    节点客户端实际上是一个集群中的节点(但不保存数据,不能成为主节点)。因为它是一个节点,它知道整个集群状态(所有节点驻留,分片分布在哪些节点,数据在集群中的具体位置等等),这意味着它可以执行 APIs 而且少了一个网络跃点。能够直接转发请求到对应的节点上。

    1.2.Transport Client:

    传输客户端作为一种轻量级客户端,本身不加入集群,只是简单的发送请求到远端集群中的节点,作为一个集群和应用程序之间的通信层。它知道 API 并能自动帮你在节点之间轮询,帮你嗅探集群等等。但它是集群 外部的 ,和 REST 客户端类似。我们访问的节点负责收集各节点返回的数据(query fetch merge),最后一起返回给客户端。

    构造transportClient时候,需要指定sniff是否为true。

    if (this.settings.getAsBoolean("client.transport.sniff", false)) 
       { this.nodesSampler = new SniffNodesSampler(); } 
    else { this.nodesSampler = new SimpleNodeSampler(); } 

    这里先提一下:节点通信有5种类型:Recovery Bulk Reg State Ping

    网络层  

    Elasticsearch 的网络层抽象很值得借鉴。它抽象出一个 Transport 层,同时兼有client和server功能,server端接收其他节点的连接,client维持和其他节点的连接,承担了节点之间请求转发的功能。Elasticsearch 为了避免传输流量比较大的操作堵塞连接,所以会按照优先级创建多个连接,称为channel。

    • recovery: 2个channel专门用做恢复数据。如果为了避免恢复数据时将带宽占满,还可以设置恢复数据时的网络传输速度。

    • bulk: 3个channel用来传输批量请求等基本比较低的请求。

    • regular: 6个channel用来传输通用正常的请求,中等级别。

    • state: 1个channel保留给集群状态相关的操作,比如集群状态变更的传输,高级别。

    • ping: 1个channel专门用来ping,进行故障检测。

    (3个节点的集群连接示意,来源 Elasticsearch 官方博客)

    每个节点默认都会创建13个到其他节点的连接,并且节点之间是互相连接的,每增加一个节点,该节点会到每个节点创建13个连接,而其他每个节点也会创建13个连回来的连接。

    SniffNodesSampler:client会主动发现集群里的其他节点,会创建fully connect(每两个节点间建立5种连接)。这样即使手动添加的机器退服,transportClient还可以向其它集群节点发送请求。另外还支持负载均衡,每次请求都会随机访问一个集群节点。

    SimpleNodeSampler:这里创建的都是light connect(简单的ping和查询连接) ,只能在指定的节点间负载均衡,而且如果所有手动添加的机器退服,trnasportClient将无法连接集群进行操作。

    注意:在ES7中不建议使用Transport Client,在ES8中去除Transport Client用Java High Level REST Client代替

    访问远端集群,尽量以轮询方式访问目标节点

    2.如何选择JAVA客户端
    如果要将应用程序和 Elasticsearch 集群进行解耦,传输客户端是一个理想的选择。例如,如果您的应用程序需要快速的创建和销毁到集群的连接,传输客户端比节点客户端”轻”,因为它不是一个集群的一部分。类似地,如果您需要创建成千上万的连接,你不想有成千上万节点加入集群。传输客户端( TC )将是一个更好的选择。
    另一方面,如果你只需要有少数的、长期持久的对象连接到集群,客户端节点可以更高效,因为它知道集群的布局。但是它会使你的应用程序和集群耦合在一起,所以从防火墙的角度,它可能会构成问题。

  • 相关阅读:
    学习笔记之jq
    学习笔记之pytest
    本月学习小结(01/10
    本月学习小结(01/09
    学习笔记之Poetry
    学习笔记之Dynaconf
    学习笔记之asyncio — Asynchronous I/O
    Redis 根据key获取所有 HashKey
    Java ffmpeg 合成音视频文件
    Redis 存储中文方式
  • 原文地址:https://www.cnblogs.com/wzj4858/p/8127886.html
Copyright © 2011-2022 走看看