1. 程式人生 > >讓Elasticsearch叢集冷熱分離、讀寫分離【轉】

讓Elasticsearch叢集冷熱分離、讀寫分離【轉】

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

一、冷熱分離

二、讀寫分離

  • 即使這樣處理後,hot叢集即使只有一兩資料,但是一般象log類資料,查詢的一般都是最近一兩天的資料,致使hot叢集負載依然很大。es有沒有辦法實現像mysql主從的效果,然後查詢只在從機上查詢?有沒有辦法讓副本分佈在某些特定節點上,然後查詢只查詢這些節點?
  • 按《elasticsearch高階配置之分片分佈規則設定》中(強制分佈規則)來設定,迫使不允許副本被分配到與主分片相同的區域,比如:讓副本資料分佈到stale叢集上。
  • 上面的規則有時並不能完全的控制複本一定在某個叢集上,它只能儘量保證主分片和副本不在一個叢集上,這個時候同樣也可以起個定時任務,手動的將副本reroute到叢集節點上

    POST /_cluster/reroute
    {
        "commands" : [ {
            "move" :
                {
                  "index" : "test", "shard" : 0,
                  "from_node" : "node1", "to_node" : "node2"
                }
            },
            {
              "allocate" : {
                  "index" : "test", "shard" : 1, "node" : "node3"
              }
            }
        ]
    }
  • 詳細情況參考: 

三、查詢選項

  • 上面兩種方法將冷熱,讀寫資料都分佈到了不同的叢集上,下面看看如何在指定查詢引數,只查詢stale叢集節點上的資料。

    POST /_search?preference=_only_nodes:zone:stale
    {
        "query": {
            "match": {
                "title": "elasticsearch"
            }
        }
    }
  • 上面這個可以只查詢node.zone: stale節點資料。這個查詢選項要求ES版本在1.7.0以上。關於查詢選項詳細資料參考: 

四、總結

    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,也是有可能影響到寫入的。

      所以,你只能開啟一個副本——寫入副本數要求是從二個副本開始才有。