elasticsearch滚动重启

总有一天你会需要做一次集群的滚动重启——保持集群在线和可操作,但是逐一把节点下线。

常见的原因:Elasticsearch 版本升级,或者服务器自身的一些维护操作(比如操作系统升级或者硬件相关)。不管哪种情况,都要有一种特别的方法来完成一次滚动重启。

正常情况下,Elasticsearch 希望你的数据被完全的复制和均衡的分布。如果你手动关闭了一个节点,集群会立刻发现节点的丢失并开始再平衡。如果节点的维护是短期工作的话,这一点就很烦人了,因为大型分片的再平衡需要花费相当的时间(想想尝试复制 1TB 的数据——即便在高速网络上也是不一般的事情了)。

我们需要的是,告诉 Elasticsearch 推迟再平衡,因为对外部因子影响下的集群状态,我们自己更了解。操作流程如下:

  1. 可能的话,停止索引新的数据。虽然不是每次都能真的做到,但是这一步可以帮助提高恢复速度。
  2. 禁止分片分配。这一步阻止 Elasticsearch 再平衡缺失的分片,直到你告诉它可以进行了。如果你知道维护窗口会很短,这个主意棒极了。你可以像下面这样禁止分配:
    PUT /_cluster/settings
    {
        "transient" : {
            "cluster.routing.allocation.enable" : "none"
        }
    }
    
  3. 关闭单个节点。
  4. 执行维护/升级。
  5. 重启节点,然后确认它加入到集群了。
  6. 用如下命令重启分片分配:
    PUT /_cluster/settings
    {
        "transient" : {
            "cluster.routing.allocation.enable" : "all"
        }
    }
    
  7. 重复第 2 到 6 步操作剩余节点。
  8. 到这步你可以安全的恢复索引了(如果你之前停止了的话),不过等待集群完全均衡后再恢复索引,也会有助于提高处理速度。

转载地址:官方

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Elasticsearch滚动索引可以用来遍历大量数据,而不会导致内存溢出或超时。下面是Java代码实现滚动索引的步骤: 1.创建Elasticsearch客户端: ``` TransportClient client = new PreBuiltTransportClient(Settings.EMPTY) .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300)); ``` 2.定义搜索条件: ``` SearchRequestBuilder searchRequestBuilder = client.prepareSearch("indexName") .setTypes("typeName") .setQuery(QueryBuilders.matchAllQuery()) .setSize(100) .setScroll(new TimeValue(60000)); ``` 这里设置了每次搜索返回100条记录,并且每次搜索的有效时间为60秒。 3.执行搜索: ``` SearchResponse searchResponse = searchRequestBuilder.execute().actionGet(); ``` 4.处理搜索结果: ``` while (true) { for (SearchHit searchHit : searchResponse.getHits().getHits()) { // 处理每个搜索结果 } searchResponse = client.prepareSearchScroll(searchResponse.getScrollId()) .setScroll(new TimeValue(60000)).execute().actionGet(); if (searchResponse.getHits().getHits().length == 0) { break; } } ``` 通过循环,我们可以遍历所有搜索结果。在每次循环结束后,我们需要使用`prepareSearchScroll`方法获取下一页搜索结果,直到没有更多结果为止。 5.关闭客户端: ``` client.close(); ``` 完整的Java代码示例: ``` TransportClient client = new PreBuiltTransportClient(Settings.EMPTY) .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300)); SearchRequestBuilder searchRequestBuilder = client.prepareSearch("indexName") .setTypes("typeName") .setQuery(QueryBuilders.matchAllQuery()) .setSize(100) .setScroll(new TimeValue(60000)); SearchResponse searchResponse = searchRequestBuilder.execute().actionGet(); while (true) { for (SearchHit searchHit : searchResponse.getHits().getHits()) { // 处理每个搜索结果 } searchResponse = client.prepareSearchScroll(searchResponse.getScrollId()) .setScroll(new TimeValue(60000)).execute().actionGet(); if (searchResponse.getHits().getHits().length == 0) { break; } } client.close(); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值