別名

SolrCloud 能夠透過替代名稱查詢一個或多個集合。這些集合的替代名稱稱為別名,當您想要執行以下操作時非常有用

  1. 以零停機時間原子性地切換到使用新(重新)索引的集合(透過重新定義別名)

  2. 隔離用戶端程式設計與集合名稱的變更

  3. 針對具有相同 Schema 的多個集合發出單一查詢

別名有兩種:標準別名和路由別名。在路由別名中,有兩種:類別路由別名和時間路由別名。本節將討論這些類型。

可以將集合更新命令傳送至別名,但僅限於解析為單一集合的別名,或是定義多個集合之間路由的別名(路由別名)。在其他情況下,更新命令會因錯誤而被拒絕,因為沒有任何邏輯可在多個集合之間分配文件。

標準別名

標準別名是使用 CREATEALIAS 命令建立和更新的。

目前屬於別名的集合清單可透過 CLUSTERSTATUS 命令進行驗證。

所有別名的完整定義(包括關於該別名的中繼資料,在路由別名的情況下,請參閱下文)可透過 LISTALIASES 命令進行驗證。

或者,此資訊可透過使用原生 ZooKeeper 用戶端或在管理介面中雲端選單的 樹狀頁面檢查 ZooKeeper 中的 /aliases.json 來取得。

別名可以使用 DELETEALIAS 命令刪除。刪除別名時,底層集合**不受影響**。

任何參考多個集合的別名(標準或路由)都可能會使相關性複雜化。根據預設,SolrCloud 會在每個分片的基礎上對文件評分。

別名中的多個集合始終存在此問題,因此如果您有對 BM25 或 TF/IDF 相關性很重要的使用案例,您會想要開啟 ExactStatsCache 實作之一。

然而,對於以數值、日期或字母數字欄位值而非相關性計算來排序結果的分析使用案例而言,這不是問題。

路由別名

為了處理與標準別名相關的更新限制,並提供額外的實用功能,已開發出路由別名的概念。目前有兩種路由別名:時間路由和類別路由。這些將在下面詳細描述,但它們有一些共同的行為。

當處理路由別名的更新時,Solr 會像平常一樣初始化其更新請求處理器鏈,但當 DistributedUpdateProcessor (DUP) 初始化時,它會偵測到更新目標是一個路由別名,並在自身前面注入 RoutedAliasUpdateProcessor (RAUP)。RAUP 與 Overseer 協同工作,是路由別名的主要部分,且必須緊接在 DUP 之前。在 RAUP 和 DUP 之間,無法使用其他類型的 UpdateRequestProcessors 配置自定義鏈。

理想情況下,作為路由別名的使用者,您不需要關心集合命名模式的細節,因為查詢和更新都可以透過別名完成。新增資料時,您通常應將文件導向別名(例如,參考別名名稱而不是任何集合)。Solr 伺服器和 CloudSolrClient 會將更新請求導向別名指向的第一個集合。一旦伺服器接收到資料,它將執行必要的路由。

對於所有路由別名,最重要的是路由值**不可**變更。使用相同 ID 的不同路由值重新索引文件會產生兩個不同的文件,這些文件具有相同的 ID,並且可透過別名存取。一旦存在重複的 ID,路由別名的所有查詢時行為都是**未定義**且難以預測的。
不建議在路由別名中使用「資料驅動」模式(也稱為無結構模式),因為可能會同時發生重複的結構變更,導致錯誤。

時間路由別名

時間路由別名 (Time Routed Aliases, TRAs) 是 SolrCloud 的一項功能,用於管理別名和時間順序排列的集合系列。

它會根據時間戳將文件路由到正確的集合,並自動建立新集合,並(可選)刪除舊集合。這種方法允許無限期地索引資料,而不會因單一索引的持續增長而導致效能下降。

如果您需要在 Solr 中儲存大量帶有時間戳的資料,例如日誌或 IoT 感測器資料,那麼此功能可能比建立一個分片的雜湊路由集合更有意義。

運作方式

首先,您可以使用CREATEALIAS 命令和所需的路由設定建立時間路由別名。大多數設定可以在稍後使用ALIASPROP 命令進行編輯。

第一個集合將會自動建立,同時還會有一個指向它的別名。作為 TRA 成員的集合中的每個底層 Solr「核心」都有一個特殊的核心屬性,用於參考別名。每個集合的名稱都包含 TRA 名稱和開始時間戳 (UTC),並將尾隨的零和符號截斷。

