ElasticSearch第2篇(1.4萬字記錄ElasticSearch叢集部署、節點、分片、副本、路由、的概念與增刪改查操作、客戶端呼叫、設定指標、叢集讀寫流程、故障轉移)

小松聊PHP进阶發表於2024-07-26

前置銜接文章:ElasticSearch第1講(4萬字詳解 Linux下安裝、原生呼叫、API呼叫超全總結、Painless、IK分詞器、4種和資料庫同步方案、高併發下一致性解決方案、Kibana、 ELK)

ElasticSearch叢集

  • 極簡概括:多個ES節點組成的一個系統。
  • 解決問題:
    • 防止單點故障。
    • 算力和容量負載均衡,用更多的節點來擴充套件叢集的容量和效能。
  • 適用場景:涉及大資料檢索的系統,無固定場景,有需求就用。
  • 優點:
    • 防止單點故障,當叢集內一個節點掛掉後,不影響叢集使用,若master節點掛掉,ES叢集也會自動選舉master,並持續對外提供服務(主節點恢復後就可能不在是主節點了,類似Redis的哨兵模式)
    • 算力和容量負載均衡,用更多的節點來擴充套件叢集的容量和效能。
    • 高可用性:透過分片(Sharding)和副本(Replication)機制,ES能夠保證資料的高可用性和容錯性。即使某個節點出現故障,資料依然可以從其他副本中恢復。
    • 具有強大的分片與副本分佈演算法,開發人員不用刻意去維護。
  • 缺點:
    • 叢集配置:對於配置叢集,ES預設的配置檔案並未提供充分的預留配置項,使得配置叢集困難。
    • 運維成本:多個節點不可避免的增加運維成本。

ES叢集搭建(version 8.14.1)

  • 搭建目標:192.168.0.183(master & data),192.168.0.183(data),192.168.0.183(data)。
  • 系統配置:
都要做叢集的,推薦修改以下配置,用於Linux系統對es效能最佳化。

vim  /etc/security/limits.conf
文末新增兩行配置,最佳化檔案描述符軟硬限制,對提高效能非常重要,檔案描述符用於標識和管理每個程序都可以開啟檔案的數量
es soft nofile 65536
es hard nofile 65536

vim /etc/security/limits.d/20-nproc.conf
文末新增兩行配置,最佳化檔案描述符軟硬限制,對提高效能非常重要,檔案描述符用於標識和管理每個程序都可以開啟檔案的數量
es soft nofile 65536
es hard nofile 65536

vim /etc/sysctl.conf
定義系統中可以同時開啟的最大檔案描述符數量。
fs.file-max=655350
定義Linux核心中程序可以擁有的最大記憶體對映區域數量
vm.max_map_count=262144

重啟
sysctl -p
  • 節點1配置
注意配置格式,key: value之間要留出空格,否則ES不識別對應的值。
透過上一章,已經安裝好了ES,並能跑起來。可在這個基礎上配置ES叢集
vim ES根目錄/config/elasticsearch.yml
找到---------------------------------- Cluster -----------------------------------段,修改以下內容
叢集名稱,一個叢集下的節點,需要保持一致
cluster.name: zs_es_cluster
找到------------------------------------ Node ------------------------------------段,修改以下內容
節點名稱,每個節點名稱必須不一樣
node.name: node_01
設定節點的角色,推薦只設定一個主節點
node.roles: [master, data]
找到---------------------------------- Network -----------------------------------段,修改以下內容
配置IP
network.host: 192.168.0.183
並新增一行埠
transport.tcp.port: 9300
將游標指標移至文末,新增跨域配置
http.cors.enabled: true
http.cors.allow-origin: "*"
http.max_content_length: 200MB

3行指令用於配置相關節點,以供服務發現
discovery.seed_hosts: ["1節點IP:主節點叢集埠",2節點IP:主節點叢集埠,3節點IP:主節點叢集埠]

