Elasticsearch Java Rest Client Bean配置多节点连接的用途与集群归属疑问
多连接地址配置的适用场景
- 高可用容灾:当你配置的其中一个节点宕机时,客户端会自动将请求转发到其余正常节点,避免单点故障导致整个ES服务不可用
- 请求负载均衡:客户端会自动将读写请求分散到多个配置的节点上,降低单节点的请求压力,提升整体吞吐量
- 本地多节点测试:本地开发环境如果搭建了单机器多实例的ES测试集群,不同端口对应同一个集群的不同节点,配置所有节点地址可以完整模拟生产集群的请求调度逻辑
连接池通信范围说明
你配置的两个端口对应的节点默认属于同一个集群,连接池内的所有线程都是与这一个集群通信,不会对应两个独立集群:
Java High Level Rest Client 底层的low-level客户端会把你传入
RestClient.builder的所有HttpHost都识别为同一个集群的协调节点,连接池会维护和所有配置节点的长连接,请求时会按照负载均衡策略选择节点发送。
如果9200和9201实际是两个独立集群的地址,不要采用这种配置方式,会出现请求随机分发到两个集群、数据读写不一致、查询结果异常的问题。如需连接多个独立集群,需要分别初始化多个独立的RestHighLevelClient实例,每个实例单独配置对应集群的节点地址。
你给出的初始化代码是标准的单集群多节点配置写法:
@Override @Bean public RestHighLevelClient elasticsearchClient() { RestHighLevelClient client = new RestHighLevelClient( RestClient.builder( new HttpHost("localhost", 9200, "http"), new HttpHost("localhost", 9201, "http"))); return client; }
内容的提问来源于stack exchange,提问作者Aditya
相关产品推荐
相关产品推荐

