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

来源:https://www.cnblogs.com/phpphp/p/18324434
-Advertisement-
Play Games

前置銜接文章: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插件

原本是想通過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角色。
  • 分片與副本分佈:節點掛掉後,意味著節點數量發生了變化,就算再次啟動,分片與副本分佈可能會與原先的不一樣。
  • 調用端:只要節點不全部掛掉,訪問速度會變慢,但支持正常訪問。

客戶端調用集群的方案

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());

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 如何讓SQL Server像MySQL一樣擁有慢查詢日誌(Slow Query Log慢日誌) SQL Server一直以來被人詬病的一個問題是缺少了像MySQL的慢日誌功能,程式員和運維無法知道資料庫過去歷史的慢查詢語句。 因為SQLServer預設是不捕獲過去歷史的長時間阻塞的SQL語句,導致大 ...
  • “10000條”問題(個人稱謂) 癥狀: 在數據量不大的情況下,可能還會使用from + size的傳統分頁方式,但是數量受限,只能取前10000條的數據。 緣由:ES限值10000條,是ES團隊挑選一個不大不小的數作為閾值,為了避免深度分頁的策略。 調整:max_result_window 用於控 ...
  • 解鎖 SQL Server 2022的時間序列數據功能 SQL Server2022在處理時間序列數據時,SQL Server 提供了一些優化和功能,比如 DATE_BUCKET 函數、視窗函數(如 FIRST_VALUE 和 LAST_VALUE)以及其他時間日期函數,以便更高效地處理時間序列數據 ...
  • 寫在前面 大家好,不知道前面的20題大家寫的怎麼樣,前面分享的20題是SQL中查詢的基礎題型,這部分被稱為DQL部分,是每個學習MySQL必須要學會的部分,下麵就讓我來介紹MySQL中的其他部分。 回顧DQL部分 先介紹一下sql語句的語法和執行順序(序號代表順序由1~9): select 查詢列表 ...
  • DML(數據定義語言) 插入語句 方式一:經典的插入語句 * 語法: insert into 表名(列名,...) values(值1,...); 方式二: 語法: insert into 表名 set 列名=值,列名=值,...... 方式一和方式二對比: 方式一支持插入多行,方式二不支持; 方式 ...
  • 一、MySQL數據結構 InnoDB引擎 MySQL預設引擎是InnoDB引擎,這個引擎的主要特點是支持事務和行鎖, 數據結構 2.1 二叉樹(二叉查找樹) 二叉樹是一種特殊的樹,二叉樹中每個節點的度都不能大於2,就是說每個節點最多只能有左右兩個子節點 當我們像二叉查找樹儲存數據的時候,是安裝從大到 ...
  • 工作常用SQL Excel生成SQL 這個好用 ="insert into t_gk_mapping(id,gk_project_name,gk_project_code,main_project_name,main_project_code) values ('"&J2&"','"&I2&"',' ...
  • 2024年7月24日,由數據猿主辦,IDC協辦,新華社中國經濟信息社、上海大數據聯盟、上海市數商協會、上海超級計算中心作為支持單位,舉辦“數智新質·力拓未來 2024企業數智化轉型升級發展論壇——暨AI大模型趨勢論壇”數據猿“年中·特別策劃季——數智化轉型升級”主題策劃活動。 在這場備受矚目的盛會上 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...