elasticsearch中client.transport.sniff的使用方法和注意事项

(1)通过TransportClient这个接口,我们可以不启动节点就可以和es集群进行通信,它需要指定es集群中其中一台或多台机的ip地址和端口,例子如下:

Client client = new TransportClient()    
            .addTransportAddress(newInetSocketTransportAddress("host1", 9300))    
            .addTransportAddress(newInetSocketTransportAddress("host2", 9300));    
client.close();   

(2)如果你需要更改集群名(默认是elasticsearch),需要如下设置:

Settings settings =ImmutableSettings.settingsBuilder()    
                    .put("cluster.name","myClusterName").build();    
Client client = newTransportClient(settings);  

(3)你可以设置client.transport.sniff为true来使客户端去嗅探整个集群的状态,把集群中其它机器的ip地址加到客户端中。这样做的好处是,一般你不用手动设置集群里所有集群的ip到连接客户端,它会自动帮你添加,并且自动发现新加入集群的机器。代码实例如下:

Settings settings = ImmutableSettings.settingsBuilder()    
                   .put("client.transport.sniff", true).build();    
TransportClienclient = new TransportClient(settings);  

注意:当ES服务器监听(publish_address )使用内网服务器IP,而访问(bound_addresses )使用外网IP时,不要设置client.transport.sniff为true。不设置client.transport.sniff时,默认为false(关闭客户端去嗅探整个集群的状态)。因为在自动发现时会使用内网IP进行通信,导致无法连接到ES服务器。因此此时需要直接使用addTransportAddress方法把集群中其它机器的ip地址加到客户端中。举例如下。

使用docker安装es,下面是部分es启动日志:
[2018-03-10T05:56:20,639][INFO ][o.e.n.Node               ] [node-1] starting ...
[2018-03-10T05:56:20,994][INFO ][o.e.t.TransportService   ] [node-1] publish_address {172.17.0.3:9300}, bound_addresses {0.0.0.0:9300}
[2018-03-10T05:56:21,036][INFO ][o.e.b.BootstrapChecks    ] [node-1] bound or publishing to a non-loopback or non-link-local address, enforcing bootstrap checks
[2018-03-10T05:56:24,373][INFO ][o.e.c.s.ClusterService   ] [node-1] new_master {node-1}{xBV8XSG0QDeSSSjqBidBzg}{9IE0hcJRQBWp4ZOjPkWajg}{172.17.0.3}{172.17.0.3:9300}, reason: zen-disco-elected-as-master ([0] nodes joined)
[2018-03-10T05:56:24,644][INFO ][o.e.h.n.Netty4HttpServerTransport] [node-1] publish_address {172.17.0.3:9200}, bound_addresses {0.0.0.0:9200}
[2018-03-10T05:56:24,644][INFO ][o.e.n.Node               ] [node-1] started

此时172.17.0.3为内网ip。此时将client.transport.sniff设置为true是不合适的。因为采用TransportClient 连接es时,可能会报如下错误:

2018-03-10 15:06:01 [DEBUG][org.elasticsearch.client.transport.TransportClientNodesService][validateNewNodes][376]-> failed to connect to discovered node [{node-1}{xBV8XSG0QDeSSSjqBidBzg}{9IE0hcJRQBWp4ZOjPkWajg}{172.17.0.3}{172.17.0.3:9300}]
org.elasticsearch.transport.ConnectTransportException: [node-1][172.17.0.3:9300] connect_timeout[30s]
	at org.elasticsearch.transport.netty4.Netty4Transport.connectToChannels(Netty4Transport.java:363)
	at org.elasticsearch.transport.TcpTransport.openConnection(TcpTransport.java:570)
	at org.elasticsearch.transport.TcpTransport.connectToNode(TcpTransport.java:473)
Caused by: io.netty.channel.AbstractChannel$AnnotatedConnectException: Connection timed out: no further information: 172.17.0.3/172.17.0.3:9300
	at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)
	at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:717)
	at io.netty.channel.socket.nio.NioSocketChannel.doFinishConnect(NioSocketChannel.java:325)
......
Caused by: java.net.ConnectException: Connection timed out: no further information
	... 10 common frames omitted

或者报以下错误

NoNodeAvailableException[None of the configured nodes are available: [{#transport#-1}{VTss4h8SRsCpP6EW5PoLrQ}{192.168.106.128}{192.168.106.128:9300}]
]
	at org.elasticsearch.client.transport.TransportClientNodesService.ensureNodesAreAvailable(TransportClientNodesService.java:347)
	at org.elasticsearch.client.transport.TransportClientNodesService.execute(TransportClientNodesService.java:245)
	at org.elasticsearch.client.transport.TransportProxyClient.execute(TransportProxyClient.java:59)
......


参考和转载地址:点击打开链接

### 配置 Elasticsearch 的 `application.yml` 文件 为了在 Spring Boot 应用程序中配置 Elasticsearch,可以通过修改 `application.yml` 或者 `application.properties` 来指定连接参数其他设置。以下是针对 `application.yml` 文件的具体配置方式: #### 基础配置项 对于 REST 客户端类型的连接,可以如下定义基本的连接信息[^1]: ```yaml spring: elasticsearch: rest: uris: http://localhost:9200 username: elastic password: changeme ``` 上述配置指定了 Elasticsearch 实例的位置以及用于身份验证的用户名密码。 #### 进阶配置选项 如果需要更复杂的配置,比如调整客户端行为或者启用 SSL/TLS 加密通信,则可进一步扩展配置内容[^3]: ```yaml spring: data: elasticsearch: properties: client.transport.sniff: true request.headers.X-Found-Cluster: "production" elasticsearch: rest: uris: https://es.example.com:9243 username: admin password: secret connection-timeout: 10s read-timeout: 30s socket-timeout: 60s ``` 这里不仅设置了 URI 认证凭证,还增加了超时时间等高级选项,并启用了嗅探功能来自动发现集群节点。 #### 使用 Java Config 方式补充自定义 Bean 有时仅靠 YAML 文件不足以满足需求,在这种情况下还可以通过编写额外的 Java 类来进行更加灵活的定制化操作[^2]。例如创建一个新的配置类并注册特定于项目的 Repository 接口实现或其他组件实例。 ```java @Configuration public class ElasticConfig { @Bean public RestHighLevelClient client() { final ClientConfiguration clientConfiguration = ClientConfiguration.builder() .connectedTo("localhost:9200") .usingSsl() .withBasicAuth("elastic", "changeme") .build(); return RestClients.create(clientConfiguration).rest(); } } ``` 此代码片段展示了如何利用编程手段构建带有 HTTPS 支持及基础授权机制的服务端客户对象。 #### 注意事项 当涉及到敏感数据(如密码)时,请考虑将其存储在一个安全的地方而不是直接写入源码仓库中的配置文件里;另外记得根据实际环境调整各项数值以获得最佳性能表现。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值