這個設定啟用TCP連線的keep-alive機制。啟用keep-alive後,Elasticsearch會定期向連線的另一端傳送探測包,以檢查連線是否仍然有效。這有助於保持長時間未活動的連線處於活動狀態,從而防止連線由於超時被意外關閉。
network.tcp.keep_alive: true
這個選項禁用Nagle演算法。Nagle演算法用於減少網路上的小資料包的數量,但在實時系統中,它可能導致延遲。將network.tcp.no_delay設定為true可以確保資料包儘快傳送,而不經過Nagle演算法的延遲處理,有助於提高網路通訊的實時性。
network.tcp.no_delay: true

在----------------------- BEGIN SECURITY AUTO CONFIGURATION -----------------------段,
若設定了
xpack.security.enabled: true
請開啟
xpack.security.transport.ssl:
  enabled: true
否則報錯bootstrap checks failed. You must address the points described in the following [1] lines before starting Elasticsearch

Esc wq儲存並退出。

chown -R es:es ES根目錄

隨後啟動或重啟ES,注意防火牆要開啟指定的埠。
期間可用ps aux命令檢視ES是否跑得起來。

透過curl訪問ES,可直接檢視對應的ES配置情況。
curl IP:9200/_cluster/health
結果:
{
    "cluster_name": "zs_es_cluster",
    "status": "green",
    "timed_out": false,
    "number_of_nodes": 3,
    "number_of_data_nodes": 3,
    "active_primary_shards": 7,
    "active_shards": 14,
    "relocating_shards": 0,
    "initializing_shards": 0,
    "unassigned_shards": 0,
    "delayed_unassigned_shards": 0,
    "number_of_pending_tasks": 0,
    "number_of_in_flight_fetch": 0,
    "task_max_waiting_in_queue_millis": 0,
    "active_shards_percent_as_number": 100.0
}
1. cluster_name
含義:叢集名稱。
示例值:"zs_es_cluster"
用途:用於標識叢集的名稱,方便在管理和監控時識別。
2. status
含義:叢集狀態。
示例值:"green"
用途:指示叢集的健康狀態:
green:所有主分片和副本分片都正常。
yellow:所有主分片正常,但有副本分片未分配。
red:有主分片未分配。
3. timed_out
含義:查詢是否超時。
示例值:false
用途:指示查詢請求是否因超時而失敗。
4. number_of_nodes
含義:叢集中的節點總數。
示例值:3
用途:顯示叢集中的總節點數。
5. number_of_data_nodes
含義:叢集中的資料節點總數。
示例值:3
用途:顯示處理資料儲存和搜尋的節點數。
6. active_primary_shards
含義:活躍的主分片數量。
示例值:7
用途:顯示當前活躍的主分片總數。
7. active_shards
含義:活躍的分片總數(包括主分片和副本分片)。
示例值:14
用途:顯示叢集中活躍的所有分片的總數。
8. relocating_shards
含義:正在遷移的分片數量。
示例值:0
用途:顯示當前正在遷移的分片數。遷移通常發生在節點故障或叢集擴充套件時。
9. initializing_shards
含義:正在初始化的分片數量。
示例值:0
用途:顯示正在初始化的分片數。初始化分片通常是在剛剛建立索引時發生的。
10. unassigned_shards
含義:未分配的分片數量。
示例值:0
用途:顯示未分配的分片數。這通常表示在叢集啟動或索引建立時需要分配的分片。
11. delayed_unassigned_shards
含義:延遲未分配的分片數量。
示例值:0
用途:顯示因延遲而未分配的分片數量。
12. number_of_pending_tasks
含義:待處理任務的數量。
示例值:0
用途:顯示當前待處理的叢集管理任務數量,例如分片分配或設定更改。
13. number_of_in_flight_fetch
含義:當前進行中的獲取請求數量。
示例值:0
用途:顯示當前正在進行的搜尋請求數量。
14. task_max_waiting_in_queue_millis
含義:任務在佇列中等待的最大時間(毫秒)。
示例值:0
用途:顯示任務在佇列中等待的最長時間。值為 0 表示沒有任務等待。
15. active_shards_percent_as_number
含義:活躍分片的百分比。
示例值:100.0
用途:顯示當前活躍的分片佔總分片數的百分比。值為 100.0 表示所有分片都在正常工作中。


