ES使用心得

客戶端

Transport Client已經快要廢棄了,官方推薦使用High Level REST Client。

常用命令

啟停

systemctl start elasticsearch
systemctl stop elasticsearch

節點狀態

curl http://myservice1:9200/_cat/nodes?vip           heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
xx.xx.xx.205           15          96   2    0.10    0.08     0.08 mdi       -      xx.xx.xx.205
xx.xx.xx.250           18          98  14    0.66    0.35     0.31 di        -      xx.xx.xx.250
xx.xx.xx.7             25          99   2    0.21    0.11     0.06 mdi       -      xx.xx.xx.7
xx.xx.xx.30            30          93  13    1.15    0.60     0.42 di        -      xx.xx.xx.30
xx.xx.xx.249           64          94   3    0.09    0.06     0.10 di        -      xx.xx.xx.249
xx.xx.xx.12            75          99   2    0.20    0.08     0.06 mdi       *      xx.xx.xx.12
xx.xx.xx.2             70          96   1    0.14    0.09     0.07 di        -      xx.xx.xx.2
xx.xx.xx.36            27          99  13    0.83    0.45     0.36 di        -      xx.xx.xx.36

注意node.role和master兩列,前者表示節點角色,有:mdi(master+data+ingest)和di(data+ingest)。

master列為星號的表示主節點。比如這里xx.xx.xx.12就是主節點。

集群健康狀態

curl http://myservice1:9200/_cat/health?vepoch      timestamp cluster       status node.total node.data shards  pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1651459176 02:39:36  elasticsearch green           8         8   3796 1898    0    0        0             0                  -                100.0%

各列含義:

cluster ,集群名稱
status,集群狀態 green代表健康;yellow代表分配了所有主分片,但至少缺少一個副本,此時集群數據仍舊完整;red代表部分主分片不可用,可能已經丟失數據。
node.total,代表在線的節點總數量
node.data,代表在線的數據節點的數量
shards, active_shards 存活的分片數量
pri,active_primary_shards 存活的主分片數量 正常情況下(replica=1), shards的數量是pri的兩倍。
relo, relocating_shards 遷移中的分片數量,正常情況為 0
init, initializing_shards 初始化中的分片數量 正常情況為 0
unassign, unassigned_shards 未分配的分片 正常情況為 0
pending_tasks,準備中的任務,任務指遷移分片等 正常情況為 0
max_task_wait_time,任務最長等待時間
active_shards_percent,正常分片百分比 正常情況為 100%

列出所有索引

curl http://myservice1:9200/_cat/indices?v

修改索引副本數

PUT test/_settings
{"index": {"number_of_replicas" : 1}
}

文檔增刪改查

指定ID創建一個索引,并往其中加入文檔,文檔格式為json
curl -XPUT -H "Content-Type: application/json" 'myservice1:9200/customer/external/1?pretty' -d '
{
"name": "yibei"
}'不指定ID的加入一個文檔
curl -XPOST -H "Content-Type: application/json" 'myservice1:9200/customer/external?pretty' -d '
{
"name": "xx3"
}'修改文檔內容
curl -XPOST -H "Content-Type: application/json" 'myservice1:9200/customer/external/1/_update?pretty' -d'
{
"doc":{"name": "lixiao","age":45}
}'從索引里根據ID取得某個文檔
curl -XGET 'myservice1:9200/customer/external/1?pretty'搜索所有文檔
curl -XPOST -H "Content-Type: application/json" 'myservice1:9200/customer/_search?pretty' -d '
{
"query": { "match_all": {} },
"from": 0,
"size":20
}'刪除索引
curl -XDELETE 'myservice1:9200/customer?pretty'查看恢復進程
curl -XGET 'myservice1:9200/_recovery'

文檔update or insert

參考這里:

使用doc_as_upsert:

curl -XPOST -H "Content-Type: application/json" 'myservice1:9200/customer/external/1/_update' -d '{"doc" : {"name" : "yibei1"},"doc_as_upsert" : true
}'

進階

shard/replica和ES節點

參看該文說明

節點down掉對集群影響的實驗

總共8個節點,分別看一下同時down掉1/2/3個節點對集群狀態和讀寫的影響。

8個節點的總分片和主分片數是:3796 1898

同時1個節點down掉,查看集群健康狀態:

epoch      timestamp cluster       status node.total node.data shards  pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1651460709 03:05:09  elasticsearch yellow          7         7   3322 1898    0    0      474             0                  -                 87.5%

