是时候用 ES 拯救发际线啦

elasticsearch5.6.6,java,RestHighLevelClient,使用路由(routing)后更慢了

Elasticsearch | 作者 xys2333 | 发布于2018年05月18日 | 阅读数:6379

ES5.6.6版本,使用RestHighLevelClient,java客户端,centOs6.5安装elasticsearch5.6.6
批量索引bulk
 
IndexRequest indexRequest = new IndexRequest("indexName", "type").source(indexJson).routing("user");
BulkRequest bulkRequest = new BulkRequest();
for (int i=0;i<5*10000;i++) {
            bulkRequest.add(indexRequest);
        }
hClient.bulk(bulkRequest);
***************************************************************************************************
查询时

BoolQueryBuilder qb = QueryBuilders.boolQuery()
.must(QueryBuilders.termQuery("type", "type2"));
;
TermsAggregationBuilder aggregation3 = AggregationBuilders
        .terms("by_column1").field("column1")
        .subAggregation(
        AggregationBuilders.topHits("top")
            .sort("column2", SortOrder.DESC)
            .size(1)
     )
        .subAggregation(
        AggregationBuilders.min("maxcolumn2").field("column12")
        )
        .order(Order.aggregation("maxcolumn2", false))
        .size(10000)
        ;
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(qb).aggregation(aggregation3);
for(int i=0;i<100;i++){
        long start =System.currentTimeMillis();
        SearchRequest searchRequest = new SearchRequest("indexName");
        searchRequest.types("type");
        searchRequest.source(sourceBuilder).routing("user");
        SearchResponse response = client.search(searchRequest);
        long end =System.currentTimeMillis();
        System.out.println(end-start);
}
*****************************************************************************************
集群信息:
机器信息:2台机器,每台32G机器内存,ES内存已改16G,CPU4: E5 2630L v2  4核
2个节点,1master,1data
3个索引,索引A(3分片,1副本,没用路由),索引B(3分片,2副本,使用路由user),索引C(3分片,1副本,使用路由user)
索引A,B,C的mapping都一样,大概有25个字段,都是keyword,long,date类型。
 
查询效率:
在1000W数据时,连续查询100次,取平均值AVG
索引A   257.31ms,索引B  728.09ms,索引C  721.54ms
 
在1亿数据时,连续查询100次,取平均值AVG
索引A   2419.13ms,索引B  6693.77ms,索引C  6678.25ms
 
总结:
不是副本数量越大,查询效率越高吗?但是为什么现在实验结果是相反的。
另外添加路由后,不是查询会更快了吗?
已邀请:

yayg2008

赞同来自: medcl

“不是副本数量越大,查询效率越高吗?”--这个是在你的物理data节点>总分片数的情况下才成立的,副本被分配到新的节点,可以利用到更多资源。如果你就1个data节点,副本数多了,只能适得其反。
routing 的作用是让ES使用我们提供的标志去hash,将数据存储到哪个分片,此处你使用的是user,那么你去查看你的data分布,应该会集中在1个分片中,而不是均衡分布。routing的好处是查询时,可以通过routing告诉ES直接去哪个分片获取数据,而不用查询所有分片,然后再进行汇总。

xys2333 - 90

赞同来自:

增加另一个测试:
A索引(没路由,3分片,1副本),数据总量:3000W,其中要查询的数据有1000W(分散在3个分片里)
B索引(指定路由,3分片,1副本),数据总量:3000W,其中要查询的数据有1000W(都在一个分片里)
注:A,B索引的每个分片的数据都是1000W
 
查询语句同上,时间:
A:328.22ms
B:816.96ms
 
总结:
       同样在一个索引的3000W数据里找1000W数据,使用了路由比没使用路由更慢。
       在第一次的ABC,3个索引的案例里,索引使用路由,都是数据集中在一个分片,其他分片数据量为0的情况下测试。
       现在在同样的数据量分布情况下,使用路由还是更慢了。
       有人能告诉我是什么原理吗?
 

要回复问题请先登录注册