TRA 的集合列表始終以反向排序,因此請求的連線路徑將會路由到前導集合。使用 CloudSolrClient 更為可取,因為它可以減少一個底層的物理 HTTP 請求。如果您知道要傳送的特定文件集將會傳送到特定的較舊集合,那麼您可以從用戶端將其導向該處進行最佳化,但這不是必要的。CloudSolrClient (尚未)執行此操作。

RAUP 在初始化時,會首先從別名屬性中讀取 TRA 配置。當它看到每個文件時,它會檢查 TRA 屬性的變更,在需要時更新其快取配置,然後確定該文件屬於哪個集合。

  • 如果 RAUP 需要將其傳送到由集合表示的時間段,而不是用戶端選擇與之通信的那個時間段,那麼它將使用與 DUP 共享的機制來執行此操作。一旦文件被轉發到正確的集合(即正確的 TRA 時間段),它就會直接跳到目標集合上的 DUP 並正常繼續,可能會再次路由到目標集合中的正確分片和複本。

  • 如果它屬於當前集合(如果在發生事件時處理事件通常是這種情況),則該文件將傳遞到 DUP。DUP 會執行其正常的集合級別處理,這可能涉及將文件路由到另一個分片和複本。

  • 如果文件上的時間戳比最新的 TRA 段還要新,則需要在 TRA 的開頭新增一個新集合。RAUP 將建立此集合,將其新增到別名,然後將文件轉發到剛才建立的集合。如果需要建立多個集合,則可能會遞迴發生此情況。

    每次新增新集合時,都會檢查 TRA 中最舊的集合是否可能刪除(如果已配置)。所有這些都會同步發生,可能會在更新請求和索引延遲中增加數秒。

    如果已配置 router.preemptiveCreateMath,並且文件在此視窗內到達,則會非同步發生。有關詳細資訊,請參閱時間路由別名參數

任何其他類型的更新(如 commit 或 delete)都會由 RAUP 路由到所有集合。一般來說,這不是一個效能問題。當 Solr 收到一個 delete 或 commit 時,其中沒有任何內容被刪除或不需要 commit 時,它的開銷非常小。

限制與假設

  • 僅支援**時間**路由別名。如果您有其他順序數字,您可以將其偽造為時間(例如,假設某些 epoch 並遞增,將其轉換為時間戳)。

    最小間隔為一秒。不支援其他路由方案,儘管此功能的開發考慮到它可以擴展/改進到其他方案。

  • 底層集合形成一個連續的序列,沒有間隙。當底層資料中存在較大間隙時,這將不適用,因為 Solr 將堅持每個增量都有一個集合。這部分原因是 Solr 會根據下一個集合的時間戳計算每個間隔集合的結束時間,因為它沒有以任何方式儲存。

  • 如果您還配置了自動刪除舊集合,請避免將更新傳送到最舊的集合。這可能會導致異常回流到索引客戶端。

類別路由別名

類別路由別名 (Category Routed Aliases, CRAs) 是一項功能,用於根據單一欄位的值管理別名和一組相依集合。

CRA 會自動建立新集合,但由於分割是基於類別資訊而不是連續的數值,因此沒有自動刪除的邏輯。這種方法簡化了資料的索引,這些資料必須為了叢集管理或安全性原因而區隔到不同的集合中。

運作方式

首先,您可以使用CREATEALIAS 命令和所需的路由設定建立類別路由別名。大多數設定可以在稍後使用ALIASPROP 命令進行編輯。

別名將會使用一個特殊的佔位符集合建立,該集合始終命名為 myAlias__CRA__NEW_CATEGORY_ROUTED_ALIAS_WAITING_FOR_DATA__TEMP。索引到 CRA 中的第一個文件將會建立第二個名為 myAlias__CRA__foo 的集合(對於 foo 的路由欄位值)。索引的第二個文件將會導致刪除臨時佔位符集合。此後,每當遇到欄位的新值時,都會建立集合。

為了防止失控的集合建立,提供了用於限制類別總數和拒絕不符值的選項,並且提供了正規表示式參數(有關詳細資訊,請參閱類別路由別名參數)。

+ 請注意,透過為這些選項提供非常大或非常寬鬆的值,您將承擔雜亂的資料可能產生數千個集合並導致叢集停止運作的風險。