集群狀態變為黃色,主分片未受影響,備份分片減少,未分配分片數為474,active_shards_percent從100%降為87.5%。

讀操作未受影響,寫操作略有點慢,但還是能寫入。

另外,我們注意到一點,這種情況相當于節點退出,ES會自動做shard relocation,因此shards和active_shards_percent會緩慢恢復。同時由于主分片未受損,大概20min左右,集群就會重新恢復到green狀態。

同時2個節點down掉,查看集群健康狀態:

epoch      timestamp cluster       status node.total node.data shards  pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1651468939 05:22:19  elasticsearch red             6         6   3405 1861    2    0      381             0                  -                 89.9%

集群狀態變為紅色,主分片有損失,active_shards_percent降到89.9%,這個值看來跟down掉的節點數并無線性關系

讀操作未受影響,寫操作時如果正在做shard relocation,略有點慢,但還是能寫入的。

shards和active_shards_percent會緩慢恢復,但恢復不到100%的狀態,因為主分片已受損了,補償不回來的。過了一段時間,集群狀態最后也始終停留在red,此時active_shards_percent停留在98.3%,unassign有64個分片無法恢復,恰好就是損失的主分片數的2倍!

最后,我們將2個節點恢復,集群經過30s的shard relocation,即可恢復green狀態,active_shards_percent也為100%.

同時3個節點down掉,查看集群健康狀態:

epoch      timestamp cluster       status node.total node.data shards  pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1651462580 03:36:20  elasticsearch red             5         5   2641 1826    0    0     1155             0                  -                 69.6%

集群狀態變為紅色,主分片已受損,備份分片更是減少的厲害,active_shards_percent降到了69.6%。

讀操作未受影響,寫操作有時慢,有時還會超時,報錯:

{"error" : {"root_cause" : [{"type" : "unavailable_shards_exception","reason" : "[customer][4] primary shard is not active Timeout: [1m], request: [BulkShardRequest [[customer][4]] containing [index {[customer][external][G3sTg4ABDFINJI3kc3ug], source[\n{\n\"name\": \"liping2\"\n}]}]]"}],"type" : "unavailable_shards_exception","reason" : "[customer][4] primary shard is not active Timeout: [1m], request: [BulkShardRequest [[customer][4]] containing [index {[customer][external][G3sTg4ABDFINJI3kc3ug], source[\n{\n\"name\": \"liping2\"\n}]}]]"},"status" : 503
}

可能剛好寫到受損的主分片上了。再試一次,又成功了,應該是選了一個健康的主分片來寫。

三個節點down掉后,ES依然會自動做shard relocation,因此shards和active_shards_percent會緩慢恢復,但恢復不到100%的狀態,因為主分片已受損了,補償不回來的。過了40min,集群狀態最后也始終停留在red,此時active_shards_percent停留在96.2%,unassign有144個分片無法恢復,恰好就是損失的主分片數的2倍!

最后,我們將3個節點恢復,集群經過1~2min的shard relocation,即可恢復green狀態,active_shards_percent也為100%。

結論

  1. 節點退出后的shard relocation動作會比較慢,在relocation階段如果有業務查詢或修改也會比較慢;
  2. 節點加入后的shard relocation動作很快,基本上1~2min就可以恢復正常;
  3. replica=1時,僅僅down掉2個節點,就會導致集群的主分片受損,永遠陷入red狀態,并可能導致寫入超時(寫到受損主分片時);
  4. 分片可以認為是一塊為index預分配的空間,只在index新建或刪除時會變化,而在insert doc時并不會變;分片數在索引創建時確定,后續不能修改,除非用reindex重建索引。

為何分片數在索引創建后就不能修改

Reason that you can't change the primary shards are due to the fact, it will change the way data is split between primary shards and changing them will cause consistent hashing to break, which is very popular technique to horizontally scale and splitting the data technique.Replicas shards are just copy so you can increase and decrease as it doesn't make any impact on consistent hashing.If you want to change the primary shards, you have to create a new index and use alias API and Reindex API for efficiently doing it

replica與數據節點數的關系

ES有個選項,叫auto_expand_replicas,會自動根據data node數擴展replica,默認是關閉的。根據這個選項我們可以猜測,replica與data node數之間應該是有關系的,不能說數據節點在擴充,而replica始終不變,理論上replica也要隨之遞增。

那么,兩者間有沒有一個推薦的關系公式呢?

google了一下,有如下結論:

