教程:设置跨集群复制

编辑

使用本指南在两个数据中心中的集群之间设置跨集群复制 (CCR)。跨数据中心复制数据可带来多种好处

  • 将数据更靠近您的用户或应用程序服务器,以减少延迟和响应时间
  • 为您的关键任务应用程序提供容忍数据中心或区域故障的能力

在本指南中,您将学习如何

  • 配置具有领导者索引的远程集群
  • 在本地集群上创建跟随者索引
  • 创建自动跟随模式以自动跟随远程集群中定期创建的时间序列索引

您可以手动创建跟随者索引以复制远程集群上的特定索引,或配置自动跟随模式以复制滚动时间序列索引。

如果您想跨云中的集群复制数据,您可以在 Elasticsearch Service 上配置远程集群。然后,您可以跨集群搜索并设置跨集群复制。

先决条件

编辑

要完成本教程,您需要

  • 本地集群上的 manage 集群权限。
  • 两个集群上都具有包含跨集群复制的许可证。 激活免费的 30 天试用版
  • 远程集群上的一个索引,其中包含您要复制的数据。本教程使用示例电子商务订单数据集。 加载示例数据
  • 在本地集群中,所有具有 master节点角色 的节点也必须具有 remote_cluster_client 角色。本地集群还必须至少有一个节点同时具有数据角色和 remote_cluster_client 角色。协调复制的各个任务根据本地集群中具有 remote_cluster_client 角色的数据节点的数量进行扩展。

连接到远程集群

编辑

要将远程集群 (集群 A) 上的索引复制到本地集群 (集群 B),您需要在集群 B 上将集群 A 配置为远程集群。

ClusterA contains the leader index and ClusterB contains the follower index

要从 Kibana 中的堆栈管理配置远程集群

  1. 根据需要设置安全连接
  2. 从侧边导航中选择远程集群
  3. 指定 Elasticsearch 端点 URL,或远程集群 (ClusterA) 的 IP 地址或主机名,后跟传输端口(默认为 9300)。例如,cluster.es.eastus2.staging.azure.foundit.no:9400192.168.1.1:9300
API 示例

您还可以使用集群更新设置 API 添加远程集群

resp = client.cluster.put_settings(
    persistent={
        "cluster": {
            "remote": {
                "leader": {
                    "seeds": [
                        "127.0.0.1:9300"
                    ]
                }
            }
        }
    },
)
print(resp)
response = client.cluster.put_settings(
  body: {
    persistent: {
      cluster: {
        remote: {
          leader: {
            seeds: [
              '127.0.0.1:9300'
            ]
          }
        }
      }
    }
  }
)
puts response
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" 
          ]
        }
      }
    }
  }
}

指定远程集群中种子节点的主机名和传输端口。

您可以验证本地集群是否已成功连接到远程集群。

resp = client.cluster.remote_info()
print(resp)
response = client.cluster.remote_info
puts response
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 集群权限,以及领导者索引上的 monitorread 权限。

如果请求使用API 密钥 进行身份验证,则 API 密钥需要在本地集群上而不是远程集群上具有上述权限。

如果请求是代表其他用户发出,则身份验证用户必须在远程集群上具有 run_as 权限。

以下请求在远程集群上创建 remote-replication 角色

resp = client.security.put_role(
    name="remote-replication",
    cluster=[
        "read_ccr"
    ],
    indices=[
        {
            "names": [
                "leader-index-name"
            ],
            "privileges": [
                "monitor",
                "read"
            ]
        }
    ],
)
print(resp)
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 集群权限,以及跟随者索引上的 monitorreadwritemanage_follow_index 权限。

以下请求在本地集群上创建 remote-replication 角色

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)
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 的用户

resp = client.security.put_user(
    username="cross-cluster-user",
    password="l0ng-r4nd0m-p@ssw0rd",
    roles=[
        "remote-replication"
    ],
)
print(resp)
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. 选择包含要复制的领导者索引的集群 (ClusterA)。
  3. 输入领导者索引的名称,如果您正在遵循本教程,则为 kibana_sample_data_ecommerce
  4. 为您的跟随者索引输入一个名称,例如 follower-kibana-sample-data

Elasticsearch 使用远程恢复过程初始化跟随者,该过程将现有的 Lucene 段文件从领导者索引传输到跟随者索引。索引状态更改为暂停。远程恢复过程完成后,索引跟随开始,状态更改为活动

当您将文档索引到领导者索引中时,Elasticsearch 会在跟随者索引中复制这些文档。

The Cross-Cluster Replication page in Kibana
API 示例

您还可以使用创建跟随者 API 创建跟随者索引。创建跟随者索引时,必须引用远程集群和在远程集群中创建的领导者索引。

在启动跟随者请求时,响应会在远程恢复过程完成之前返回。要等待过程完成,请将 wait_for_active_shards 参数添加到您的请求中。

resp = client.ccr.follow(
    index="server-metrics-follower",
    wait_for_active_shards="1",
    remote_cluster="leader",
    leader_index="server-metrics",
)
print(resp)
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"
}

使用获取跟随者统计信息 API 检查复制的状态。

创建自动跟随模式以复制时间序列索引

编辑

您可以使用自动跟随模式 自动为滚动时间序列索引创建新的跟随者。每当远程集群上新索引的名称与自动跟随模式匹配时,就会将相应的跟随者索引添加到本地集群。请注意,只有在创建自动跟随模式后在远程集群上创建的索引才会自动跟随:即使远程集群上现有索引与模式匹配,也会被忽略。

自动跟随模式指定您要从中复制的远程集群,以及一个或多个索引模式,这些模式指定您要复制的滚动时间序列索引。

要从 Kibana 中的堆栈管理创建自动跟随模式

  1. 在侧边导航中选择跨集群复制,然后选择自动跟随模式选项卡。
  2. 为自动跟随模式输入一个名称,例如 beats
  3. 选择包含要复制的索引的远程集群,在示例方案中为集群 A。
  4. 输入一个或多个索引模式,以识别您要从远程集群复制的索引。例如,输入 metricbeat-* packetbeat-* 以自动为 Metricbeat 和 Packetbeat 索引创建跟随者。
  5. 输入follower-作为前缀,应用于跟随者索引的名称,以便您可以更轻松地识别复制的索引。

当远程集群上创建了与这些模式匹配的新索引时,Elasticsearch 会自动将其复制到本地跟随者索引。

The Auto-follow patterns page in Kibana
API 示例

使用创建自动跟随模式 API 配置自动跟随模式。

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)
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