<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      淺談ElasticSearch索引

      概述

      官方文檔:https://www.elastic.co/docs/manage-data/data-store/index-basics

      索引是Elasticsearch中的基本存儲單元,類似于MySql數據庫中的表,包含一堆有相似結構的文檔數據,在Elasticsearch可以創建多個索引。

      tips:
      每個索引默認有5個主分片,1個副本分片,其中的主分片和副本分片的作用,我們下面講解。

      添加至索引中的數據,會被近實時(1秒內)的被搜索(這里不是立即可以被檢索)

      近實時被搜索如何理解?下面我們會仔細講解,參考文檔:https://www.elastic.co/docs/manage-data/data-store/near-real-time-search

      索引的組成

      邏輯層面

      從邏輯層面來看,索引是由下面幾個部分組成:

      • 分片
        • 索引的邏輯拆分單元,每個分片是一個獨立的 Lucene 索引
        • 主分片(Primary Shards)負責數據寫入和讀取,副本分片(Replica Shards)用于容錯和負載均衡
        • 分片數量在索引創建時指定,默認 5 個主分片,1個副本分片,可通過設置調整

      設置分片示例

      PUT /my_index
      {
        "settings": {
          "number_of_shards": 3,
          "number_of_replicas": 1
        }
      }
      
      • 映射(Mapping)
        • 定義索引中字段,字段的類型、分詞器、存儲方式等元數據
        • 支持動態映射(自動推斷字段類型)和手動映射(精確控制字段行為)

      映射示例:

      {
        "mappings": {
          "properties": {
            "title": { "type": "text", "analyzer": "ik_max_word" },
            "tags": { "type": "keyword" },
            "create_time": { "type": "date" }
          }
        }
      }
      
      • 文檔(Document)
        • 索引中真實的數據記錄,類似mysql表中的行數據
        • 索引的最小數據單元,以 JSON 格式存儲,包含多個字段(Fields)
        • 每個文檔有唯一標識符(ID),可自動生成或手動指定

      示例文檔記錄

      {
        "_index": "my-first-elasticsearch-index",
        "_id": "DyFpo5EBxE8fzbb95DOa",
        "_version": 1,
        "_seq_no": 0,
        "_primary_term": 1,
        "found": true,
        "_source": {
          "email": "john@smith.com",
          "first_name": "John",
          "last_name": "Smith",
          "info": {
            "bio": "Eco-warrior and defender of the weak",
            "age": 25,
            "interests": [
              "dolphins",
              "whales"
            ]
          },
          "join_date": "2024/05/01"
        }
      }
      

      物理層面

      ES 索引的底層基于 Lucene,其物理存儲由以下部分構成:

      • Lucene 分段(Segments)
        • 索引的物理存儲單元,每個分段是一個獨立的倒排索引
        • 分段由 Refresh 操作生成,包含文檔的索引數據和元數據
        • 分段特性:
          • 不可變(Immutable),生成后無法修改,保證搜索時的數據一致性
          • 后臺自動合并(Merge),減少分段數量,優化搜索性能
      • 倒排索引(Inverted Index)
        • Lucene 的核心數據結構,是 ES 快速檢索的基礎
        • 倒排索引將 “文檔 - 詞語” 的正向關系轉換為 “詞語 - 文檔列表” 的反向關系

      結構示例:

      詞語(Term) | 文檔ID列表(Postings List)
      -----------|---------------------------
      Elasticsearch | [1, 3, 5]
      搜索引擎     | [1, 2, 4]
      分布式       | [1, 3, 4]
      
      • 索引文件(Index Files)

        • 每個 Lucene 分段包含多個索引文件,常見類型:
          • *.nvd:存儲文檔字段值
          • *.nvm:字段值的元數據
          • *.tim:記錄詞語(Term)的字典和頻率
          • *.doc:文檔偏移量索引
          • *.pos:詞語在文檔中的位置信息(用于短語搜索)
          • *.dim:分段元數據(如創建時間、版本等)
      • 事務日志(Translog)

        • 記錄所有未持久化的索引操作,確保數據不丟失
        • 存儲路徑:data/<cluster_name>/nodes/<node_id>/indices/<index_uuid>/translog
        • 作用:
          • 保障 ES 重啟后數據恢復
          • 支持增量恢復(Incremental Recovery)

      索引分片的作用

      主分片

      主分片是 Elasticsearch(ES)索引數據存儲的基礎單元。也是實現ES分布式高可用的基石,主分片在創建索引時通過number_of_shards指定,默認是5個主分片,主分片的數量可以根據主節點的數量來進行設置。

      常規業務場景下(數據量中等,單分片≤50GB),每個節點的分片可以設置成1-2個,例如你的主節點有3個,在每個節點的資源規格都一樣的情況下,那么你的主分片可以設置為3個或者6個
      大數據量場景下(單分片 50GB100GB,總數據量≤600GB),每個節點的分片可以設置成34個,例如你的主節點有3個,在每個節點的資源規格都一樣的情況下,那么你的主分片可以設置為9個或者12個

      主分片經過設置之后是不可更改的,所以在設置主分片時需要經過慎重的考慮。

      其主要作用有以下幾點:

      • 每個索引被拆分為多個主分片(默認 5 個),每個主分片是一個獨立的 Lucene 索引,負責存儲索引的部分文檔數據,當執行搜索、更新、刪除等操作時,請求會被分發到相關主分片上執行,確保數據操作的直接性和高效性。

      • 主分片是數據寫入的唯一入口:所有文檔的創建、更新、刪除操作都首先在主分片上完成,再同步到副本分片,主分片維護著文檔的最新版本和元數據(如版本號、路由信息),確保集群內數據的一致性。

      • 通過增加主分片數量(創建索引時指定),可以將數據分散到更多節點,提升集群的存儲容量和并發處理能力。每個主分片可獨立分配到不同節點,實現負載均衡(如通過 ES 的分片分配機制自動調整)。

      副本分片

      副本分片是主分片的鏡像拷貝,主要為集群提供可靠性、可用性和性能優化能力。副本分片占用與主分片相同的存儲空間,增加副本會提高內存和磁盤使用量,副本分片在創建索引時通過number_of_replicas指定,默認值是1。

      副本分片設置之后是可以修改的,如下:

      PUT /your_index/_settings
      {
        "number_of_replicas": 2  // 設置副本數為2
      }
      

      副本分片的作用如下:

      • 當某個節點故障或主分片所在節點不可用時,副本分片會被提升為新的主分片(通過 ES 的自動故障轉移機制),確保服務不中斷,每個副本分片與主分片分布在不同節點(默認策略),避免單點故障(如節點硬件故障、網絡分區)導致數據丟失

      • 副本分片可處理讀請求(如搜索、獲取文檔),分擔主分片的查詢壓力,尤其在高并發場景下顯著提升集群吞吐量,同一索引的副本分片越多,可并行處理的讀請求越多(如每個副本分片可獨立響應查詢)。

      • 副本分片是數據的冗余存儲,即使部分節點損壞,仍可通過其他節點的副本恢復完整數據(無需依賴外部備份),可通過調整副本數量(默認 1 個)平衡可用性和資源消耗(每個副本占用與主分片相同的存儲空間)。

      修改副本分片的注意事項

      • 注意資源消耗
        • 每個副本分片占用與主分片相同的存儲空間,增加副本會提高內存和磁盤使用量。
        • 例如5 主分片 ×2 副本 = 15 個分片,需預留相應存儲和 JVM 堆內存。
      • 注意性能影響
        • 增加副本可提升讀性能(更多分片可并行處理查詢),但修改期間會產生網絡流量(復制數據),可能短暫影響集群性能。
        • 建議在低峰期執行大規模副本調整。
      • 故障轉移能力
        • 至少保留 1 個副本以保證高可用(允許 1 個節點故障)。
        • 若需容忍 N 個節點故障,副本數應≥N。
      • 集群狀態監控
        • 修改過程中通過GET /_cluster/health監控集群狀態,確保status為green或yellow(red表示有未分配的主分片)

      副本分片和主分片的數量對應關系

      當主分片設置成3,副本分片設置成1時,那么一共會有6個分片存在集群中,副本分片的1是將對應的3個主分片分別copy一份在不同的節點中。
      image

      索引的近實時性

      官方文檔:https://www.elastic.co/docs/manage-data/data-store/near-real-time-search

      近實時性是指當數據寫入至ES的索引中,需要一定時間(官方描述的是1秒內)才能被檢索到,這個可以通過下面的參數設置

      # 索引創建時設置refresh_interval為500ms
      PUT /my_index
      {
        "settings": {
          "refresh_interval": "500ms" # 默認1000ms,也就是1秒
        }
      }
      

      refresh_interval參數并不是設置的越小越好,當值為0時,會禁用自動 Refresh,仍需手動觸發 Refresh 才能讓文檔可搜索,這會引入人為延遲(人為操作,延遲可能更大)。

      Refesh機制

      Refresh 機制是控制近實時性的關鍵

      • 默認 Refresh 間隔:ES 默認每 1 秒執行一次 Refresh 操作,這就是 “1 秒近實時” 的來源
      • 手動觸發 Refresh:可通過 API 強制刷新,實現更低延遲(如POST /index/_refresh)
      • 性能與實時性的權衡:縮短 Refresh 間隔會提高實時性,但會增加 IO 開銷;延長間隔則反之

      為什么ES不是 “完全實時”的?

      • Refresh 間隔的存在:即使將refresh_interval設為 0(禁用自動 Refresh),仍需手動觸發 Refresh 才能讓文檔可搜索,這會引入人為延遲。
      • 寫入流程的固有延遲:文檔從寫入到生成分段需要經歷內存緩沖區處理,無法做到完全實時(如數據庫的實時查詢)。
      • 設計權衡:ES 犧牲極小的實時性(1 秒)換取高性能和分布式架構的穩定性,這是分布式搜索系統的典型設計。

      索引的管理

      ES的索引類似類似數據庫中的表,管理ES的索引需要通過ES的API來進行管理。索引的API主要有以下

      創建索引

      API

      PUT /{index}
      {
        "aliases": { ... },  # 指定索引別名
        "settings": { ... }, # 指定索引的設置
        "mappings": { ... }  # 指定映射
      }
      

      參數說明:
      index:索引的名稱,需要遵循以下規則:

      • 僅限小寫字母
      • 不能包含\、/、 *、?、"、<、>、|、#以及空格符等特殊符號
      • 從7.0版本開始不再包含冒號
      • 不能以-、_或+開頭
      • 不能超過255個字節(注意它是字節,因此多字節字符將計入255個限制)

      aliases:索引別名(Aliases) 是指向一個或多個索引的邏輯名稱,可用于簡化查詢、實現讀寫分離或索引滾動等場景

      settings:索引的配置參數,如分片數、副本數、刷新間隔等。常用的配置參數為:

      • number_of_shards:指定索引分片
      • number_of_replicas:指定副本數
      • refresh_interval:指定刷新時間,單位秒
      • auto_expand_replicas:自動調整副本數(根據節點數)
      • indices.memory.index_buffer_size:索引緩沖區占堆內存的比例(默認10%)
      • index.translog.durability:異步刷新事務日志(默認sync)
      • index.translog.flush_threshold_size:事務日志刷新閾值
      • index.queries.cache.enabled:啟用查詢結果緩存(默認true)
      • indices.queries.cache.size:緩存占堆內存比例
      • indices.fielddata.cache.size:字段數據緩存大小
      • index.priority:控制索引在恢復和分片分配時的優先級
      • index.routing.allocation.include.tag:強制分片分配到特定節點,包含特定標簽的節點
      • index.routing.allocation.exclude._name:強制分片分配到特定節點,排除特定節點
      • index.blocks.write:true設置索引只讀
      • index.hidden:true設置索引隱藏,不顯示在_cat/indices
      • index.max_result_window:調整深度分頁限制,默認10000,慎用!推薦用scroll或search_after

      mappings:定義索引字段的數據類型和索引方式。后續會單獨講解mappings

      實戰:創建第一個索引

      可以進入kibana進行創建:
      image

      示例:

      # 創建請求
      PUT index_test01
      {
        "settings": {
          "number_of_shards": 3,
          "number_of_replicas": 1,
          "refresh_interval": "1s"
        }
      }
      
      # 預期返回
      {
        "acknowledged" : true,
        "shards_acknowledged" : true,
        "index" : "index_test01"
      }
      

      查看索引

      查看所有的索引

      示例:

      # 請求接口
      GET /_cat/indices?v&s=index
      
      # 預期返回
      health status index                            uuid                   pri rep docs.count docs.deleted store.size pri.store.size
      green  open   .apm-agent-configuration         KC2krPV1Q6On8zLG-2Ap6g   1   1          0            0       454b           227b
      green  open   .apm-custom-link                 fW3LcrktTOGTDKvglhgODQ   1   1          0            0       454b           227b
      green  open   .kibana_7.17.26_001              Bv6ZMZL6STaho_Phwbrv1w   1   1        691           16      5.3mb          2.8mb
      green  open   .kibana_task_manager_7.17.26_001 0wrV35RzTWahe5vAUJKVow   1   1         17        25815      5.8mb          2.8mb
      green  open   index_test01                     TRTmGpiNRuC1wZY49Wt_aA   3   1          0            0      1.3kb           681b
      

      返回字段說明:

      • health:索引的健康程度,green表示所有主分片和副本分片都正常運行,red表示至少有一個主分片未分配(數據可能丟失),yellow表示主分片正常,但至少有一個副本分片未分配
      • status:open表示索引可正常讀寫,close表示索引已關閉,不可訪問
      • index:索引名稱,以 . 開頭的通常是系統索引,如 Kibana、APM 等組件創建的索引
      • uuid:索引的唯一標識符(用于內部識別,不可修改)
      • pri:主分片數量(創建索引時指定,不可動態修改)
      • rep:主分片的副本數量(可動態調整)
      • docs.count:索引中的文檔總數
      • docs.deleted:已標記刪除但尚未物理刪除的文檔數(段合并后會清理)
      • store.size:索引的總存儲大小(包括主分片和所有副本)
      • pri.store.size:主分片的存儲大小(不包括副本)

      查看指定的索引

      api:GET /{index-name}

      示例:

      # 請求
      GET /index_test01
      
      # 預期返回
      {
        "index_test01" : {
          "aliases" : { },
          "mappings" : { },
          "settings" : {
            "index" : {
              "routing" : {
                "allocation" : {
                  "include" : {
                    "_tier_preference" : "data_content"
                  }
                }
              },
              "refresh_interval" : "1s",         # 刷新時間
              "number_of_shards" : "3",          # 主分片數量
              "provided_name" : "index_test01",  # 索引名稱
              "creation_date" : "1750482108424", # 創建時間
              "number_of_replicas" : "1",        # 副本數量
              "uuid" : "TRTmGpiNRuC1wZY49Wt_aA", # uuid,唯一標識符
              "version" : {
                "created" : "7172699"
              }
            }
          }
        }
      }
      

      其它查詢的api

      API 路徑 功能描述 示例
      GET /{index}/_settings 獲取索引設置 GET /products/_settings
      GET /{index}/_mapping 獲取索引映射 GET /products/_mapping
      GET /{index}/_alias 獲取索引別名 GET /products/_alias
      GET /{index}/_stats 獲取索引統計信息 GET /products/_stats
      GET /{index}/_shards 獲取分片狀態 GET /products/_shards
      GET /_cluster/health 集群健康狀態 GET /_cluster/health
      GET /_cluster/health/{index} 特定索引健康狀態 GET /_cluster/health/products
      GET /{index}/_recovery 恢復進度 GET /products/_recovery
      GET /{index}/_segments 段信息 GET /products/_segments
      GET /{index}/_field_usage_stats 字段使用統計 GET /products/_field_usage_stats

      修改索引

      在 Elasticsearch 中,修改索引設置的 API 允許動態調整索引的配置參數(如副本數、刷新間隔等)

      動態修改索引設置(運行時生效)

      修改單個或多個設置
      示例:

      PUT /{index}/_settings
      {
        "settings": {
          "setting_name_1": "value_1",
          "setting_name_2": "value_2",
          ...
        }
      }
      

      修改副本數

      # 請求
      PUT /index_test01/_settings
      {
        "settings": {
          "number_of_replicas": 2
        }
      }
      
      # 預期返回
      {
        "acknowledged" : true
      }
      
      # 查看一下
      GET /index_test01/_settings
      {
        "index_test01" : {
          "settings" : {
            "index" : {
              "routing" : {
                "allocation" : {
                  "include" : {
                    "_tier_preference" : "data_content"
                  }
                }
              },
              "refresh_interval" : "1s",
              "number_of_shards" : "3",
              "provided_name" : "index_test01",
              "creation_date" : "1750482108424",
              "number_of_replicas" : "2",
              "uuid" : "TRTmGpiNRuC1wZY49Wt_aA",
              "version" : {
                "created" : "7172699"
              }
            }
          }
        }
      }
      

      支持動態修改的參數

      設置名稱 說明 示例值
      number_of_replicas 副本數 2
      refresh_interval 刷新間隔(控制新文檔可見性) 30s, -1(禁用自動刷新)
      index.search.slowlog.threshold.query.warn 查詢慢日志閾值(警告級別) 10s
      index.max_result_window 分頁最大結果數(深度分頁風險) 100000
      index.blocks.write 禁止寫入(只讀模式) true
      index.routing.allocation.exclude._name 排除特定節點 node1,node2
      index.priority 恢復優先級 10

      靜態設置參數(需關閉索引后修改)

      某些設置(如主分片數)必須在索引關閉后才能修改:

      # 關閉索引
      POST /{index}/_close
      
      # 修改靜態設置
      PUT /{index}/_settings
      {
        "settings": {
          "number_of_shards": 10  # 僅示例,生產環境謹慎修改
        }
      }
      

      刪除索引(謹慎操作,可以使用關閉索引替代)

      在 Elasticsearch 中,刪除索引是一個不可逆操作,會永久移除索引及其所有數據

      刪除單個索引

      api:DELETE /{index}

      示例:

      # 請求
      DELETE /index_test01
      
      # 預期返回
      {
        "acknowledged" : true
      }
      
      # 驗證索引是否存在
      HEAD /index_test01
      # 預期返回,404表示已經刪除
      {"statusCode":404,"error":"Not Found","message":"404 - Not Found"}
      

      刪除多個索引

      使用逗號分隔多個索引名,或通配符匹配:

      示例:

      DELETE /{index1},{index2},...
      
      # 通配符,刪除所有以logs-開頭的索引
      DELETE /logs-*
      

      刪除所有索引(謹慎操作)

      警告:此操作會刪除集群中所有索引,生產環境中禁用!
      安全措施:部分集群配置了action.destructive_requires_name為true,禁止通過通配符刪除所有索引。

      DELETE /_all
      DELETE /*
      

      索引的其它操作

      • 關閉索引:POST /{index}/_close,關閉索引,使其不能進行讀寫操作,以節省資源。
      • 打開索引:POST /{index}/_open,打開已關閉的索引,恢復其讀寫功能。
      • 收縮索引:POST /{index}/_shrink/{target_index},將索引收縮為指定的目標索引,可減少分片數量。
      • 拆分索引:POST /{index}/_split/{target_index},將索引拆分為多個新的索引。
      • 克隆索引:POST /{index}/_clone/{target_index},克隆一個現有的索引到新的索引。
      • 索引滾動:POST /{alias}/_rollover,用于將數據從一個索引滾動到另一個索引,常用于按時間滾動的索引場景。
      • 凍結索引:POST /{index}/_freeze,凍結索引,使其數據不可變,以節省內存和提高查詢性能。
      • 解凍索引:POST /{index}/_unfreeze,解凍已凍結的索引,恢復其可寫狀態。
      • 解析索引:GET /_resolve_index/{index},解析索引的名稱,返回其真實的索引名稱和相關信息。
      • 檢查索引是否存在:HEAD /{index},通過請求的響應狀態碼判斷索引是否存在,200 表示存在,404 表示不存在。
      posted @ 2025-06-21 14:10  huangSir-devops  閱讀(154)  評論(0)    收藏  舉報
      作者:你的名字
      出處:你的博客鏈接
      本文版權歸作者和博客園共有,歡迎轉載,但必須給出原文鏈接,并保留此段聲明,否則保留追究法律責任的權利。
      主站蜘蛛池模板: 国产欧美一区二区精品性色| 欧美成本人视频免费播放| 国产亚洲亚洲国产一二区| 欧美色丁香| 91香蕉国产亚洲一二三区| 深夜放纵内射少妇| 国产成人精彩在线视频| 99RE8这里有精品热视频| 国产精品99中文字幕| 国产欧美综合在线观看第十页| 中文字幕亚洲人妻一区| 日韩有码中文字幕国产| 亚洲精品欧美综合二区| 亚洲熟妇无码av另类vr影视 | 中文字幕日韩精品有码| 男女扒开双腿猛进入爽爽免费看| 巨大黑人极品videos精品| 亚洲成av人片天堂网无码| 国产精品原创不卡在线| 亚洲综合成人av在线| 无码电影在线观看一区二区三区| 久久精品国产6699国产精| 美女人妻激情乱人伦| 欧美牲交a欧美牲交aⅴ图片| 国产精品区一区第一页| 日韩精品一区二区三区激情视频| 丰满人妻被黑人猛烈进入| 四虎在线播放亚洲成人| 国产精品一区二区av片| 亚洲精品香蕉一区二区| 日韩av综合免费在线| 亚洲一区二区三区自拍偷拍| 一二三四中文字幕日韩乱码| 7878成人国产在线观看| 男女做aj视频免费的网站| 国产成年码av片在线观看| 人人妻人人澡人人爽曰本| 加勒比在线中文字幕一区二区| 日本无产久久99精品久久| 色偷偷女人的天堂亚洲网| 中文字幕av无码免费一区|