Another factor to consider with replicas is the number of nodes available. Replicas are always placed on different nodes from the primary shard, since two copies of the same data on the same node would add no protection if the node were to fail. As a result, for a system to support n replicas, there need to be at least n + 1 nodes in the cluster. For instance, if there are two nodes in a system and an index is configured with six replicas, only one replica will be allocated. On the other hand, a system with seven nodes is perfectly capable of handling one primary shard and six replicas.

考慮replica=1的情況,這時如果只down一個節點A,A上的主shard必定在其他完好的節點上有備shard(主備shard不能在同一個節點),所以即使A down掉了,也不會導致主shard受損,因為其他節點上的備shard會接替成為新的主shard。

這是我們上面做的第一個實驗的情況。

如果down了兩個節點,情況就不同了,很可能這倆節點上的主shard在其他完好節點上就沒有備shard,于是就有可能主shard受損。這是我們上面第二個實驗的情況,我們會看到,最后有1.7%的主分片受損。但,如果此時我們將replic調高到2,則這倆故障節點上的主shard在其他完好節點上必定會有備shard,這樣即使2個節點都down掉,也不會有主分片受損。

以此類推,down了三個節點時,如果replica=3,則必定在其他完好節點上有備shard,數據不會受損。

因此,若想數據完全不受損,必須滿足:

replica數=可能down掉的最大數據節點數

但replica不是沒有代價的,它就像數據庫的索引,會額外占用內存、磁盤空間,在提高查詢效率的同時,也會降低增刪doc的效率。

所以,這里頭是有一個折中的。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/37159.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/37159.shtml
英文地址,請注明出處:http://en.pswp.cn/news/37159.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

解壓版 MySQL 數據庫的安裝與配置

目錄 1 下載2 安裝3 配置3.1 添加環境變量3.2 新建配置文件3.3 初始化MySQL3.4 注冊MySQL服務3.5 啟動MySQL服務3.6 修改默認賬戶密碼 4 登錄5 卸載 安裝環境:Win10 64位 軟件版本:MySQL 5.7.24 解壓版 1 下載 點擊鏈接 進入如下界面 ??注意: 我們一般不會選擇最新…

防火墻筆記

什么是防火墻 在計算機網絡中是指設置在可信任的內部網絡和不可信任的外部網絡之間的屏障,通過強化邊界控制保障內容安全,同時不妨礙內部對外部的訪問。 20世紀80年代,最早的防火墻幾乎與路由器同時出現,第一代防火墻主要基于包過…

RocketMQ 5.1.0 源碼詳解 | Producer 發送流程

文章目錄 初始化DefaultMQProducer實例發送流程DefaultMQProducer#sendDefaultMQProducerImpl#sendMQClientInstance#updateTopicRouteInfoFromNameServer使用特定 topic 獲取路由信息使用默認 topic 獲取路由信息 DefaultMQProducerImpl#sendDefaultImpl發送流程總結 初始化De…

記一次練習(內容待完善)

