0


【DevOps】Elasticsearch 数据跨集群同步方案

跨集群同步 ES 数据,意味着您希望将一个 Elasticsearch 集群的数据实时或接近实时地复制到另一个集群。 这对于灾难恢复、地理位置分布、数据隔离等场景非常有用。我会详细讲解Elasticsearch 数据跨集群同步的几种方案,并结合示例代码和配置,帮助您更好地理解。

1、Elasticsearch Cross-Cluster Replication (CCR)

CCR 是 Elasticsearch 官方提供的跨集群复制解决方案,适用于需要实时或接近实时数据同步的场景。它允许您将一个集群中的索引复制到另一个集群,并保持数据同步。

1.1、优点
  • 实时同步: 数据更改会自动从领导者索引复制到追随者索引。
  • 易于配置: CCR 的配置相对简单,只需要在源集群和目标集群上进行少量配置即可。
  • 高性能: CCR 使用 Elasticsearch 的内部机制进行数据复制,性能优异。
1.2、缺点
  • 版本要求: 仅支持 Elasticsearch 6.7 及更高版本。
  • 网络延迟: 对网络延迟敏感,如果两个集群之间的网络延迟较高,可能会影响同步性能。
1.3、步骤
  • 启用 CCR:- 在源集群和目标集群的 elasticsearch.yml 文件中添加以下配置: xpack.security.enabled: truexpack.license.self_generated.type: trialxpack.ccr.enabled: true- 重启两个集群。
  • 创建 Follower Index:- 在目标集群上执行以下请求,创建 follower index 并指定要同步的 leader index: PUT <follower_index_name>{ "index": { "remote": { "name": "<remote_cluster_name>", "connection": { "hosts": ["<leader_cluster_host_1>:<port>", "<leader_cluster_host_2>:<port>"] } }, "leader_index": "<leader_index_name>" }}- 将 <follower_index_name> 替换为您要创建的 follower index 名称。- 将 <remote_cluster_name> 替换为源集群的名称 (在 elasticsearch.yml 中配置)。- 将 <leader_cluster_host_1>:<port> 等替换为源集群节点的主机名和端口。- 将 <leader_index_name> 替换为要同步的 leader index 名称。
  • 启动同步:- CCR 会自动启动同步过程。您可以使用以下 API 监控同步状态: GET /_ccr/stats
1.4、示例

假设您有两个集群:

cluster_A

(源集群) 和

cluster_B

(目标集群)。您希望将

cluster_A

上的索引

logs

同步到

cluster_B

启用 CCR:

  • cluster_Acluster_Belasticsearch.yml 文件中添加 CCR 配置 (如上所示)。

**创建 Follower Index (在

cluster_B

上执行):**

PUT logs_replica
{
  "index": {
    "remote": {
      "name": "cluster_A",
      "connection": {
        "hosts": ["cluster_A_host_1:9200", "cluster_A_host_2:9200"]
      }
    },
    "leader_index": "logs"
  }
}

** 监控同步状态:**

GET /_ccr/stats

2. Logstash 或其他 ETL 工具

Logstash 是一款开源的数据处理管道工具,可以用于收集、解析、转换和传输数据。您可以使用 Logstash 将数据从源 Elasticsearch 集群同步到目标 Elasticsearch 集群。

2.1、优点
  • 灵活性: Logstash 支持各种数据源和目标,并提供了丰富的插件,可以进行数据转换和过滤。
  • 增量同步: 可以配置 Logstash 进行增量数据同步,只同步自上次同步以来更改的数据。
2.2、缺点
  • 复杂性: Logstash 的配置和维护比 CCR 更复杂。
  • 性能: Logstash 会对源集群造成一定的性能影响。
2.3、步骤
  • 安装 Logstash: 下载并安装 Logstash。
  • 配置 Logstash: 创建一个 Logstash 配置文件,用于从源集群读取数据,并将其写入目标集群。例如:input { elasticsearch { hosts => ["<source_cluster_host_1>:<port>", "<source_cluster_host_2>:<port>"] index => "<source_index_name>" query => '{ "match_all": {} }' }}output { elasticsearch { hosts => ["<target_cluster_host_1>:<port>", "<target_cluster_host_2>:<port>"] index => "<target_index_name>" }}
  • 运行 Logstash: 使用创建的配置文件运行 Logstash。

3. Apache Kafka 或 RabbitMQ

Apache Kafka 和 RabbitMQ 是流行的消息队列系统,可以用于构建高吞吐量、低延迟的数据管道。您可以使用它们将数据从源 Elasticsearch 集群异步复制到目标 Elasticsearch 集群。

3.1、优点
  • 解耦: 消息队列可以解耦数据生产者和消费者,提高系统可伸缩性和可靠性。
  • 可靠性: 消息队列支持数据持久化,可以保证数据不丢失。