或者使用如下方式檢視
curl IP:9200/_cat/nodes?v
結果:
ip            heap.percent ram.percent cpu load_1m load_5m load_15m node.role   master name
192.168.0.184           30          94   0    0.16    0.11     0.22 cdfhilmrstw -      node_02
192.168.0.183           50          94   0    0.29    0.33     0.30 cdfhilmrstw *      node_01
192.168.0.185           63          93   0    0.79    7.42     5.21 cdfhilmrstw -      node_03

1. heap.percent
含義:JVM 堆記憶體的使用百分比。
用途:顯示當前 JVM 堆記憶體的使用情況。高使用率可能表示需要增加記憶體或最佳化查詢/索引操作。
2. ram.percent
含義:系統記憶體的使用百分比。
用途:顯示節點系統記憶體的使用情況。用於監控記憶體壓力,確保系統有足夠的可用記憶體以避免效能問題。
3. cpu
含義:節點的 CPU 使用情況。
用途:顯示節點的 CPU 使用情況。高 CPU 使用率可能表示節點在處理大量請求或需要最佳化配置。
4. load_1m
含義:過去 1 分鐘的系統負載。
用途:顯示系統的負載情況。負載值超過 CPU 核心數量可能表示系統負載較高,可能需要進一步調查。
5. load_5m
含義:過去 5 分鐘的系統負載。
用途:顯示系統的負載趨勢。可以幫助識別長期的負載變化情況。
6. load_15m
含義:過去 15 分鐘的系統負載。
用途:顯示系統負載的長期趨勢。可以用於分析系統負載的穩定性和變化趨勢。
7. node.role
含義:節點角色。
用途:顯示節點在叢集中的角色,例如主節點(m)、資料節點(d)、協調節點(c)等。這幫助理解節點的功能和在叢集中的作用。
8. master
含義:是否為主節點。
用途:顯示節點是否是當前的主節點。主節點負責叢集的管理和協調任務。
9. name
含義:節點名稱。

  • 節點2、3配置基本同上,IP和節點名稱需更改,並清空ES根目錄/data,否則親測節點無法發現,記得密碼配置的要一致,客戶端呼叫要輸入使用者名稱密碼的,不一致會報錯。

ES Head外掛

  • 原始碼地址:https://github.com/mobz/elasticsearch-head/releases
  • 極簡概括:檢視ES叢集健康狀況的瀏覽器外掛。
  • 缺點:不能設定Basic Auth請求頭,或者說配置ES密碼,導致訪問節點401。
  • 使用:
原本是想透過Chrome載入該檔案成為外掛,但是報錯,那就透過網頁的形式使用。
cd 外掛目錄
npm i

然後手動開啟外掛目錄下的index.html

節點角色(主節點、資料節點)

  • 官方文件:https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-node.html
  • 極簡概括節點:就是每個伺服器上的ES例項,在叢集環境下的稱呼。
  • 極簡概括節點角色:叢集環境下每個ES例項的工作側重點,是透過角色控制的。
  • 分類:master、data、data_content、data_hot、data_warm、data_cold、data_frozen、ingest
    、ml、remote_cluster_client、transform。這麼多種類,目前能夠用到的,就只有master、data節點。
  • 主節點:就是master節點,用於控制叢集。
  • 主節點作用:
    • 叢集管理:主節點負責叢集狀態的管理和維護,包括節點的加入和退出、索引的建立和刪除等。
    • 後設資料管理:主節點管理叢集的後設資料,包括索引和對映的資訊。
    • 協調操作:主節點協調分片的分配和再分配,確保資料的平衡和容錯性。
    • 處理叢集狀態更新:主節點負責更新叢集狀態,並將這些更新廣播到所有資料節點。
若要把節點,配置為主節點,需要再elasticsearch.yml中配置
node.roles: [master]
  • 資料節點:具有多個資料角色之一的節點。資料節點儲存資料並執行與資料相關的操作,如CRUD、搜尋和聚合。具有泛型的節點data角色可以擔任任何專門的資料節點角色。
node.roles: [master, data]