記錄最近一次爬蟲和數據可視化練習 0、數據獲取 import pandas as pdyear [2018,2019,2020,2021,2022] header {"User-Agent":"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Mobile S…

31 | 獨角獸企業數據分析

獨角獸企業:是投資行業尤其是風險投資業的術語,一般指成立時間不超過10年、估值超過10億美元的未上市創業公司。 項目目的: 1.通過對獨角獸企業進行全面地分析(地域,投資方,年份,行業等),便于做商業上的戰略決策 項目數據源介紹 1.數據源:本項目采用的數據源是近…

2023年大廠前端面試題匯總

一、58同城前端面試題27道 1. css盒模型 2. css畫三角形 3. 盒子水平垂直居中(所有方式) 4. 重繪、重排 重繪就是重新繪制(repaint):是在一個元素的外觀被改變所觸發的瀏覽器行為,瀏覽器會根據元素的新屬性…

文檔控件DevExpress Office File API v23.1新版亮點 - 支持.NET MAUI

DevExpress Office File API是一個專為C#, VB.NET 和 ASP.NET等開發人員提供的非可視化.NET庫。有了這個庫,不用安裝Microsoft Office,就可以完全自動處理Excel、Word等文檔。開發人員使用一個非常易于操作的API就可以生成XLS, XLSx, DOC, DOCx, RTF, CS…

Spring Security自定義登陸界面和密碼驗證邏輯

maven依賴 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId> </dependency> 創建配置文件處理跳轉攔截等功能以及密碼比對功能 package com.example.demo2.demos.web1;…

Shell 變量

Shell 變量 定義變量時&#xff0c;變量名不加美元符號&#xff08;$&#xff0c;PHP語言中變量需要&#xff09;&#xff0c;如&#xff1a; your_name"runoob.com" 注意&#xff0c;變量名和等號之間不能有空格&#xff0c;這可能和你熟悉的所有編程語言都不一樣…

python如何實現1ms內觸發兩個接口請求

在Python中&#xff0c;可以通過多線程或者協程來實現1ms內觸發兩個接口請求。以下是兩種方法的示例代碼&#xff1a; 1.多線程實現&#xff1a; import threading import requestsdef send_request(url):response requests.get(url)print(response.text)# 創建兩個線程&…

nginx一般輪詢、加權輪詢、ip_hash等負載均衡模式配置介紹

一.負載均衡含義簡介 二.nginx負載均衡配置方式 準備三臺設備&#xff1a; 2.190均衡服務器&#xff0c;2.191web服務器1&#xff0c;2.160web服務器2&#xff0c;三臺設備均安裝nginx&#xff0c;兩臺web服務器均有網頁內容 1.一般輪詢負載均衡 &#xff08;1&#xff09…

ARTS 挑戰打卡的第9天 --- 如何知道一個數是否為2的若干次冪(Algorithm)

前言 &#xff08;1&#xff09;今天看到一個有意思的問題&#xff0c;如何判斷一個數字是否為2的若干次冪。這個問題并不難&#xff0c;但是對于我們的C語言功底還是有一點點的考驗的。 &#xff08;2&#xff09;希望各位可以先自行思考&#xff0c;實在想不出來再看后面的講…

【es6】具名組匹配

1、組匹配 正則表達式使用圓括號進行組匹配&#xff0c;如&#xff1a;const RE_DATE /(\d{4})-(\d{2})-(\d{2})/;,三個圓括號形成了三個組匹配。 代碼&#xff1a; const RE_DATE /(\d{4})-(\d{2})-(\d{2})/;const matchObj RE_DATE.exec(1999-12-31); const year matchO…

rabbitmq的消息應答

消費者完成一個任務可能需要一段時間&#xff0c;如果其中一個消費者處理一個長的任務并僅只完成 了部分突然它掛掉了&#xff0c;會發生什么情況。RabbitMQ 一旦向消費者傳遞了一條消息&#xff0c;便立即將該消 息標記為刪除。在這種情況下&#xff0c;突然有個消費者掛掉了…

數據分析兩件套ClickHouse+Metabase(一)

ClickHouse篇 安裝ClickHouse ClickHouse有中文文檔, 安裝簡單 -> 文檔 官方提供了四種包的安裝方式, deb/rpm/tgz/docker, 自行選擇適合自己操作系統的安裝方式 這里我們選deb的方式, 其他方式看文檔 sudo apt-get install -y apt-transport-https ca-certificates dirm…

魔改 axuanup 的 aardio和python 猜拳游戲 代碼

根據 axuanup 的 aardio和python 猜拳游戲 代碼&#xff0c;魔改了一個風格不一樣的代碼。 爭取做到代碼盡量“簡”&#xff0c;但還沒到“變態簡”的程度&#xff0c;因為還能看懂。 原文&#xff1a;aardio和python 猜拳游戲-自由交流樂園-Aardio資源網 代碼如下&#xff…

【Flutter】【基礎】CustomPaint 繪畫功能(一)

功能&#xff1a;CustomPaint 相當于在一個畫布上面畫畫&#xff0c;可以自己繪制不同的顏色形狀等 在各種widget 或者是插件不能滿足到需求的時候&#xff0c;可以自己定義一些形狀 使用實例和代碼&#xff1a; CustomPaint&#xff1a; 能使你繪制的東西顯示在你的ui 上面&a…

競賽項目 酒店評價的情感傾向分析

前言 &#x1f525; 優質競賽項目系列&#xff0c;今天要分享的是 酒店評價的情感傾向分析 該項目較為新穎&#xff0c;適合作為競賽課題方向&#xff0c;學長非常推薦&#xff01; &#x1f9ff; 更多資料, 項目分享&#xff1a; https://gitee.com/dancheng-senior/post…

解決QTabelView無法立即刷新問題

解決QTabelView無法理解刷新問題 在某些時候&#xff0c;Qt的奇葩現象&#xff0c;調試中QTabelView的相關model數據變更了&#xff0c;界面卻沒立即刷新&#xff0c;然而&#xff0c;點擊標題欄等才刷新&#xff0c;奇葩。很多網上資料說QTabelView::update()和QTabelView::r…