当前位置: 首页 > 面试题库 >

使用NEST访问Elasticsearch Docker实例

鄢晔
2023-03-14
问题内容

我使用Docker Compose运行了一个简单的Elasticsearch实例:

---
version: '2'
services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:6.1.1
    hostname: elasticsearch
    environment:
      - cluster.name=docker-cluster
      - bootstrap.memory_lock=true
      - ES_JAVA_OPTS=-Xms512m -Xmx512m
    ulimits:
      memlock:
        soft: -1
        hard: -1
    mem_limit: 1g
    ports:
      - 9200:9200

  kibana:
    image: docker.elastic.co/kibana/kibana:6.1.1
    environment:
      SERVER_NAME: "0.0.0.0"
      ELASTICSEARCH_URL: http://elasticsearch:9200
    ports:
      - 5601:5601

我可以使用localhost从浏览器访问它,但是当我运行我的应用程序并连接到它时,遇到了一些问题。从我能够跟踪到的内容来看,应用程序似乎成功连接到Elasticsearch实例,然后解析了它绑定的IP,然后使用该IP地址与Elasticsearch实例进行通信。

来自Fiddler:

  1. http://10.0.75.2:9200/_nodes/http,settings?flat_settings&timeout=2s
  2. 它返回具有以下行的json: "host": "172.18.0.4"
  3. 然后它尝试使用该IP地址,但我的请求失败,因为它无法解析该IP地址

为了能够从C#应用程序成功连接到我的Elasticsearch实例,我应该改变什么?

NEST版本:5.5.0


问题答案:

(注意:此答案使用NEST 7.1.0和Elasticsearch 7.2.0,但基本概念相同)。

SniffingConnectionPool植入连接池后,将使用http.publish_address节点的。这意味着客户端必须可以访问http发布地址。如果未显式设置,它将使用from中的值http.host,如果未设置,将使用network.host,这将是专用网络上的地址。

使用docker之类的配置

version: '2.2'
services:
  es01:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.2.0
    container_name: es01
    environment:
      - node.name=es01
      - discovery.seed_hosts=es02
      - cluster.initial_master_nodes=es01,es02
      - cluster.name=docker-cluster
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      - "http.port=9200"
      - "http.publish_host=_local_"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - esdata01:/usr/share/elasticsearch/data
    ports:
      - 9200:9200
    networks:
      - esnet
  es02:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.2.0
    container_name: es02
    environment:
      - node.name=es02
      - discovery.seed_hosts=es01
      - cluster.initial_master_nodes=es01,es02
      - cluster.name=docker-cluster
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      - "http.port=9201"
      - "http.publish_host=_local_"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - esdata02:/usr/share/elasticsearch/data
    ports:
      - 9201:9201
    networks:
      - esnet

volumes:
  esdata01:
    driver: local
  esdata02:
    driver: local

networks:
  esnet:

es01节点被映射到localhost:9200es02localhost:9201。我们本来可以指定它es02在9200上的容器中运行,并将其映射到9201的主机端口,但是这样做的问题是es02http.publish_address仍然是127.0.0.1:9200,这将成为SniffingConnectionPool播种时最终使用的内容节点。为避免这种情况,我们在es02与的不同端口上运行es01,以便http发布地址将不同。

使用以上配置,http://localhost:9200/_nodes?filter_path=nodes.*.http返回

{
  "nodes": {
    "CSWncVnxS1esOm1KQtOR3A": {
      "http": {
        "bound_address": ["0.0.0.0:9200"],
        "publish_address": "127.0.0.1:9200",
        "max_content_length_in_bytes": 104857600
      }
    },
    "rOAp0T57TgSI_zU1L-T-vw": {
      "http": {
        "bound_address": ["0.0.0.0:9201"],
        "publish_address": "127.0.0.1:9201",
        "max_content_length_in_bytes": 104857600
      }
    }
  }
}

如果尝试这样做,则节点名称将有所不同 )。现在,SniffingConnectionPool将工作

private static void Main()
{
    var defaultIndex = "posts";
    var uris = new[]
    {
        new Uri("http://localhost:9200"),
        new Uri("http://localhost:9201")
    };

    var pool = new SniffingConnectionPool(uris);

    var settings = new ConnectionSettings(pool)
        .DefaultIndex(defaultIndex);

    var client = new ElasticClient(settings);

    var response = client.Nodes.Info();

    foreach (var node in response.Nodes)
    {
        Console.WriteLine($"{node.Key} http publish_address is: {node.Value.Http.PublishAddress}");
    }
}

版画

CSWncVnxS1esOm1KQtOR3A http publish_address is: 127.0.0.1:9200
rOAp0T57TgSI_zU1L-T-vw http publish_address is: 127.0.0.1:9201


 类似资料:
  • 问题内容: 我索引我的查询,如下所示: 现在,如何使用ES的过滤器功能将传入文档与此查询匹配?要说在这方面缺少NEST文档,那就太轻描淡写了。我尝试使用call,但是现在不推荐使用,他们建议使用search api,但不要告诉如何将其与percolator一起使用… 我正在使用 ES v5 和相同版本的NEST lib。 问题答案: GA发布后,有计划改进 5.x 的文档。我知道在许多地方文档可能

  • 问题内容: 我正在寻找一种在Java App(使用JDBC)中打开Access MDB文件的方法。 快速的Google搜索建议我为此需要JDBC-ODBC Bridge。 这是否意味着我需要配置要在其上运行应用程序的每个系统,以便为要打开的MDB提供ODBC DSN? 还有一个问题(因为我以前从未使用过ODBC):通信是通过某种套接字(以客户机/服务器方式)还是通过方法/函数调用(例如嵌入Derb

  • 本文向大家介绍java使用HttpSession实现QQ访问记录,包括了java使用HttpSession实现QQ访问记录的使用技巧和注意事项,需要的朋友参考一下 java如何使用HttpSession实现QQ的访问记录,本文为大家揭晓答案,具体内容如下 1. 编写QQ空间数据类(QQS.java) 2. 编写一个现实QQ数据和浏览记录的页面(ListServlet.java) 3. 编写一个存储

  • 本文向大家介绍python使用代理ip访问网站的实例,包括了python使用代理ip访问网站的实例的使用技巧和注意事项,需要的朋友参考一下 实例如下所示: whatismyip是一个查询ip的网站,上面代码我使用了27.155.101.233,端口号是3128对这个网站进行访问 这是输出信息: 可以看到已经使用了27.155.101.233这个代理ip对whatismyip进行访问,但是没有做到高

  • 问题内容: 我在让NEST的DeleteByQuery方法工作时遇到了一些困难。 很简单,查询永远找不到要删除的内容,我也不知道为什么。我正在使用相同的查询来返回记录(使用搜索),并且一切正常。 我只是刚刚开始使用NEST,所以我确定这是一个非常简单的问题,而且我有点昏暗! 任何帮助/建议,不胜感激。 问题答案: 的是上的.NET方法支票是否相等。 如果您更改对它的呼叫,则应该可以使用。