分片

  • 極簡概括:是將索引拆分成多個小的獨立部分的過程。
  • 類比MySQL:分表。
  • 解決問題:
    • 容量問題:幾十億的索引,單個節點裝不下,就需要拆分。
    • 效能提升:將資料分佈到多個分片上,多個節點可以並行處理查詢請求,從而提高查詢效能。
    • 副本備份:防止單點故障引發的資料丟失問題。
  • 適用場景:大資料下因儲存問題(解決儲存的問題),和高併發下因算力問題(解決效能的問題)。
  • 優點:如上。
  • 缺點:
    • 不可避免的增加運維成本。
    • 資料傾斜:因演算法,或者資料本身的特點,讓分片之間分佈不均,從而造成負載不均衡。這種不均衡可能會影響整體效能和資源利用效率。
    • 主分片:拆分後的分片資料,並非主節點的分配資料。注意分片數量,建立索引時就已經確定,預設是1個,之後也無法更改。

副本(或叫副本分片)

  • 極簡概括:分片的備份,分片的冗餘。
  • 對比分片:不是一個東西,分片是將源資料拆分成小部分,副本分片的備份。
  • 分佈模式:當有兩臺及以上數量的例項時,分片和對應的副本會放置在不同的伺服器上,用來避免單節點故障引起的資料丟失。

節點擴容帶來的問題

  • 為什麼要擴容:因儲存不足或者算力不足的情況下,想透過擴容節點來解決。
  • 問題:由於分片數量在建立索引時就已經確定(預設是1個,可手動更改),之後也無法更改。這會導致擴容會受節點數量牽制。
  • 解決:分片數量無法熱增加,但是副本分片卻可以熱增加(增大索引的number_of_replicas引數)。因為副本即分片,所以ES訪問分片或副本可以。將副本分佈在更多的節點上,吞吐量,就上來了。
  • 換個說法:在增加節點的期間,增加副本數量,讓更多的副本,均攤在更多的節點上,從而增加算力並減輕儲存壓力。
  • 注意:過多的副本,在ES寫入資料時需要更長時間的同步,這會消耗一定的資源。

節點、分片、副本的計算、分佈與演進

  • 背景:我把他拿出來講,是因為容易混淆。建立索引時,若設定number_of_shards為3,number_of_replicas為1。
  • 則表示:
    • number_of_shards為3:表示這個索引設定3個分片。起個名:也就是分片1,分片2,分片3。
    • number_of_replicas為1:定義每個主分片有1個副本。3個分片,就會有3個副本,起個名:也就是副本1,副本2,副本3。
  • 當節點數量為1時,則表示:
    • 分片數量:3。
    • 副本數量:3。
    • 分片分佈情況:分片1,分片2,分片3全部在這個單一節點上。
    • 副本分佈情況:副本1,副本2,副本3全部在這個單一節點上。若節點掛掉,源資料和備份有丟失風險,因此存在單點故障。
    • 分佈如圖
|--------節點1--------|
| 分片1、分片2、分片3  |
| 副本1、副本2、副本3  |
|---------------------|
  • 演進,當節點數量為2時,則表示:
    • 分片數量:3。
    • 副本數量:3。
    • 分片分佈情況:分片1,分片2,分片3可能全部在這個節點1上,因為這樣變動動用資源較少。
    • 副本分佈情況:副本1,副本2,副本3可能全部在這個節點2上,總之,分片和這個分片對應的副本,不能出現在同一個節點上,謹防單點故障。
    • 分佈如圖
只要節點數量>=2,就不能再同一節點上出現儲存分片n,又儲存副本n的情況。
|--------節點1--------|
| 分片1、分片2、分片3  |
|---------------------|

|--------節點2--------|
| 副本1、副本2、副本3  |
|---------------------|
  • 演進,當節點數量為3時,則表示:
    • 分片數量:3。
    • 副本數量:3。這個3,表示的3個分片各會有1個副本,則產生3份副本。
    • 分片分佈情況:分片1和分片2可能在節點1上,分片3可能在節點3上。
    • 副本分佈情況:副本1和副本3可能在節點2上,副本2可能在節點3上。
    • 分佈如圖:
只要節點數量>=2,就不能再同一節點上出現儲存分片n,又儲存副本n的情況。
|-----節點1----|
| 分片1、分片2  |
|--------------|

|-----節點2----|
| 副本1、副本3  |
|--------------|

