(注意:此答案使用 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:9200 和 es02 到 localhost: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