【问题标题】:Accessing Elasticsearch Docker instance using NEST使用 NEST 访问 Elasticsearch Docker 实例
【发布时间】:2018-06-08 22:58:00
【问题描述】:

我使用 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 实例通信。

来自提琴手:

  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

【问题讨论】:

    标签: docker elasticsearch docker-compose nest


    【解决方案1】:

    我只需在我的设置中将SniffingConnectionPool 更改为StaticConnectionPool 即可解决此问题。

    【讨论】:

    • 很好,你把它整理好了。 SniffingConnectionPool 嗅探集群中的节点以确定它可以向哪些节点发送请求,使用publish_address,如果没有publish_address,则使用第一个bound_address 作为向集群发出请求的地址:github.com/elastic/elasticsearch-net/blob/….
    • 是的。当我问这个问题时,我记得我可以使用不止一个连接池。去文档,找到你所说的。感谢您的澄清!
    • 谢谢@EvaldasBuinauskas,我整个上午都在诅咒docker和NEST。
    【解决方案2】:

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

    SniffingConnectionPool 在连接池中播种时将使用http.publish_address of the node。这意味着客户端必须可以访问 http 发布地址。如果未明确设置,它将使用来自http.host 的值,如果未设置,将使用network.host,这将是专用网络上的地址。

    使用类似 docker compose 的配置

    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的主机端口,但是这样做的问题是es02的http.publish_address仍然是127.0.0.1:9200,这是SniffingConnectionPool 在播种节点时最终使用的内容。为了避免这种情况,我们在与es01 不同的端口上运行es02,这样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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-19
      • 1970-01-01
      • 1970-01-01
      • 2021-01-31
      • 2018-07-26
      • 1970-01-01
      • 2019-08-25
      • 2022-09-24
      相关资源
      最近更新 更多