优化Elasticsearch的写入

我们这边因为需要对trace系统的数据做一些高级查询,所以会将Span的可能会被用作搜索条件的信息写入elasticsearch中。
由于trace系统的数据量比较大,虽然trace系统本身的设计会有采样率这个东西来降低trace采集的数据量,但是本身还是
比较大的数据量。所以需要对es的写入做一些优化。这篇文章记录一下我们的优化项

分析我们场景的特点:

  • 写请求特别大
  • 读请求很少,实时性要求低
  • trace系统对数据的可靠性要求低,但是要求写入及时(数据的价值会随着时间而降低)

贴一下我们优化以后的template设置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
{
"order": 0,
"index_patterns": [
"trace.advanced.query-*"
],
"settings": {
"index": {
"refresh_interval": "120s",
"number_of_shards": "10",
"translog": {
"flush_threshold_size": "1024mb",
"sync_interval": "120s",
"durability": "async"
},
"number_of_replicas": "0"
}
},
"mappings": {},
"aliases": {}
}

主要的优化步骤:

  • 关闭副本,设置number_of_replicas为0 在我们的场景下数据丢了是可以忍受的
  • 调大translog.flush_threshold_size,我们设置的为1024mb
  • 调大translog.sync_interval为120s
  • 我们容许数据丢失,设置async模式

因为我们目前的es集群性能是足够的,所以并没有完全按照参考文章将 ELASTICSEARCH 写入速度优化到极限中的所有项目都优化。推荐大家阅读这个参考文章,比我写的好多了。

参考资料

org.elasticsearch.client.transport.NoNodeAvailableException: None of the configured nodes are available

问题描述

今天在操作es的过程中出现了异常:

1
2
org.elasticsearch.client.transport.NoNodeAvailableException: None of the
configured nodes are available

而我创建es client的代码也很简单,核心是:

1
2
3
4
Settings settings = Settings.builder()
.put("cluster.name", esClusterInfo.getClusterName())
.put("client.transport.sniff", true) //自动嗅探整个集群的状态,把集群中其他ES节点的ip添加到本地的客户端列表中
.build();

我的排查步骤

记录一下我当时的排查过程:

  • 看异常第一反应是集群有问题,但是排查集群的节点以后,发现集群的节点都是没问题的。
  • 而后开始检查settings中设置的cluster.name的是否正确发现也是正确的
  • google发现很多人是因为将es集群的端口写错,也就是9300错写为9200,但是检查我的数据以后发现也是没问题的。
  • 而后开始怀疑我设置的client.transport.sniff的缘故,因为这个参数的作用是:

使客户端去嗅探整个集群的状态,把集群中其它机器的ip地址加到客户端中。这样做的好处是,一般你不用手动设置集群里所有集群的ip到连接客户端,它会自动帮你添加,并且自动发现新加入集群的机器

但是这个参数有一个问题就是:

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

但是检查我的环境,发现我的环境全部是内网,所以设置不设置这个client.transport.sniff是没区别的。

最后持续google许久,也没发现问题,喝杯茶刷了一会手机突然想起印象中es client的版本和es集群的版本不一致也有可能
出问题,于是google了一波es 版本不一致这个关键字,果然是因为版本不一致导致的。

ES client和ES集群版本不一致的问题

我遇到的这个问题是es集群的版本比我使用的es client的版本低,相当于我使用高版本的client去访问低版本的集群,所以出现org.elasticsearch.client.transport.NoNodeAvailableException: None of the configured nodes are available问题。

因此我们平时需要注意es的版本问题。

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×