欄位值(因此也是集合名稱)區分大小寫。

與 Solr 中的其他地方一樣,預期在將資料傳送到 Solr 之前由外部程序完成資料的操縱和清理,但有一個例外。在整個 Solr 中,對集合名稱中允許的字元有限制。在計算類別的集合名稱時,除了 ASCII 字母數字字元 (A-Za-z0-9)、連字號 (-) 或底線 (_) 之外的任何字元都將被替換為底線。對於名為 myAlias 的 CRA,下表顯示了如何計算集合名稱

CRA 集合名稱

foo

myAlias__CRA__foo

Foo

myAlias__CRA__Foo

foo bar

myAlias__CRA__foo_bar

FOÓB&R

myAlias__CRA__FO_B_R

中文的東西

myAlias__CRA_______

foo__CRA__bar

導致 400 Bad Request

<null>

導致 400 Bad Request

由於集合建立可能需要 1-3 秒,因此在 CRA 中插入資料的系統應建構為在建立新集合時處理此類暫停。與時間路由別名不同,無法預測下一個值,因此這種暫停是不可避免的。

沒有自動移除類別的方法。如果需要從 CRA 中移除類別,建議使用以下程序

  1. 確保不會傳送任何具有要移除的類別的相應值的文件,方法是停止索引或修復傳入的資料串流

  2. 在 ZooKeeper 中修改別名定義,移除與該類別相對應的集合。

  3. 刪除與該類別相對應的集合。請注意,如果沒有先從別名中移除集合,則此步驟將會失敗。

限制與假設

  • 由於集合名稱的限制,CRA 目前不適用於非英文資料值。可以透過將路由值複製到**url 安全** 的 Base64 編碼欄位並改為路由該值來解決此問題。

  • CRA 中綴的檢查獨立於正規表示式驗證,並且發生在計算要建立的集合名稱之後。它無法避免,並且對於支援未來的功能是必要的。

維度路由別名

對於資料所需的分隔與兩個欄位相關,並且在索引期間將其組合到單一欄位中是不切實際的情況,或者需要跨多個類別的 TRA 行為時,可以使用維度路由別名。此功能旨在處理任意數量和組合的類別和時間維度,並且以任何順序排列,但建議使用者仔細考慮此類配置產生的集合總數。數百個或 1000 個以下的集合計數開始對 ZooKeeper 構成重大挑戰。