|-----節點3----|
| 副本2、 分片3 |
|--------------|
  • 當節點數量大於6時:
    • 3個分片,那麼加上3個分片對應的3份副本,一共就是6份資料,最多使用6個節點,所以節點不能超過6個,否則會產生多餘的節點。
  • 演進:number_of_replicas為2,number_of_shards為3,且節點數量為3,則表示:
    • 分片數量:3。
    • 副本數量:6。
    • 分片分佈情況:可能分片1,分片2在節點1上,分片3在節點3上。
    • 副本分佈情況:可能副本3_1在節點1,副本1、副本2、副本3_1在節點2,副本1_1、副本2_1、分片3在節點3。
    • 分佈如圖
只要節點數量>=2,就不能再同一節點上出現儲存分片n,又儲存副本n的情況。
|----------節點1----------|
| 分片1、分片2、副本3     |
|------------------------|

|----------節點2----------|
| 副本1、副本2、副本3_1    |
|-------------------------|

|----------節點3----------|
| 副本1_1、副本2_1、分片3 |
|------------------------|
  • 節點數量增加後,還可以接著演進……。

路由

  • 極簡概括:指的是如何將文件定位到具體的分片上的策略。
  • 作用:幫忙在讀寫時快速定位具體的分片。
  • 過程:文件的ID經過雜湊計算,並透過固定的分片數量取模,根據得到的值決定用哪個分片。
  • 策略:預設是用輪詢節點的方式進行路由。
  • 分類:
    • 內建路由:ES使用文件ID的雜湊值取模分片數量來計算其儲存的分片位置,並自動定位分片。
    • 自定義路由:使用者提供一個routing引數,這個引數可以是任意的字串值,ES將使用這個值j經過雜湊後取模來進行路由計算。

叢集內資料的讀寫流程

  • 寫流程
    1. 客戶端傳送寫請求:客戶端向ES叢集中的某個節點傳送寫請求,這個節點會作為本次請求的協調節點(Coordinating Node)。
    2. 路由到正確的分片:協調節點使用文件ID的雜湊值來確定文件屬於哪個分片,並透過叢集狀態中的內容路由表資訊獲知該分片的主分片位置。
    3. 主分片寫入:協調節點將寫請求轉發到主分片所在的節點,由主分片執行實際的寫操作。
    4. 主從複製:如果主分片寫入成功,它會將請求並行轉發到所有的副本分片(Replica Shard)所在的節點,等待副本分片寫入成功。這是為了保證資料的冗餘和一致性。
    5. 確認寫入成功:一旦所有副本分片都成功寫入了資料,主分片節點會向協調節點報告成功,隨後協調節點向客戶端返回寫入成功的響應(有例外)。
  • 讀流程
    1. 客戶端傳送讀請求:客戶端向ES叢集中的某個節點傳送讀請求,這個節點同樣會作為本次請求的協調節點。
    2. 確定資料和副本資訊:協調節點使用文件ID的雜湊值來確定文件屬於哪個分片,並透過叢集狀態中的內容路由表資訊獲知該分片的副本資訊。
    3. 轉發請求到副本節點:協調節點可以將讀請求轉發到有副本分片的任意節點進行讀取。在實際操作中,為了負載均衡,協調節點可能會採用輪詢的方式將請求分發到不同的副本節點。
    4. 返回資料給客戶端:處理讀請求的節點將資料返回給協調節點,隨後協調節點將資料返回給客戶端。
  • 協調節點:負責處理叢集內請求並將其分發到合適資料節點的節點。協調節點不直接儲存資料或索引,而是負責處理請求的路由。

故障轉移帶來的影響

  • 補充:這裡的故障轉移,指的是某個節點掛掉後,對叢集本身和呼叫端的影響。
  • 角色:若master掛掉,叢集會從其他可用的節點中選出來一個作為master,若老master恢復,則不在是master角色。
  • 分片與副本分佈:節點掛掉後,意味著節點數量發生了變化,就算再次啟動,分片與副本分佈可能會與原先的不一樣。
  • 呼叫端:只要節點不全部掛掉,訪問速度會變慢,但支援正常訪問。

客戶端呼叫叢集的方案

  • 語言:以PHP為例,叢集呼叫方式,和PHP呼叫單節點ES一致,setHosts()設定多個節點即可。
  • 官方文件:https://www.elastic.co/guide/en/elasticsearch/client/php-api/current/getting-started-php.html#_installation
