让Elasticsearch集群冷热分离、读写分离【转】

转自:https://blog.csdn.net/jiao_fuyou/article/details/50511255html

根据Elasticsearch中文社区《ES冷热分离(读写分离) hot, stale 场景》一篇整理的。node

1、冷热分离

2、读写分离

  • 即便这样处理后,hot集群即便只有一两数据,可是通常象log类数据,查询的通常都是最近一两天的数据,导致hot集群负载依然很大。es有没有办法实现像mysql主从的效果,而后查询只在从机上查询?有没有办法让副本分布在某些特定节点上,而后查询只查询这些节点?
  • 按《elasticsearch高级配置之分片分布规则设置》中(强制分布规则)来设置,迫使不容许副本被分配到与主分片相同的区域,好比:让副本数据分布到stale集群上。
  • 上面的规则有时并不能彻底的控制复本必定在某个集群上,它只能尽可能保证主分片和副本不在一个集群上,这个时候一样也能够起个定时任务,手动的将副本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

3、查询选项

  • 上面两种方法将冷热,读写数据都分布到了不一样的集群上,下面看看如何在指定查询参数,只查询stale集群节点上的数据。ui

    POST /_search?preference=_only_nodes:zone:stale
    {
        "query": { "match": { "title": "elasticsearch" } } }
  • 上面这个能够只查询node.zone: stale节点数据。这个查询选项要求ES版本在1.7.0以上。关于查询选项详细资料参考: 
  • https://www.elastic.co/guide/en/elasticsearch/reference/1.7/search-request-preference.html?q=preferencespa

4、总结

    1. 已经再也不indexing的索引,经过require.zone的方式迁移到stale集群上,完成冷热分离;
    2. 还在indexing的索引,经过reroute将replica shard强制allocate到stale集群上;
    3. search的时候,经过?preference=_replica或者?preference=_only_nodes:xxx的方式指定读取哪些。
    4. 可是须要注意一点的是:由于es的replica也是一个实际须要cpu和io的indexing过程,并且indexing自己也有要求要写够必定副本数来才算写入完成。因此,你即便只请求replica,也是有可能影响到写入的。.net

      因此,你只能开启一个副本——写入副本数要求是从二个副本开始才有。

相关文章
相关标签/搜索