Amazon OpenSearch 服務中的跨群集搜索 - Amazon OpenSearch Service

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

Amazon OpenSearch 服務中的跨群集搜索

Amazon OpenSearch 服務中的跨叢集搜尋可讓您跨多個連線網域執行查詢和彙總。通常使用多個較小的網域 (而不是單一大型網域) 會比較有意義,尤其是在執行不同類型工作負載的情況下。

透過工作負載特定網域可執行以下任務:

  • 選擇特定工作負載的執行個體類型以優化每個網域。

  • 建立多個工作負載間的故障隔離界限。也就是說,如果其中一個工作負載失敗,此故障會包含在該特定網域內,而且不會影響其他工作負載。

  • 更輕鬆地跨網域進行擴展。

跨叢集搜尋支援 OpenSearch 儀表板,因此您可以跨所有網域建立視覺效果和儀表板。您需要支付在網域之間AWS 傳輸的搜尋結果的標準資料傳輸費用

注意

開放原始碼 OpenSearch 也有跨叢集搜尋的文件。與受管 Amazon OpenSearch 服務網域相比,開放原始碼叢集的設定差異很大。最值得注意的是,在 OpenSearch 服務中,您可以使用 AWS Management Console 而不是透過 cURL 來設定跨叢集連線。此外,受管服務除了精細的存取控制之外,還使用 AWS Identity and Access Management (IAM) 進行跨叢集身份驗證。因此,我們建議您使用此文件而非開放原始碼 OpenSearch 文件來設定網域的跨叢集搜尋。

限制

跨叢集搜尋有多項重要限制:

  • 您無法將彈性搜索域連接到域。 OpenSearch

  • 您無法連線至自我管理 OpenSearch/彈性搜尋叢集。

  • 若要跨區域連線網域,兩個網域都必須位於彈性搜尋 7.10 或更新版本上。 OpenSearch

  • 一個網域最多可以有 20 個外寄連線。同樣地,一個網域最多可以有 20 個傳入連線。換句話說,一個網域最多可連線到 20 個其他網域。

  • 來源網域的版本必須與目的網域相同或更高。如果您在兩個網域之間設定了雙向連線,並且想要升級其中一個或兩個網域,則必須先刪除其中一個連線。

  • 您無法將自訂字典或 SQL 使用跨叢集搜尋搭配使用。

  • 您無法用 AWS CloudFormation 來連線網域。

  • 您無法在 M3 或高載 (T2 和 T3) 執行個體上使用跨叢集搜尋。

跨叢集搜尋先決條件

設定跨叢集搜尋前,請確認網域符合下列需求:

  • 兩個 OpenSearch 網域,或 6.7 版或更新版本的彈性搜尋網域

  • 已啟用精細存取控制

  • N ode-to-node 加密已啟用

跨叢集搜尋定價

跨網域搜尋無須額外付費。

設定連線

「來源」網域是指跨叢集搜尋請求的來源位置。換句話說,來源網域是您傳送初始搜尋請求的目標位置。

「目的地」網域是來源網域查詢的網域。

跨叢集連線為單向 (從來源到目的地網域)。也就是說,目的地網域無法查詢來源網域。不過,您可以設定相反方向的其他連線。

跨叢集搜尋授權流程

來源網域會建立「傳出」至目的地網域的連線。目的地網域會接收來自來源網域的「傳入」連線請求。

如何設定連線
  1. 在網域儀表板上,選擇網域並移至 Connections (連線) 索引標籤。

  2. Outbound connections (傳出連線) 區段中,選擇 Request (請求)。

  3. 對於 Connection alias (連線別名),輸入連線的名稱。

  4. 選擇連線至您 AWS 帳戶 和區域或其他帳戶或區域中的網域。

    • 若要連線到您 AWS 帳戶 和區域中的叢集,請從下拉式功能表中選取網域,然後選擇 [請求]。

    • 若要連線至另一個叢集 AWS 帳戶 或區域中的叢集,請選取遠端網域的 ARN,然後選擇 [要求]。若要跨區域連線網域,兩個網域都必須執行彈性搜尋 7.10 版或更新版本。 OpenSearch

  5. 若要略過叢集查詢無法使用的叢集,請選取略過無法使用 此設定可確保在一或多個遠端叢集上發生故障時,跨叢集查詢仍會傳回部分結果。

  6. 跨叢集搜尋會先驗證連線請求,確認是否符合先決條件。如果發現網域不相容,連線請求則會進入 Validation failed 狀態。

  7. 連線請求驗證成功後,則會傳送至目的地網域,需要在這裡進行核准。在此核准發生前,連線會保持在 Pending acceptance 狀態。在目的地網域接受連線請求後,狀態會變更為 Active,而目的地網域會變為可供查詢。

    • 網域頁面會顯示目的地網域的整體網域運作狀態和執行個體運作狀態詳細資訊。只有網域擁有者才能靈活建立、檢視、移除和監控與其網域的連線。

建立連線後,在已連線網域節點之間流動的任何流量都會經過加密。如果您將 VPC 網域連接至非 VPC 網域,且該非 VPC 網域是可從網際網路接收流量的公有端點,網域之間的跨叢集流量仍為加密且安全的狀態。

移除連線

移除連線會停止其索引上的任何跨叢集作業。

  1. 在網域儀表板上,前往 Connections (連線) 索引標籤。

  2. 選取您要移除的網域連線並選擇 Delete (刪除),然後確認刪除。

您可以在來源或目的地網域上執行這些步驟,以移除連線。移除連線後,在 15 天內仍可見,狀態為 Deleted

