チュートリアル:クロスクラスター複製の設定

このガイドを使用して、2つのデータセンター間でクロスクラスター複製(CCR)を設定します。データセンター間でデータを複製することには、いくつかの利点があります:

  • ユーザーやアプリケーションサーバーにデータを近づけ、レイテンシーと応答時間を短縮します
  • ミッションクリティカルなアプリケーションに、データセンターや地域の障害に耐える耐障害性を提供します

このガイドでは、次のことを学びます:

  • リーダーインデックスを持つリモートクラスターを構成する
  • ローカルクラスターにフォロワーインデックスを作成する
  • リモートクラスターで定期的に作成される時系列インデックスを自動的にフォローするための自動フォローパターンを作成する

特定のインデックスをリモートクラスターで複製するために手動でフォロワーインデックスを作成することも、ロールイング時系列インデックスを複製するために自動フォローパターンを構成することもできます。

クラウド内のクラスター間でデータを複製したい場合は、Elasticsearch Serviceでリモートクラスターを構成する。その後、クラスター間で検索することができ、クロスクラスター複製を設定できます。

前提条件

このチュートリアルを完了するには、次のものが必要です:

  • ローカルクラスターでのmanageクラスター特権。
  • クロスクラスター複製を含む両方のクラスターのライセンス。無料の30日間トライアルを有効にする
  • 複製したいデータを含むリモートクラスターのインデックス。このチュートリアルでは、サンプルのeCommerce注文データセットを使用します。サンプルデータをロードする
  • ローカルクラスターでは、master ノードロールを持つすべてのノードが、remote_cluster_clientロールも持っている必要があります。ローカルクラスターには、データロールとremote_cluster_clientロールの両方を持つノードが少なくとも1つ必要です。複製の調整に関する個別のタスクは、ローカルクラスター内のremote_cluster_clientロールを持つデータノードの数に基づいてスケールします。

リモートクラスターに接続する

リモートクラスター(クラスターA)のインデックスをローカルクラスター(クラスターB)に複製するには、クラスターBでクラスターAをリモートとして構成します。

クラスターAにはリーダーインデックスがあり、クラスターBにはフォロワーインデックスがあります

Kibanaのスタック管理からリモートクラスターを構成するには:

  • 1. 必要に応じてセキュア接続を設定します。
  • 2. サイドナビゲーションからリモートクラスターを選択します。
  • 3. ElasticsearchエンドポイントURL、またはリモートクラスターのIPアドレスまたはホスト名(ClusterA)を指定し、その後にトランスポートポート(デフォルトは9300)を続けます。たとえば、cluster.es.eastus2.staging.azure.foundit.no:9400または192.168.1.1:9300です。

APIの例

クラスター更新設定APIを使用してリモートクラスターを追加することもできます:

Python

  1. resp = client.cluster.put_settings(
  2. persistent={
  3. "cluster": {
  4. "remote": {
  5. "leader": {
  6. "seeds": [
  7. "127.0.0.1:9300"
  8. ]
  9. }
  10. }
  11. }
  12. },
  13. )
  14. print(resp)

Ruby

  1. response = client.cluster.put_settings(
  2. body: {
  3. persistent: {
  4. cluster: {
  5. remote: {
  6. leader: {
  7. seeds: [
  8. '127.0.0.1:9300'
  9. ]
  10. }
  11. }
  12. }
  13. }
  14. }
  15. )
  16. puts response

Js

  1. const response = await client.cluster.putSettings({
  2. persistent: {
  3. cluster: {
  4. remote: {
  5. leader: {
  6. seeds: ["127.0.0.1:9300"],
  7. },
  8. },
  9. },
  10. },
  11. });
  12. console.log(response);

コンソール

  1. PUT /_cluster/settings
  2. {
  3. "persistent" : {
  4. "cluster" : {
  5. "remote" : {
  6. "leader" : {
  7. "seeds" : [
  8. "127.0.0.1:9300"
  9. ]
  10. }
  11. }
  12. }
  13. }
  14. }
リモートクラスター内のシードノードのホスト名とトランスポートポートを指定します。

ローカルクラスターがリモートクラスターに正常に接続されていることを確認できます。

Python

  1. resp = client.cluster.remote_info()
  2. print(resp)

Ruby

  1. response = client.cluster.remote_info
  2. puts response

Js

  1. const response = await client.cluster.remoteInfo();
  2. console.log(response);

コンソール

  1. GET /_remote/info

APIの応答は、ローカルクラスターがクラスターエイリアスleaderを持つリモートクラスターに接続されていることを示しています。

コンソール-結果

  1. {
  2. "leader" : {
  3. "seeds" : [
  4. "127.0.0.1:9300"
  5. ],
  6. "connected" : true,
  7. "num_nodes_connected" : 1,
  8. "max_connections_per_cluster" : 3,
  9. "initial_connect_timeout" : "30s",
  10. "skip_unavailable" : true,
  11. "mode" : "sniff"
  12. }
  13. }
