--- tags: Other --- # Elasticsearch Cluster [TOC] ## [A cluster with one empty node](https://www.elastic.co/guide/en/elasticsearch/guide/current/_an_empty_cluster.html) ![](https://i.imgur.com/6YXla0f.png) * cluster = 一群擁有相同的 `cluster.name` 的 node。 * 人人都有機會成為 master node。 * 每個 node 都知道所有 data 在哪,我們可以發送 request 到任意一個 node。 ## [Add an Index](https://www.elastic.co/guide/en/elasticsearch/guide/current/_add_an_index.html) * shard = index 的一部分 data,是一個完整的搜尋引擎。 * shard 分為:**primary shard**、**replica shard**。 * 每一個 document 都歸屬在一個 primary shard 內,所以 primary shard 越多,能儲存的 data 越多。 * replica shard 是 primary shard 的 copy,保護 data 不會丟失,也提供 search 或 retrival document 的服務。 * 當在建立 index 時,就要 改確立 primary shard 的數量,replica shard 可以隨時修改。 > Default > |version|primary|replica| > |-------|-------|-------| > |[5.4](https://www.elastic.co/guide/en/elasticsearch/reference/5.4/indices-create-index.html#create-index-settings)|5|1| > |[7.3](https://www.elastic.co/guide/en/elasticsearch/reference/7.3/indices-create-index.html#create-index-settings)|1|1| > 我還沒搞懂:[Why default number_of_shards is 1 in future release](https://discuss.elastic.co/t/why-default-number-of-shards-is-1-in-future-release/155814) over-sharding? > 分配 document 在哪個 shard 是透過以下公式: > ```python > shard = hash(routing) % number_of_primary_shards > ``` > 因此若是修改 `number_of_primary_shards` 會搜尋不到 document。 > > [name=[Routing a Document to a Shard](https://www.elastic.co/guide/en/elasticsearch/guide/current/routing-value.html)] ## [Cluster Health](https://www.elastic.co/guide/en/elasticsearch/guide/current/cluster-health.html) ``` GET /_cluster/health ``` * status 包含三種顏色狀態: * `green`:primary shards 正常和 replica shards 都正常 * `yellow`:所有 primary shards,但有些 replica shards 非正常。 * `red`:有些 primary shards 非正常。 ## [Scale Horizontally](https://www.elastic.co/guide/en/elasticsearch/guide/current/_scale_horizontally.html) ![](https://i.imgur.com/eIlLy8T.png) ![](https://i.imgur.com/Vxvayry.png) * node 變多,hardware resources (CPU, RAM, I/O) 就會被越少的 shard 共用,提升效能。 * replica 越多,越能不丟失任何資料,也能處理更多的 search 或 retrieval,但不能提高效能。 ## [Coping with Failure](https://www.elastic.co/guide/en/elasticsearch/guide/current/_coping_with_failure.html) ![](https://i.imgur.com/LdwMiKf.png) * NODE1 掛掉後,會經過 master election 選出新的 master node。 * 因為 P1 和 P2 不見 status 會先變成 `red` 。 * replica 會升級成 primary,status 回到 `yellow` (仍有缺少 replica)。 * 當 node 都恢復正常時,才會回到 `green` 。 ## [Creating, indexing, or deleting a single document](https://www.elastic.co/guide/en/elasticsearch/guide/current/distrib-write.html) ![](https://i.imgur.com/Ni6rsV7.png) 1. 發送 create、index、delete request 到 NODE1。 2. 透過 document `_id` 找到他屬於 shard 0,並且在 NODE3。 3. 在 NODE3 處理 request,成功後會轉發 request 到 replica,replica 都報告成功後,NODE3 就會告訴 NODE1 成功,NODE1 在跟 client 回報成功。 4. 當在 write operation 時,要有超過 quorum 的 shard 才會執行,避免 network partition 而導致資料不一致。 ```python quorum = int( (primary + number_of_replicas) / 2 ) + 1 ``` ## Master Election 1. `clusterStateVersion` 高 2. `id` 小 3. 票數大於 `discovery.zen.minimum_master_nodes` ,就會當選成為 master