您無法刪除具有作用中跨叢集連線的網域。若要刪除網域,請先從該網域中移除所有傳入和傳出連線。這可確保您在刪除網域前,將跨叢集網域使用者納入考量。

設定安全性和範例演練

  1. 您會將跨叢集搜尋請求傳送至來源網域。

  2. 來源網域會根據其網域存取政策評估請求。由於跨叢集搜尋需要精細存取控制,建議您在來源網域上使用開放式存取政策。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": [ "*" ] }, "Action": [ "es:ESHttp*" ], "Resource": "arn:aws:es:region:account:domain/src-domain/*" } ] }
    注意

    如果您在路徑中包含遠端索引,則必須對網域 ARN 中的 URI 進行 URL 編碼。例如,使用 arn:aws:es:us-east-1:123456789012:domain/my-domain/local_index,dst%3Aremote_index 而非 arn:aws:es:us-east-1:123456789012:domain/my-domain/local_index,dst:remote_index

    除了精細存取控制以外,如果您還選擇使用限制性存取政策,政策則必須至少允許對 es:ESHttpGet 的存取權。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::123456789012:user/test-user" ] }, "Action": "es:ESHttpGet", "Resource": "arn:aws:es:region:account:domain/src-domain/*" } ] }
  3. 來源網域上的精細存取控制會評估請求:

    • 請求是否以有效的 IAM 或 HTTP 基本登入資料簽署?

    • 如果是這樣,使用者是否具備執行搜尋和存取資料的許可?

    如果請求只搜尋目的地網域上的資料 (例如 dest-alias:dest-index/_search),您只需要目的地網域上的許可。

    如果請求同時搜尋兩個網域上的資料 (例如 source-index,dest-alias:dest-index/_search),您需要兩個網域上的許可。

    在細微的存取控制中,除了相關索引的indices:admin/shards/search_shards標準readsearch權限之外,使用者還必須擁有權限。

  4. 來源網域會將請求傳遞至目的地網域。目的地網域會根據其網域存取政策評估此請求。您必須在目的地網域上包含 es:ESCrossClusterGet 許可:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": "es:ESCrossClusterGet", "Resource": "arn:aws:es:region:account:domain/dst-domain" } ] }

    確認已針對 /dst-domain (而不是 /dst-domain/*) 套用 es:ESCrossClusterGet 許可。

    不過,此最低政策只允許跨叢集搜尋。若執行其他操作 (例如為文件編製索引和執行標準搜尋),則需要額外的許可。建議在目的地網域上使用下列政策:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": [ "*" ] }, "Action": [ "es:ESHttp*" ], "Resource": "arn:aws:es:region:account:domain/dst-domain/*" }, { "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": "es:ESCrossClusterGet", "Resource": "arn:aws:es:region:account:domain/dst-domain" } ] }
    注意

    依預設,網域之間的所有跨叢集搜尋要求都會在傳輸中加密,做為 node-to-node 加密的一部分。

  5. 目的地網域會執行搜尋並將結果傳回至來源網域。

  6. 來源網域會將其自身結果 (如果有的話) 與來自目的地網域的結果加以結合,然後將其傳回給您。

  7. 建議針對測試請求使用 Postman

    • 在目的地網域上,為文件編製索引:

      POST https://dst-domain.us-east-1.es.amazonaws.com/books/_doc/1 { "Dracula": "Bram Stoker" }
    • 若要從來源網域查詢此索引,請在查詢內包含目的地網域的連線別名。

      GET https://src-domain.us-east-1.es.amazonaws.com/<connection_alias>:books/_search { ... "hits": [ { "_index": "source-destination:books", "_type": "_doc", "_id": "1", "_score": 1, "_source": { "Dracula": "Bram Stoker" } } ] }

      您可以在網域儀表板的 Connections (連線) 索引標籤上找到連線別名。

    • 如果在具有連線別名 cluster_bdomain-a -> domain-b 與具有連線別名 cluster_cdomain-a -> domain-c 之間設定連線,請搜尋 domain-adomain-bdomain-c,如下所示:

      GET https://src-domain.us-east-1.es.amazonaws.com/local_index,cluster_b:b_index,cluster_c:c_index/_search { "query": { "match": { "user": "domino" } } }

      回應

      { "took": 150, "timed_out": false, "_shards": { "total": 3, "successful": 3, "failed": 0, "skipped": 0 }, "_clusters": { "total": 3, "successful": 3, "skipped": 0 }, "hits": { "total": 3, "max_score": 1, "hits": [ { "_index": "local_index", "_type": "_doc", "_id": "0", "_score": 1, "_source": { "user": "domino", "message": "Lets unite the new mutants", "likes": 0 } }, { "_index": "cluster_b:b_index", "_type": "_doc", "_id": "0", "_score": 2, "_source": { "user": "domino", "message": "I'm different", "likes": 0 } }, { "_index": "cluster_c:c_index", "_type": "_doc", "_id": "0", "_score": 3, "_source": { "user": "domino", "message": "So am I", "likes": 0 } } ] } }

      如果您未選擇略過連線設定中無法使用的叢集,您搜尋的所有目的地叢集都必須可供搜尋要求使用,才能順利執行。否則,整個請求會失敗,即使其中一個網域無法使用,也不會傳回任何搜尋結果。

OpenSearch 儀表板

您可以透過與從單一網域相同的方式,從多個連線網域視覺化資料,但您必須使用 connection-alias:index 存取遠端索引時除外。因此,索引模式必須符合 connection-alias:index