composer require elasticsearch/elasticsearch

新建PHP檔案,以下程式碼資料為公共部分。
include './vendor/autoload.php';
use Elastic\Elasticsearch\ClientBuilder;
//連線ES主節點
$client = ClientBuilder::create()->setHosts(['192.168.0.183:9200', '192.168.0.184:9200', '192.168.0.185:9200'])
->build();
//若es有密碼,則需要新增一個setBasicAuthentication()方法,各節點密碼須一致。
$client = ClientBuilder::create()->setHosts(['192.168.0.183:9200', '192.168.0.184:9200', '192.168.0.185:9200'])
->setBasicAuthentication('elastic', '123456')->build();

分片與副本設定指標

  • 容量考慮:控制每個分片佔用的硬碟容量,不超過ES最大JVM的堆空間設定(一般設定不超過32G),如果索引的總容量在500G大小,那分片設定16個即可。
  • 節點考慮:避免讓單個節點儲存多個分片,一旦出現了故障(參考上文 “演進,當節點數量為3時”(不知道這句話在那裡直接Ctrl F搜))仍舊有丟失資料的可能,一般的分片數量,不會超過節點數的3倍。
  • 公式:節點數 <= 主分片數 * (副本數 + 1)
  • 補充:由於ES偏向IO密集,而非計算密集型,所以硬體層面,使用固態硬碟和磁碟陣列(RAID0、10、5、6、50、60)用於提升效能。

分片增與查

  • 增:
返回bool
$params = [
    'index' => 'shards_test',
    'body'  => [
        'settings' => [
            'number_of_shards' => 3, //建立3個分片
            'number_of_replicas' => 1 //每個分片有1個副本
        ]
    ]
];

$response = $client->indices()->create($params);
dd($response->asBool());
  • 刪:不支援的操作,可透過建立新的索引去實現。
  • 改:不支援的操作,可透過建立新的索引去實現。
  • 查:
返回array
$params = [
    'index' => 'shards_test',
    'format' => 'json'
];

$response = $client->cat()->shards($params);
dd($response->asArray());

array:6 [
  0 => array:9 [
    "index" => "shards_test"
    "shard" => "0"
    "prirep" => "r"
    "state" => "STARTED"
    "docs" => "0"
    "store" => "227b"
    "dataset" => "227b"
    "ip" => "192.168.0.185"
    "node" => "node_03"
  ]
  1 => array:9 [
    "index" => "shards_test"
    "shard" => "0"
    "prirep" => "p"
    "state" => "STARTED"
    "docs" => "0"
    "store" => "227b"
    "dataset" => "227b"
    "ip" => "192.168.0.183"
    "node" => "node_01"
  ]
  2 => array:9 [
    "index" => "shards_test"
    "shard" => "1"
    "prirep" => "p"
    "state" => "STARTED"
    "docs" => "0"
    "store" => "227b"
    "dataset" => "227b"
    "ip" => "192.168.0.185"
    "node" => "node_03"
  ]
  3 => array:9 [
    "index" => "shards_test"
    "shard" => "1"
    "prirep" => "r"
    "state" => "STARTED"
    "docs" => "0"
    "store" => "227b"
    "dataset" => "227b"
    "ip" => "192.168.0.184"
    "node" => "node_02"
  ]
  4 => array:9 [
    "index" => "shards_test"
    "shard" => "2"
    "prirep" => "p"
    "state" => "STARTED"
    "docs" => "0"
    "store" => "227b"
    "dataset" => "227b"
    "ip" => "192.168.0.184"
    "node" => "node_02"
  ]
  5 => array:9 [
    "index" => "shards_test"
    "shard" => "2"
    "prirep" => "r"
    "state" => "STARTED"
    "docs" => "0"
    "store" => "227b"
    "dataset" => "227b"
    "ip" => "192.168.0.183"
    "node" => "node_01"
  ]
]


