转自:https://blog.csdn.net/jiao_fuyou/article/details/50511255html
根据Elasticsearch中文社区《ES冷热分离(读写分离) hot, stale 场景》一篇整理的。node
写一个定时任务天天凌晨将前一天的索引标记为stalemysql
PUT /index_name/_settings
{
"index.routing.allocation.include.zone" : "stale" }
这样旧索引数据会自动迁移到stale集群上sql
详细状况参考:
https://www.elastic.co/guide/en/elasticsearch/reference/2.1/modules-cluster.html
https://www.elastic.co/guide/en/elasticsearch/reference/2.1/cluster-reroute.htmlbash
上面的规则有时并不能彻底的控制复本必定在某个集群上,它只能尽可能保证主分片和副本不在一个集群上,这个时候一样也能够起个定时任务,手动的将副本reroute到集群节点上elasticsearch
POST /_cluster/reroute
{
"commands" : [ { "move" : { "index" : "test", "shard" : 0, "from_node" : "node1", "to_node" : "node2" } }, { "allocate" : { "index" : "test", "shard" : 1, "node" : "node3" } } ] }
https://www.elastic.co/guide/en/elasticsearch/reference/2.1/modules-cluster.html
https://www.elastic.co/guide/en/elasticsearch/reference/2.1/cluster-reroute.htmlide
上面两种方法将冷热,读写数据都分布到了不一样的集群上,下面看看如何在指定查询参数,只查询stale集群节点上的数据。ui
POST /_search?preference=_only_nodes:zone:stale
{
"query": { "match": { "title": "elasticsearch" } } }
可是须要注意一点的是:由于es的replica也是一个实际须要cpu和io的indexing过程,并且indexing自己也有要求要写够必定副本数来才算写入完成。因此,你即便只请求replica,也是有可能影响到写入的。.net
因此,你只能开启一个副本——写入副本数要求是从二个副本开始才有。