elasticsearch的rack_id和zone的使用来实现es的定向请求和有意识的分区备份

在使用es时,我们有时候希望分片分布在特地的机器上,或者希望请求在某些机器上执行,es为我们提供了Shard Allocation Awareness的概念,即通过用户对集群节点的标识,es集群会自动的去为节点划分区间,然后根据节点所处区间,为节点分配primary shard和replica。
其主要通过rack_id和zone来实现。

官方文档实例有两个标记选项:rack_id和zone,两者都可以为节点划分区间。假设有五个分片一个副本,此时只有一个区间A的话,使用rack_id属性,区间A会同时存在主分配和其副本,当增加区间B时,集群会把备份备份或者主分片转移到区间B中,保证两个区间都有完整数据;而使用zone属性的话,当只存在区间A时,区间A只会存在主分片,只有当存在区间A和B时,集群才会创建分片,并保证两个区间都有完整数据。

PS:zone还可以作用在索引上,指定某个请求在哪个区间执行。

通过测试,发现确实符合官网文档的描述。
- 1、primary和replication混合散落在两个分区上,最终结果满足每个分区都有完整的数据备份(包括某个分区内有节点挂掉后,重新分配的结果),不过primary和replication是混合分布的,而不是相互分离。
- 2、在执行操作时,默认在同区间去执行请求,包括请求client,client会把请求转发到本区间的master上,而本区间的master在调用dataNode时,也是调用的本区间的节点。

第一点是很好测试的,搭建集群,创建索引,观察,然后down调节点,观察即可。

关于第二点的测试方式如下:
es中有慢日志记录功能,我们可以把慢日志的阈值给设置的很小,然后进行查询,再观察每个节点的日子记录(es的日志是分节点记录的,所以我们可以根据节点下有没有慢日志记录来判断节点有没有参与请求)


PUT http://192.168.1.112:9101/index_name/_settings
{
    "index.search.slowlog.threshold.fetch.debug": "1ms" 
}
PUT http://192.168.1.112:9101/_cluster/settings
{
    "transient" : {
        "logger.index.search.slowlog" : "DEBUG"
    }
}

测试完记得把配置改回去。

有问题欢迎交流。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Elasticsearch使用深度分页功能需要注意以下几点: 1. 尽量避免使用深度分页功能,因为它会增加网络和计算开销,可能导致性能问题。 2. 深度分页功能是通过设置 from 和 size 参数来实现的。from 参数表示从哪个位置开始查询,size 参数表示每页返回的文档数量。 3. Elasticsearch 默认最多只能返回 10000 条记录,如果需要查询更多的记录,需要设置 index.max_result_window 参数。但是设置太大会占用过多的内存,影响性能。 下面是一个 Java 实现 Elasticsearch 分页查询的示例代码: ``` import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.action.search.SearchType; import org.elasticsearch.client.Client; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.SearchHits; import org.elasticsearch.search.sort.SortBuilders; import org.elasticsearch.search.sort.SortOrder; public class ESQuery { private Client client; public ESQuery(Client client) { this.client = client; } public void search(String index, String type, int from, int size) { SearchResponse response = client.prepareSearch(index) .setTypes(type) .setQuery(QueryBuilders.matchAllQuery()) .addSort(SortBuilders.fieldSort("_id").order(SortOrder.DESC)) .setSearchType(SearchType.DFS_QUERY_THEN_FETCH) .setFrom(from) .setSize(size) .execute() .actionGet(); SearchHits hits = response.getHits(); for (SearchHit hit : hits) { System.out.println(hit.getSourceAsString()); } } } ``` 调用示例: ``` ESQuery esQuery = new ESQuery(client); esQuery.search("my_index", "my_type", 0, 10); // 查询第一页,每页10条记录 esQuery.search("my_index", "my_type", 10, 10); // 查询第二页,每页10条记录,从第11条记录开始 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值