チュートリアル:クロスクラスター複製の設定
このガイドを使用して、2つのデータセンター間でクロスクラスター複製(CCR)を設定します。データセンター間でデータを複製することには、いくつかの利点があります:
- ユーザーやアプリケーションサーバーにデータを近づけ、レイテンシーと応答時間を短縮します
- ミッションクリティカルなアプリケーションに、データセンターや地域の障害に耐える耐障害性を提供します
このガイドでは、次のことを学びます:
- リーダーインデックスを持つリモートクラスターを構成する
- ローカルクラスターにフォロワーインデックスを作成する
- リモートクラスターで定期的に作成される時系列インデックスを自動的にフォローするための自動フォローパターンを作成する
特定のインデックスをリモートクラスターで複製するために手動でフォロワーインデックスを作成することも、ロールイング時系列インデックスを複製するために自動フォローパターンを構成することもできます。
クラウド内のクラスター間でデータを複製したい場合は、Elasticsearch Serviceでリモートクラスターを構成する。その後、クラスター間で検索することができ、クロスクラスター複製を設定できます。
前提条件
このチュートリアルを完了するには、次のものが必要です:
- ローカルクラスターでの
manage
クラスター特権。 - クロスクラスター複製を含む両方のクラスターのライセンス。無料の30日間トライアルを有効にする。
- 複製したいデータを含むリモートクラスターのインデックス。このチュートリアルでは、サンプルのeCommerce注文データセットを使用します。サンプルデータをロードする。
- ローカルクラスターでは、
master
ノードロールを持つすべてのノードが、remote_cluster_client
ロールも持っている必要があります。ローカルクラスターには、データロールとremote_cluster_client
ロールの両方を持つノードが少なくとも1つ必要です。複製の調整に関する個別のタスクは、ローカルクラスター内のremote_cluster_client
ロールを持つデータノードの数に基づいてスケールします。
リモートクラスターに接続する
リモートクラスター(クラスターA)のインデックスをローカルクラスター(クラスターB)に複製するには、クラスターBでクラスターAをリモートとして構成します。
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
resp = client.cluster.put_settings(
persistent={
"cluster": {
"remote": {
"leader": {
"seeds": [
"127.0.0.1:9300"
]
}
}
}
},
)
print(resp)
Ruby
response = client.cluster.put_settings(
body: {
persistent: {
cluster: {
remote: {
leader: {
seeds: [
'127.0.0.1:9300'
]
}
}
}
}
}
)
puts response
Js
const response = await client.cluster.putSettings({
persistent: {
cluster: {
remote: {
leader: {
seeds: ["127.0.0.1:9300"],
},
},
},
},
});
console.log(response);
コンソール
PUT /_cluster/settings
{
"persistent" : {
"cluster" : {
"remote" : {
"leader" : {
"seeds" : [
"127.0.0.1:9300"
]
}
}
}
}
}
リモートクラスター内のシードノードのホスト名とトランスポートポートを指定します。 |
ローカルクラスターがリモートクラスターに正常に接続されていることを確認できます。
Python
resp = client.cluster.remote_info()
print(resp)
Ruby
response = client.cluster.remote_info
puts response
Js
const response = await client.cluster.remoteInfo();
console.log(response);
コンソール
GET /_remote/info
APIの応答は、ローカルクラスターがクラスターエイリアスleader
を持つリモートクラスターに接続されていることを示しています。
コンソール-結果
{
"leader" : {
"seeds" : [
"127.0.0.1:9300"
],
"connected" : true,
"num_nodes_connected" : 1,
"max_connections_per_cluster" : 3,
"initial_connect_timeout" : "30s",
"skip_unavailable" : true,
"mode" : "sniff"
}
}
ローカルクラスターが接続されているリモートクラスター内のノードの数。 |
クロスクラスター複製のための特権の構成
クロスクラスター複製ユーザーは、リモートクラスターとローカルクラスターで異なるクラスターおよびインデックス特権を必要とします。次のリクエストを使用して、ローカルおよびリモートクラスターで別々のロールを作成し、必要なロールを持つユーザーを作成します。
リモートクラスター
リーダーインデックスを含むリモートクラスターでは、クロスクラスター複製ロールはread_ccr
クラスター特権を必要とし、リーダーインデックスにmonitor
およびread
特権が必要です。
リクエストがAPIキーで認証されている場合、APIキーはローカルクラスターに対して上記の特権を必要とします。
リクエストが他のユーザーの代理で発行される場合、認証ユーザーはリモートクラスターでrun_as
特権を持っている必要があります。
次のリクエストは、リモートクラスターにremote-replication
ロールを作成します:
Python
resp = client.security.put_role(
name="remote-replication",
cluster=[
"read_ccr"
],
indices=[
{
"names": [
"leader-index-name"
],
"privileges": [
"monitor",
"read"
]
}
],
)
print(resp)
Js
const response = await client.security.putRole({
name: "remote-replication",
cluster: ["read_ccr"],
indices: [
{
names: ["leader-index-name"],
privileges: ["monitor", "read"],
},
],
});
console.log(response);
コンソール
POST /_security/role/remote-replication
{
"cluster": [
"read_ccr"
],
"indices": [
{
"names": [
"leader-index-name"
],
"privileges": [
"monitor",
"read"
]
}
]
}
ローカルクラスター
フォロワーインデックスを含むローカルクラスターでは、remote-replication
ロールはmanage_ccr
クラスター特権と、フォロワーインデックスに対するmonitor
、read
、write
、およびmanage_follow_index
特権を必要とします。
次のリクエストは、ローカルクラスターにremote-replication
ロールを作成します:
Python
resp = client.security.put_role(
name="remote-replication",
cluster=[
"manage_ccr"
],
indices=[
{
"names": [
"follower-index-name"
],
"privileges": [
"monitor",
"read",
"write",
"manage_follow_index"
]
}
],
)
print(resp)
Js
const response = await client.security.putRole({
name: "remote-replication",
cluster: ["manage_ccr"],
indices: [
{
names: ["follower-index-name"],
privileges: ["monitor", "read", "write", "manage_follow_index"],
},
],
});
console.log(response);
コンソール
POST /_security/role/remote-replication
{
"cluster": [
"manage_ccr"
],
"indices": [
{
"names": [
"follower-index-name"
],
"privileges": [
"monitor",
"read",
"write",
"manage_follow_index"
]
}
]
}
各クラスターでremote-replication
ロールを作成した後、ユーザーの作成または更新APIを使用して、ローカルクラスターでユーザーを作成し、remote-replication
ロールを割り当てます。たとえば、次のリクエストは、remote-replication
ロールをcross-cluster-user
という名前のユーザーに割り当てます:
Python
resp = client.security.put_user(
username="cross-cluster-user",
password="l0ng-r4nd0m-p@ssw0rd",
roles=[
"remote-replication"
],
)
print(resp)
Js
const response = await client.security.putUser({
username: "cross-cluster-user",
password: "l0ng-r4nd0m-p@ssw0rd",
roles: ["remote-replication"],
});
console.log(response);
コンソール
POST /_security/user/cross-cluster-user
{
"password" : "l0ng-r4nd0m-p@ssw0rd",
"roles" : [ "remote-replication" ]
}
このユーザーはローカルクラスターでのみ作成する必要があります。
特定のインデックスを複製するためのフォロワーインデックスを作成する
フォロワーインデックスを作成する際には、リモートクラスターとリモートクラスター内のリーダーインデックスを参照します。
Kibanaのスタック管理からフォロワーインデックスを作成するには:
- 1. サイドナビゲーションでクロスクラスター複製を選択し、フォロワーインデックスタブを選択します。
- 2. 複製したいリーダーインデックスを含むクラスター(クラスターA)を選択します。
- 3. リーダーインデックスの名前を入力します。このチュートリアルに従っている場合は
kibana_sample_data_ecommerce
です。 - 4. フォロワーインデックスの名前を
follower-kibana-sample-data
のように入力します。
Elasticsearchは、リモートリカバリプロセスを使用してフォロワーを初期化し、リーダーインデックスからフォロワーインデックスに既存のLuceneセグメントファイルを転送します。インデックスの状態は一時停止に変更されます。リモートリカバリプロセスが完了すると、インデックスのフォローが開始され、状態がアクティブに変更されます。
リーダーインデックスにドキュメントをインデックスすると、Elasticsearchはフォロワーインデックスにドキュメントを複製します。
APIの例
フォロワー作成APIを使用してフォロワーインデックスを作成することもできます。フォロワーインデックスを作成する際には、リモートクラスターとリモートクラスター内で作成したリーダーインデックスを参照する必要があります。
フォロワーリクエストを開始すると、リモートリカバリプロセスが完了する前に応答が返されます。プロセスが完了するのを待つには、リクエストにwait_for_active_shards
パラメータを追加します。
Python
resp = client.ccr.follow(
index="server-metrics-follower",
wait_for_active_shards="1",
remote_cluster="leader",
leader_index="server-metrics",
)
print(resp)
Js
const response = await client.ccr.follow({
index: "server-metrics-follower",
wait_for_active_shards: 1,
remote_cluster: "leader",
leader_index: "server-metrics",
});
console.log(response);
コンソール
PUT /server-metrics-follower/_ccr/follow?wait_for_active_shards=1
{
"remote_cluster" : "leader",
"leader_index" : "server-metrics"
}
get follower stats APIを使用して、複製の状態を確認します。
時系列インデックスを複製するための自動フォローパターンを作成する
自動フォローパターンを使用して、ロールイング時系列インデックスの新しいフォロワーを自動的に作成します。リモートクラスターの新しいインデックスの名前が自動フォローパターンと一致するたびに、対応するフォロワーインデックスがローカルクラスターに追加されます。自動フォローパターンが作成された後にリモートクラスターで作成されたインデックスのみが自動的にフォローされることに注意してください:パターンに一致しても、リモートクラスターに既存のインデックスは無視されます。
自動フォローパターンは、複製元のリモートクラスターと、複製したいロールイング時系列インデックスを指定する1つ以上のインデックスパターンを指定します。
Kibanaのスタック管理から自動フォローパターンを作成するには:
- 1. サイドナビゲーションでクロスクラスター複製を選択し、自動フォローパターンタブを選択します。
- 2. 自動フォローパターンの名前を
beats
のように入力します。 - 3. 複製したいインデックスを含むリモートクラスターを選択します。この例ではクラスターAです。
- 4. リモートクラスターから複製したいインデックスを特定する1つ以上のインデックスパターンを入力します。たとえば、
metricbeat-* packetbeat-*
を入力してMetricbeatおよびPacketbeatインデックスのフォロワーを自動的に作成します。 - 5. フォロワーインデックスの名前に適用する接頭辞としてfollower-を入力し、複製されたインデックスをより簡単に識別できるようにします。
これらのパターンに一致する新しいインデックスがリモートで作成されると、Elasticsearchはそれらをローカルフォロワーインデックスに自動的に複製します。
APIの例
自動フォローパターン作成APIを使用して自動フォローパターンを構成します。
Python
resp = client.ccr.put_auto_follow_pattern(
name="beats",
remote_cluster="leader",
leader_index_patterns=[
"metricbeat-*",
"packetbeat-*"
],
follow_index_pattern="{{leader_index}}-copy",
)
print(resp)
Js
const response = await client.ccr.putAutoFollowPattern({
name: "beats",
remote_cluster: "leader",
leader_index_patterns: ["metricbeat-*", "packetbeat-*"],
follow_index_pattern: "{{leader_index}}-copy",
});
console.log(response);
コンソール
PUT /_ccr/auto_follow/beats
{
"remote_cluster" : "leader",
"leader_index_patterns" :
[
"metricbeat-*",
"packetbeat-*"
],
"follow_index_pattern" : "{{leader_index}}-copy"
}
新しいMetricbeatインデックスを自動的にフォローします。 | |
新しいPacketbeatインデックスを自動的にフォローします。 | |
フォロワーインデックスの名前は、リーダーインデックスの名前に-copy のサフィックスを追加することによって導出されます。 |