index: 索引的名稱。在這個例子中,索引名稱是 shards_test。
shard: 分片的編號。"0"表示這是索引的第一個主分片。
prirep: 分片的型別。"r"表示這是一個副本分片(“r” 是“replica”的縮寫)。主分片的標識是 "p"。
state: 分片的狀態。"STARTED"表示該分片已成功啟動並處於活動狀態。
docs: 分片中的文件數量。"0"表示當前分片中沒有文件。
store: 分片佔用的儲存空間大小。"227b"表示這個分片的大小為227位元組。
dataset: 這個欄位通常不在標準的 _cat/shardsAPI輸出中,可能是某個自定義的監控系統中的欄位。在這裡它和 store 的值相同,即 227b。
ip: 託管該分片的節點的IP地址。在這個例子中是192.168.0.185。
node: 託管該分片的節點名稱。在這個例子中是node_03。

副本增刪改查

  • 增:
返回bool
$params = [
    'index' => 'shards_test',
    'body'  => [
        'settings' => [
            'number_of_shards' => 3, //建立3個分片
            'number_of_replicas' => 1 //每個分片有1個副本
        ]
    ]
];

$response = $client->indices()->create($params);
dd($response->asBool());
  • 刪:
返回bool
$params = [
    'index' => 'shards_test',
    'body'  => [
        'settings' => [
            'number_of_replicas' => 0
        ]
    ]
];

$response = $client->indices()->putSettings($params);
dd($response->asBool());
  • 改:
$params = [
    'index' => 'shards_test',
    'body'  => [
        'settings' => [
            'number_of_replicas' => 2 //自定義數量
        ]
    ]
];

$response = $client->indices()->putSettings($params);
dd($response->asBool());
  • 查:
返回array
同節點檢視操作
$params = [
    'index' => 'shards_test',
    'format' => 'json'
];

$response = $client->cat()->shards($params);
dd($response->asArray());

自定義路由相關增刪改查

  • 不妨先建立一個索引及其對映與分片副本配置
$params = [
    'index' => 'route_test',
    'body'  => [
        'mappings' => [
            'properties' => [
                'test_field' => [
                    'type' => 'text',
                    'index' => true
                ]
            ]
        ],
        'settings' => [
            'number_of_shards' => 3,
            'number_of_replicas' => 1
        ]
    ]
];
$response = $client->indices()->create($params);
dd($response->asBool());
  • 增:不支援的操作。路由是個字串,用於雜湊計算分片的引數標識,自定義路由本身沒有新增的意義,可參與建立資料。
返回bool
$params = [
    'index' => 'route_test',
    'id'    => '1',
    'body'  => [
        'test_field' => 'C語言是世界上最好的程式語言',
    ],
    'routing' => 'share_01' //自定義路由標識
];

$response = $client->index($params);
dd($response->asBool());
  • 刪:不支援的操作。路由是個字串,用於雜湊計算分片的引數標識,自定義路由本身沒有刪除的意義,可參與刪除資料。
$params = [
    'index' => 'route_test',
    'id'    => '1',
    'routing' => 'share_01'  //若使用其它的路由,則無法命中,導致刪除出現異常報錯
];


try {
    $response = $client->delete($params);
} catch (\Exception $exception) {
    //異常兜底操作
    dd($exception->getMessage());
}
dd($response->asBool());
  • 改:不支援的操作。路由是個字串,用於雜湊計算分片的引數標識,自定義路由本身沒有更改的意義,可參與更新資料。
返回bool
$params = [
    'index' => 'route_test',
    'id'    => '1',
    'body'  => [
        'doc' => [
            'test_field' => 'C是世界上最好的程式語言'
        ]
    ],
    'routing' => 'share_01' //若使用其它的路由,則無法命中,導致更新出現異常報錯
];

try {
    $response = $client->update($params);
} catch (\Exception $exception) {
    //異常兜底操作
    dd($exception->getMessage());
}
dd($response->asBool());
  • 查:不支援的操作。路由是個字串,用於雜湊計算分片的引數標識,自定義路由本身沒有查詢的意義,可參與查詢資料。
返回陣列
$params = [
    'index' => 'route_test',
    'body'  => [
        'query' => [
            'match' => [
                'test_field' => 'C語言是世界上最好的程式語言'
            ]
        ]
    ],
    'routing' => 'share_01' //若使用其它的路由,則無法命中,導致查詢不出來資料。
];

$response = $client->search($params);
dd($response->asArray());

相關文章