我有一个Java API,可将文档插入三个弹性索引,并且可以正常工作。我想在API中更改一个索引的主机。通常,EsConfig文件和ElasticSearchTemplate代码为;
public class EsConfig {
@Value("${elasticsearch.host}")
private String EsHost;
@Value("${elasticsearch.port}")
private int EsPort;
@Value("${elasticsearch.clustername}")
private String EsClusterName;
@Bean
public Client client() throws Exception {
Settings settings = Settings.builder()
.put("cluster.name", EsClusterName)
//.put("index.max_result_window", 4000000)
.build();
TransportClient client = new PreBuiltTransportClient(settings)
.addTransportAddress(new
TransportAddress(InetAddress.getByName(EsHost), EsPort));
return client;
}
@Bean
public ElasticsearchTemplate elasticsearchTemplate() throws Exception {
ElasticsearchTemplate elasticsearchTemplate = new ElasticsearchTemplate(client());
return elasticsearchTemplate;
}
}
我想配置此结构以同时使用两个主机。这种结构是否可行?或者我应该完全更改并删除单例bean结构吗?
答案 0 :(得分:0)
Elasticsearch客户端api允许您以以下方式配置多个主机名,但不幸的是,它们无法按预期工作。
根据此LINK
TransportClient远程连接到Elasticsearch集群 使用运输模块。它不加入集群,只是 获取一个或多个初始传输地址并与之通信 它们在每个动作上都采用循环方式(尽管大多数动作会 可能是“两跳”操作)。
TransportClient client = new PreBuiltTransportClient(Settings.EMPTY)
.addTransportAddress(new TransportAddress(InetAddress.getByName("host1"), 9300))
.addTransportAddress(new TransportAddress(InetAddress.getByName("host2"), 9300));
您可能可以做的是继续实施Profiles的Spring Boot概念,在其中可以创建多个application.properties
。以下是实现此目的的方法之一。
如果我有两个不同的主机/环境,例如dev
和prod
,最后我将创建三个应用程序属性文件(两个用于环境,一个用于描述您要选择的环境的属性)。
application-dev.properties
elasticsearch.clustername = mycluster_name
elasticsearch.host = mydev.abc.com <-- Configure the name of host 1
elasticsearch.port = 9300
application-prod.properties
elasticsearch.clustername = mycluster_name_2
elasticsearch.host = myprod.abc.com <-- Configure the name of host 2
elasticsearch.port = 9300
application.properties
spring.profiles.active=dev <-- Configure which of the above properties do you want to start application with
现在,当您以弹簧启动方式运行应用程序时,它将最终启动dev
环境。
请注意,我假设这两个节点都位于不同的群集中,而不属于同一群集。我指定它的原因是,如果Elasticsearch收到新的/更新的文档,它将在内部继续进行并更新其他节点的副本分片。在同一群集中,您指向群集中的哪个主机都没有关系。
让我知道这是否是您想要的。