Elasticsearch 存儲一條數據, put 過程是什么樣子的?
前言
在前面已經介紹了 ES 中常用的一些名詞,知道了數據是存儲在 shard 中的,而 index 會映射一個或者多個 shard 。那這時候我要存儲一條數據到某個索引下,這條數據是在哪個 index 下的呢? "
1.ES演示
一切按照官方教程使用 三條命令,在本機啟動三個節點組裝成偽集群。
- ~ % > ./elasticsearch
- ~ % > ./elasticsearch -Epath.data=data2 -Epath.logs=log2
- ~ % > ./elasticsearch -Epath.data=data3 -Epath.logs=log3
創建一個索引
- curl -X PUT "localhost:9200/my-index-000001?pretty" -H 'Content-Type: application/json' -d'
- {
- "settings": {
- "index": {
- "number_of_shards": 3,
- "number_of_replicas": 2
- }
- }
- }
- '
當前版本 7.9
ES 默認 number_of_shards 為 1
默認 number_of_replicas 為 1,即一個分片只有一個副本
下面命令可以查看索引信息:
- curl -X GET "localhost:9200/_cat/indices/my-index-000001?v&s=index&pretty"
存放數據
- curl -X PUT "localhost:9200/my-index-000001/_doc/0825?pretty" -H 'Content-Type: application/json' -d'
- {
- "name": "liuzhihang"
- }
- '
查詢數據
- curl -X GET "localhost:9200/my-index-000001/_doc/0825?pretty"
2.一條數據該存放在哪個 shard ?
通過命令可以看出:在存放數據時并沒有指定到哪個 shard,那數據是存在哪里的呢?
當一條數據進來,會默認會根據 id 做路由:
- shard = hash(routing) % number_of_primary_shards
從而確定存放在哪個 shard。routing 默認是 _id, 也可以設置其他。
這個 id 可以自己指定也可以系統給生成, 如果不指定則會系統自動生成。
3.put 一條數據的過程是什么樣的?
寫入過程主要分為三個階段
1.協調階段:Client 客戶端選擇一個 node 發送 put 請求,此時當前節點就是協調節點(coordinating node)。協調節點根據 document 的 id 進行路由,將請求轉發給對應的 node。這個 node 上的是 primary shard 。
2.主要階段:對應的 primary shard 處理請求,寫入數據 ,然后將數據同步到 replica shard。
- primary shard 會驗證傳入的數據結構
- 本地執行相關操作
- 將操作轉發給 replica shard
3.當數據寫入 primary shard 和 replica shard 成功后,路由節點返回響應給 Client。
4.副本階段:每個 replica shard 在轉發后,會進行本地操作。
在寫操作時,默認情況下,只需要 primary shard 處于活躍狀態即可進行操作。
在索引設置時可以設置這個屬性
index.write.wait_for_active_shards
默認是 1,即 primary shard 寫入成功即可返回。
如果設置為 all 則相當于 number_of_replicas+1 就是 primary shard 數量 + replica shard 數量。就是需要等待 primary shard 和 replica shard 都寫入成功才算成功。
可以通過索引設置動態覆蓋此默認設置。
4.總結
如何看一條數據在哪個 shard 上呢?
curl -X GET "localhost:9200/my-index-000001/_search_shards?routing=0825&pretty"
通過上面命令可以查到數據 0825 的所在 shard。
相關資料
[1] ES 創建索引:
https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-create-index.html
[2] ES 查詢數據:
https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-get.html
[2] ES 檢索 shard:
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-shards.html
本文轉載自微信公眾號「劉志航」,可以通過以下二維碼關注。轉載本文請聯系劉志航公眾號。