DRA 是一項新功能,目前僅支援 2 個維度。未來將支援更多維度(有關進度,請參閱https://issues.apache.org/jira/browse/SOLR-13628

運作方式

首先,您可以使用每個維度的所需路由器設定建立維度路由別名。有關如何指定每個維度配置的詳細資訊,請參閱CREATEALIAS 命令文件。典型的集合名稱將採用以下形式(範例為類別 x 時間範例,間隔為 30 分鐘)

myalias__CRA__someCategory__TRA__2019-07-01_00_30

請注意,對於任何包含基於類別的維度的 DRA,初始集合將是一個可拋棄的佔位符。集合名稱的每個子部分的名稱產生與元件維度類型的相應部分相同(例如,產生 CRATRA 的類別值仍會產生錯誤)。

前面關於使用不同路由值重新索引文件的警告適用於 DRA 的每個維度。DRA 不適用於路由中使用的類別或時間戳會變更的文件(當然,這也適用於未來 RA 類型的其他路由值)。

如同所有路由別名一樣,如果您的資料行為不佳,DRA 也會產生一些成本。除了每個組件維度的正常注意事項外,在 DRA 運行一段時間後,還需要小心發送新的類別。有序維度(時間)的行為與無序維度(類別)略有不同。有序維度依賴於別名中集合的迭代順序,因此無法容忍以無序方式產生集合名稱。這意味著,當有序維度(例如時間)是 DRA 的組件,且 DRA 接收到具有與時間維度的起始時間片段不同的時間值的新類別文件時,在可以索引該文件之前,需要建立多個集合。這種「新類別效應」與您在使用 TRA 時選擇過於遙遠的起始日期所獲得的行為相同。

例如,假設有一個以 2019-07-01T00:00:00Z 為起始時間的 Dimensional[時間, 類別] DRA,則 4 個文件建立的集合模式可能如下所示

沒有文件

已別名的集合

myalias__TRA__2019-07-01__CRA__NEW_CATEGORY_ROUTED_ALIAS_WAITING_FOR_DATA_TEMP

文件 1

  • 時間:2019-07-01T00:00:00Z

  • 類別:someCategory

已別名的集合

myalias__TRA__2019-07-01__CRA__NEW_CATEGORY_ROUTED_ALIAS_WAITING_FOR_DATA_TEMP
myalias__TRA__2019-07-01__CRA__someCategory

文件 2

  • 時間:2019-07-02T00:04:00Z

  • 類別:otherCategory

已別名的集合

myalias__TRA__2019-07-01__CRA__someCategory
myalias__TRA__2019-07-01__CRA__otherCategory // 2 collections created in one update
myalias__TRA__2019-07-02__CRA__otherCategory

文件 3

  • 時間:2019-07-03T00:12:00Z

  • 類別:thirdCategory

已別名的集合

myalias__TRA__2019-07-01__CRA__someCategory
myalias__TRA__2019-07-01__CRA__otherCategory
myalias__TRA__2019-07-02__CRA__otherCategory
myalias__TRA__2019-07-01__CRA__thirdCategory // 3 collections created in one update!
myalias__TRA__2019-07-02__CRA__thirdCategory
myalias__TRA__2019-07-03__CRA__thirdCategory

文件 4

  • 時間:2019-07-03T00:12:00Z

  • 類別:someCategory

已別名的集合

myalias__TRA__2019-07-01__CRA__someCategory
myalias__TRA__2019-07-01__CRA__otherCategory
myalias__TRA__2019-07-02__CRA__otherCategory
myalias__TRA__2019-07-01__CRA__thirdCategory
myalias__TRA__2019-07-02__CRA__thirdCategory
myalias__TRA__2019-07-03__CRA__thirdCategory
myalias__TRA__2019-07-02__CRA__someCategory // 2 collections created in one update
myalias__TRA__2019-07-03__CRA__someCategory

因此,DRA 的最佳應用情境是具有一組良好標準化的維度且不會改變,並且完整排列組合經常發生的資料集。如果在稍後引入新類別且索引延遲是重要的 SLA 功能時,有幾種策略可以減輕這種影響

  • 如果要建立的額外時間片段數量不大,則可以從常規索引中發送單個帶外文件,並等待集合建立完成,然後允許通過 SLA 約束的流程發送新類別。

  • 如果上述程序可能會建立極大量的集合,並且已知新類別中最早的文件,則可以使用 ALIASPROP 命令調整時間維度的起始時間

改進的可能性

路由別名是 SolrCloud 的一項相對較新的功能,預計將會得到改進。一些可能的改進領域(尚未實作)包括

  • TRA:具有時間篩選器的搜尋應僅前往適用的集合。

  • TRA:自動最佳化(或減少資源)預期不會收到更多更新,並且搜尋需求可能較少的舊集合的方法。

  • CRA:通過 Base64 編碼對非英語文字的固有支援。

  • CRA:為事先已知的情況提供值的初始清單,以減少索引期間的停頓。

  • DRA:支援超過 2 個維度。

  • CloudSolrClient 可以根據路由值將文件路由到正確的集合,而不是始終選擇最新/第一個集合。

  • 目前僅路由更新,並且查詢會分發到別名中的所有集合,但未來的功能可能會啟用基於特殊參數或路由欄位上的篩選器將查詢路由到單個適當的集合。

  • 集合可能會受到其大小的限制,而不是或除了時間或類別值。這可以作為另一種路由別名類型來實作,或者可能作為現有路由別名的一個選項

  • 選項:刪除別名時也一併刪除底層集合。路由別名在初始測試期間可能會快速建立超出預期的集合。在發生此類事件後移除它們會過於繁瑣。

一如既往,歡迎提交修補程式和提取請求!

集合命令和別名

SolrCloud 支援在通常需要集合名稱的集合命令中使用別名。這僅在滿足以下條件時才有效

  • 使用請求參數 followAliases=true

  • 別名不得參考多個集合

  • 別名不得參考路由別名

如果滿足所有條件,則該命令將解析所有別名並在別名參考的集合上操作,就如同使用集合名稱調用一樣。否則,該命令將不會執行,並且會拋出例外。

followAliases=true 參數應謹慎使用,以便解析的目標確實是預期的目標。在多層別名或影子別名(與現有集合同名但指向其他集合的別名)的情況下,強烈建議不要使用此選項,因為效果可能難以正確預測。