ローカルクラスターが接続されているリモートクラスター内のノードの数。

クロスクラスター複製のための特権の構成

クロスクラスター複製ユーザーは、リモートクラスターとローカルクラスターで異なるクラスターおよびインデックス特権を必要とします。次のリクエストを使用して、ローカルおよびリモートクラスターで別々のロールを作成し、必要なロールを持つユーザーを作成します。

リモートクラスター

リーダーインデックスを含むリモートクラスターでは、クロスクラスター複製ロールはread_ccrクラスター特権を必要とし、リーダーインデックスにmonitorおよびread特権が必要です。

リクエストがAPIキーで認証されている場合、APIキーはローカルクラスターに対して上記の特権を必要とします。

リクエストが他のユーザーの代理で発行される場合、認証ユーザーはリモートクラスターでrun_as特権を持っている必要があります。

次のリクエストは、リモートクラスターにremote-replicationロールを作成します:

Python

  1. resp = client.security.put_role(
  2. name="remote-replication",
  3. cluster=[
  4. "read_ccr"
  5. ],
  6. indices=[
  7. {
  8. "names": [
  9. "leader-index-name"
  10. ],
  11. "privileges": [
  12. "monitor",
  13. "read"
  14. ]
  15. }
  16. ],
  17. )
  18. print(resp)

Js

  1. const response = await client.security.putRole({
  2. name: "remote-replication",
  3. cluster: ["read_ccr"],
  4. indices: [
  5. {
  6. names: ["leader-index-name"],
  7. privileges: ["monitor", "read"],
  8. },
  9. ],
  10. });
  11. console.log(response);

コンソール

  1. POST /_security/role/remote-replication
  2. {
  3. "cluster": [
  4. "read_ccr"
  5. ],
  6. "indices": [
  7. {
  8. "names": [
  9. "leader-index-name"
  10. ],
  11. "privileges": [
  12. "monitor",
  13. "read"
  14. ]
  15. }
  16. ]
  17. }

ローカルクラスター

フォロワーインデックスを含むローカルクラスターでは、remote-replicationロールはmanage_ccrクラスター特権と、フォロワーインデックスに対するmonitorreadwrite、およびmanage_follow_index特権を必要とします。

次のリクエストは、ローカルクラスターにremote-replicationロールを作成します:

Python

  1. resp = client.security.put_role(
  2. name="remote-replication",
  3. cluster=[
  4. "manage_ccr"
  5. ],
  6. indices=[
  7. {
  8. "names": [
  9. "follower-index-name"
  10. ],
  11. "privileges": [
  12. "monitor",
  13. "read",
  14. "write",
  15. "manage_follow_index"
  16. ]
  17. }
  18. ],
  19. )
  20. print(resp)

Js

  1. const response = await client.security.putRole({
  2. name: "remote-replication",
  3. cluster: ["manage_ccr"],
  4. indices: [
  5. {
  6. names: ["follower-index-name"],
  7. privileges: ["monitor", "read", "write", "manage_follow_index"],
  8. },
  9. ],
  10. });
  11. console.log(response);

コンソール

  1. POST /_security/role/remote-replication
  2. {
  3. "cluster": [
  4. "manage_ccr"
  5. ],
  6. "indices": [
  7. {
  8. "names": [
  9. "follower-index-name"
  10. ],
  11. "privileges": [
  12. "monitor",
  13. "read",
  14. "write",
  15. "manage_follow_index"
  16. ]
  17. }
  18. ]
  19. }

各クラスターでremote-replicationロールを作成した後、ユーザーの作成または更新APIを使用して、ローカルクラスターでユーザーを作成し、remote-replicationロールを割り当てます。たとえば、次のリクエストは、remote-replicationロールをcross-cluster-userという名前のユーザーに割り当てます:

Python

  1. resp = client.security.put_user(
  2. username="cross-cluster-user",
  3. password="l0ng-r4nd0m-p@ssw0rd",
  4. roles=[
  5. "remote-replication"
  6. ],
  7. )
  8. print(resp)

Js

  1. const response = await client.security.putUser({
  2. username: "cross-cluster-user",
  3. password: "l0ng-r4nd0m-p@ssw0rd",
  4. roles: ["remote-replication"],
  5. });
  6. console.log(response);

コンソール

  1. POST /_security/user/cross-cluster-user
  2. {
  3. "password" : "l0ng-r4nd0m-p@ssw0rd",
  4. "roles" : [ "remote-replication" ]
  5. }

このユーザーはローカルクラスターでのみ作成する必要があります。

特定のインデックスを複製するためのフォロワーインデックスを作成する

フォロワーインデックスを作成する際には、リモートクラスターとリモートクラスター内のリーダーインデックスを参照します。