3.2、缺点
  • 复杂性: 使用消息队列进行数据同步需要额外的组件和配置,架构比较复杂。
3.3、步骤
  • 配置消息队列: 安装并配置 Apache Kafka 或 RabbitMQ。
  • 创建生产者: 在源集群上创建数据生产者,将数据写入消息队列。
  • 创建消费者: 在目标集群上创建数据消费者,从消息队列读取数据并将其写入 Elasticsearch。

3.4、示例 (使用 Kafka):

  • 配置 Kafka: 安装并配置 Kafka 集群。
  • 创建生产者 (Python):from kafka import KafkaProducerproducer = KafkaProducer(bootstrap_servers=['<kafka_broker_1>:<port>', '<kafka_broker_2>:<port>'])# 从 Elasticsearch 读取数据# ...# 将数据发送到 Kafka topicproducer.send('<topic_name>', data)
  • 创建消费者 (Python):from kafka import KafkaConsumerfrom elasticsearch import Elasticsearchconsumer = KafkaConsumer('<topic_name>', bootstrap_servers=['<kafka_broker_1>:<port>', '<kafka_broker_2>:<port>'])es = Elasticsearch(['<target_cluster_host_1>:<port>', '<target_cluster_host_2>:<port>'])for message in consumer: data = message.value # 将数据写入 Elasticsearch es.index(index='<target_index_name>', document=data)

4、使用 Reindex API 进行跨集群同步

Reindex API 主要用于重建索引,但它也可以用于跨集群复制数据。

4.1、优点
  • 简单易用: Reindex API 使用方便,只需要指定源集群、目标集群和索引名称即可。
  • 支持版本间迁移: 可以使用 Reindex API 将数据从较低版本的 Elasticsearch 集群迁移到较高版本的集群。
  • 灵活的数据转换: 可以在 reindex 过程中使用脚本对数据进行转换。
4.2、缺点
  • 非实时同步: Reindex API 是一次性操作,不会实时同步数据。
  • 性能: 对于大型索引,reindex 操作可能需要很长时间,并且会对源集群和目标集群造成一定的性能影响。
4.3、步骤
  • 准备目标集群: 确保目标集群已经创建,并且具有足够的磁盘空间来存储数据。
  • 执行 Reindex API 请求: 在目标集群上执行以下请求,将数据从源集群复制到目标集群:POST _reindex{ "source": { "remote": { "host": "<source_cluster_host>:<port>", "username": "<username>", "password": "<password>" }, "index": "<source_index_name>" }, "dest": { "index": "<target_index_name>" }}- 将 <source_cluster_host>:<port> 替换为源集群节点的主机名和端口。- 将 <username><password> 替换为具有足够权限访问源集群的用户的凭据。- 将 <source_index_name> 替换为要复制的索引名称。- 将 <target_index_name> 替换为目标索引名称。
  • 监控 reindex 进度: 可以使用以下 API 监控 reindex 操作的进度:GET _tasks/<task_id>- 将 <task_id> 替换为 reindex 操作返回的任务 ID。
4.4、示例

假设您要将名为 "source_index" 的索引从运行在

192.168.1.10:9200

的源集群复制到名为 "target_index" 的目标集群,可以使用以下命令:

curl -X POST "localhost:9200/_reindex" -H 'Content-Type: application/json' -d'
{
  "source": {
    "remote": {
      "host": "https://192.168.1.10:9200",
      "username": "user",
      "password": "password" 
    },
    "index": "source_index"
  },
  "dest": {
    "index": "target_index"
  }
}
'

注意事项:

  • 确保目标集群中不存在与源集群索引同名的索引,否则数据可能会被覆盖。
  • 为了提高 reindex 性能,可以调整 reindex API 的参数,例如 slices(用于并行处理)和 batch_size(用于控制每次批量处理的文档数量)。

总结

选择哪种 ES 数据跨集群同步方案取决于您的具体需求,例如数据实时性要求、数据量、集群版本、网络环境等。 CCR 是官方推荐的解决方案,配置简单,性能优异,但需要 Elasticsearch 6.7 以上版本。 Logstash 和消息队列提供了更高的灵活性和可定制性,但配置和维护更复杂。使用 Reindex API 进行跨集群同步是一种简单直接的方法,但它不适用于需要实时同步数据的场景。 对于需要定期同步数据或进行一次性数据迁移的情况,Reindex API 是一个不错的选择。


本文转载自: https://blog.csdn.net/benshu_001/article/details/139727321
版权归原作者 Coder加油! 所有, 如有侵权,请联系我们删除。

“【DevOps】Elasticsearch 数据跨集群同步方案”的评论:

还没有评论