前置銜接文章:ElasticSearch第1講(4萬字詳解 Linux下安裝、原生調用、API調用超全總結、Painless、IK分詞器、4種和資料庫同步方案、高併發下一致性解決方案、Kibana、 ELK) ElasticSearch集群 極簡概括:多個ES節點組成的一個系統。 解決問題: 防止單 ...
前置銜接文章: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經過哈希後取模來進行路由計算。
集群內數據的讀寫流程
- 寫流程
- 客戶端發送寫請求:客戶端向ES集群中的某個節點發送寫請求,這個節點會作為本次請求的協調節點(Coordinating Node)。
- 路由到正確的分片:協調節點使用文檔ID的哈希值來確定文檔屬於哪個分片,並通過集群狀態中的內容路由表信息獲知該分片的主分片位置。
- 主分片寫入:協調節點將寫請求轉發到主分片所在的節點,由主分片執行實際的寫操作。
- 主從複製:如果主分片寫入成功,它會將請求並行轉發到所有的副本分片(Replica Shard)所在的節點,等待副本分片寫入成功。這是為了保證數據的冗餘和一致性。
- 確認寫入成功:一旦所有副本分片都成功寫入了數據,主分片節點會向協調節點報告成功,隨後協調節點向客戶端返回寫入成功的響應(有例外)。
- 讀流程
- 客戶端發送讀請求:客戶端向ES集群中的某個節點發送讀請求,這個節點同樣會作為本次請求的協調節點。
- 確定數據和副本信息:協調節點使用文檔ID的哈希值來確定文檔屬於哪個分片,並通過集群狀態中的內容路由表信息獲知該分片的副本信息。
- 轉發請求到副本節點:協調節點可以將讀請求轉發到有副本分片的任意節點進行讀取。在實際操作中,為了負載均衡,協調節點可能會採用輪詢的方式將請求分發到不同的副本節點。
- 返回數據給客戶端:處理讀請求的節點將數據返回給協調節點,隨後協調節點將數據返回給客戶端。
- 協調節點:負責處理集群內請求並將其分發到合適數據節點的節點。協調節點不直接存儲數據或索引,而是負責處理請求的路由。
故障轉移帶來的影響
- 補充:這裡的故障轉移,指的是某個節點掛掉後,對集群本身和調用端的影響。
- 角色:若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());