Kibanaのスタック管理からフォロワーインデックスを作成するには:

  • 1. サイドナビゲーションでクロスクラスター複製を選択し、フォロワーインデックスタブを選択します。
  • 2. 複製したいリーダーインデックスを含むクラスター(クラスターA)を選択します。
  • 3. リーダーインデックスの名前を入力します。このチュートリアルに従っている場合はkibana_sample_data_ecommerceです。
  • 4. フォロワーインデックスの名前をfollower-kibana-sample-dataのように入力します。

Elasticsearchは、リモートリカバリプロセスを使用してフォロワーを初期化し、リーダーインデックスからフォロワーインデックスに既存のLuceneセグメントファイルを転送します。インデックスの状態は一時停止に変更されます。リモートリカバリプロセスが完了すると、インデックスのフォローが開始され、状態がアクティブに変更されます。

リーダーインデックスにドキュメントをインデックスすると、Elasticsearchはフォロワーインデックスにドキュメントを複製します。

Kibanaのクロスクラスター複製ページ

APIの例

フォロワー作成APIを使用してフォロワーインデックスを作成することもできます。フォロワーインデックスを作成する際には、リモートクラスターとリモートクラスター内で作成したリーダーインデックスを参照する必要があります。

フォロワーリクエストを開始すると、リモートリカバリプロセスが完了する前に応答が返されます。プロセスが完了するのを待つには、リクエストにwait_for_active_shardsパラメータを追加します。

Python

  1. resp = client.ccr.follow(
  2. index="server-metrics-follower",
  3. wait_for_active_shards="1",
  4. remote_cluster="leader",
  5. leader_index="server-metrics",
  6. )
  7. print(resp)

Js

  1. const response = await client.ccr.follow({
  2. index: "server-metrics-follower",
  3. wait_for_active_shards: 1,
  4. remote_cluster: "leader",
  5. leader_index: "server-metrics",
  6. });
  7. console.log(response);

コンソール

  1. PUT /server-metrics-follower/_ccr/follow?wait_for_active_shards=1
  2. {
  3. "remote_cluster" : "leader",
  4. "leader_index" : "server-metrics"
  5. }

get follower stats APIを使用して、複製の状態を確認します。

時系列インデックスを複製するための自動フォローパターンを作成する

自動フォローパターンを使用して、ロールイング時系列インデックスの新しいフォロワーを自動的に作成します。リモートクラスターの新しいインデックスの名前が自動フォローパターンと一致するたびに、対応するフォロワーインデックスがローカルクラスターに追加されます。自動フォローパターンが作成された後にリモートクラスターで作成されたインデックスのみが自動的にフォローされることに注意してください:パターンに一致しても、リモートクラスターに既存のインデックスは無視されます。

自動フォローパターンは、複製元のリモートクラスターと、複製したいロールイング時系列インデックスを指定する1つ以上のインデックスパターンを指定します。

Kibanaのスタック管理から自動フォローパターンを作成するには:

  • 1. サイドナビゲーションでクロスクラスター複製を選択し、自動フォローパターンタブを選択します。
  • 2. 自動フォローパターンの名前をbeatsのように入力します。
  • 3. 複製したいインデックスを含むリモートクラスターを選択します。この例ではクラスターAです。
  • 4. リモートクラスターから複製したいインデックスを特定する1つ以上のインデックスパターンを入力します。たとえば、metricbeat-* packetbeat-*を入力してMetricbeatおよびPacketbeatインデックスのフォロワーを自動的に作成します。
  • 5. フォロワーインデックスの名前に適用する接頭辞としてfollower-を入力し、複製されたインデックスをより簡単に識別できるようにします。

これらのパターンに一致する新しいインデックスがリモートで作成されると、Elasticsearchはそれらをローカルフォロワーインデックスに自動的に複製します。

Kibanaの自動フォローパターンページ

APIの例

自動フォローパターン作成APIを使用して自動フォローパターンを構成します。

Python

  1. resp = client.ccr.put_auto_follow_pattern(
  2. name="beats",
  3. remote_cluster="leader",
  4. leader_index_patterns=[
  5. "metricbeat-*",
  6. "packetbeat-*"
  7. ],
  8. follow_index_pattern="{{leader_index}}-copy",
  9. )
  10. print(resp)

Js

  1. const response = await client.ccr.putAutoFollowPattern({
  2. name: "beats",
  3. remote_cluster: "leader",
  4. leader_index_patterns: ["metricbeat-*", "packetbeat-*"],
  5. follow_index_pattern: "{{leader_index}}-copy",
  6. });
  7. console.log(response);

コンソール

  1. PUT /_ccr/auto_follow/beats
  2. {
  3. "remote_cluster" : "leader",
  4. "leader_index_patterns" :
  5. [
  6. "metricbeat-*",
  7. "packetbeat-*"
  8. ],
  9. "follow_index_pattern" : "{{leader_index}}-copy"
  10. }
新しいMetricbeatインデックスを自動的にフォローします。
新しいPacketbeatインデックスを自動的にフォローします。
フォロワーインデックスの名前は、リーダーインデックスの名前に-copyのサフィックスを追加することによって導出されます。