前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ES 跨集群复制 Cross-Cluster Replication

ES 跨集群复制 Cross-Cluster Replication

原创
作者头像
雨夜v1
修改2021-03-22 10:19:32
2.5K0
修改2021-03-22 10:19:32
举报
文章被收录于专栏:雨夜-Elasticsearch成长专栏

1.前言

Elasticsearch(后面统称ES) cross-cluster replication (后面统称CCR)是ES 6.5的一个测试特性,是ES 6.7的的一个全局高可用特性。CCR允许不同的索引复制到一个或多个ES 集群中。将索引复制到其他ES集群,可以解决多个用例,包括跨数据中心高可用(HA),灾难恢复(DR)和CDN样体系结构,最终实现ES集群的高可用。

CCR其实就是一个leader/fllower架构,leader可以进行任何操作,但是fllower则不能进行写入操作,fllower的mapping和setting也是跟随leader的变化而变化,无需进行单独的修改。CCR没有所谓的冲突监测,如果要独立fllower,只需要暂定同步,关闭索引,取消对leader的关注,重新打开索引即可。

CCR双向复制

通过双向复制,我们建立了一个CCR体系结构,当集群和数据中心不可用和ES的文档不可变时(不执行任何更新操作)。可以直接使用灾备集群的索引,实现ES跨数据中心双活。具体如下图

建立两个数据中心,应用正常情况写入Data Center 1,不过两个数据中心都是可读的。

ES 双数据中心部署架构图
ES 双数据中心部署架构图

当Data Center 1不可用的时候,我们可以直接使用Data Center 2,无需切换,当Data Center 1恢复后,我们也无需回切,直接继续使用Data Center 2即可,当然需要重新建立两个数据中心的联系,以Data Center 2的数据为主。

Data Center 1异常图
Data Center 1异常图

2.ES CCR实践

2.1 集群介绍

为了测试我们CCR功能我们需要搭建两个ES集群,并建立集群的高可用。如下是DC1集群和DC2集群的ip和和端口。

DC1

DC2

192.168.248.231:9201 192.168.248.232:9201 192.168.248.233:9201

192.168.248.231:9202 192.168.248.232:9202 192.168.248.233:9202

ES版本:6.8.5

建立集群的索引并建立联系

ES 双数据中心架构图
ES 双数据中心架构图

2.2 激活集群

可以通过命令激活也可以在kibana里面激活

Kibana激活:

Kibana激活图
Kibana激活图

通过命令激活:

代码语言:txt
复制
POST _xpack/license/start_trial?acknowledge=true

2.3 定义远程集群

代码语言:txt
复制
PUT _cluster/settings
{
  "persistent": {
    "cluster.remote": {
      "remote_cluster": {
        "seeds": [
          "192.168.248.231:9302"
        ]
      }
    }
  }
}

也可以通过kibana实现ccr连接创建

定义远程集群
定义远程集群

2.4 创建双向复制索引

建立索引logs-dc1,以DC1为源集群,复制到目标集群DC2。

代码语言:txt
复制
# Create a logs index in DC1 
PUT /logs-dc1
# Create a logs index in DC2 
PUT /logs-dc2

2.5 复制初始化

在DC2执行如下语句:

代码语言:javascript
复制
PUT /logs-dc1/_ccr/follow { "remote_cluster" : "DC1-cluster", "leader_index" : "logs-dc1" }

在DC1执行如下语句:

代码语言:javascript
复制
PUT /logs-dc2/_ccr/follow { "remote_cluster" : "DC2-cluster", "leader_index" : "logs-dc2" }

这样简单的CCR集群就建立了,ES CCR还能批量对同类型的索引进行同步,具体参数如下:

代码语言:javascript
复制
PUT /_ccr/auto_follow/my_auto_follow_pattern
{
  "remote_cluster" : "remote_cluster",
  "leader_index_patterns" :
  [
    "leader_index*"
  ],
  "follow_index_pattern" : "{{leader_index}}-follower",
  "max_read_request_operation_count" : 1024,
  "max_outstanding_read_requests" : 16,
  "max_read_request_size" : "1024k",
  "max_write_request_operation_count" : 32768,
  "max_write_request_size" : "16k",
  "max_outstanding_write_requests" : 8,
  "max_write_buffer_count" : 512,
  "max_write_buffer_size" : "512k",
  "max_retry_delay" : "10s",
  "read_poll_timeout" : "30s"
}

详细参考:

https://www.elastic.co/guide/en/elasticsearch/reference/6.8/ccr-put-auto-follow-pattern.html

2.6 定义别名写入

CCR可以对跨集群的ES的不同索引建立一样的别名,如下:

跨集群别名建立
跨集群别名建立

在DC1 对logs-dc1建立别名logs:

代码语言:javascript
复制
POST /_aliases { "actions" : [ { "add" : { "index" : "logs-dc1", "alias" : "logs", "is_write_index" : true } } ] }

在DC2对logs-dc2建立别名logs:

代码语言:javascript
复制
POST /_aliases { "actions" : [ { "add" : { "index" : "logs-dc2", "alias" : "logs", "is_write_index" : true } } ] }

这样应用就可以在不同的集群通过logs这个别名访问不同索引。

2.7 CCR集群数据同步测试

CCR集群数据同步
CCR集群数据同步

DC1:

代码语言:javascript
复制
POST /logs/_doc { "test" : "log message in DC1" }

DC2:

代码语言:javascript
复制
GET /logs/_search

结果如下:

代码语言:shell
复制
{ "took" : 1, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : 1, "max_score" : 1.0, "hits" : [ { "_index" : "logs-dc1", "_type" : "_doc", "_id" : "6MmX0G0B6tqJE8tQWGk4", "_score" : 1.0, "_source" : { "message" : "log message in DC1" } } ] } }

测试DC2复制到DC1

DC2:

代码语言:javascript
复制
POST /logs/_doc { "test" : "log message in DC2" }

DC1:

代码语言:javascript
复制
GET /logs/_search

结果如下:

代码语言:javascript
复制
{ "took" : 1, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : 2, "max_score" : 1.0, "hits" : [ { "_index" : "logs-dc1", "_type" : "_doc", "_id" : "6MmX0G0B6tqJE8tQWGk4", "_score" : 1.0, "_source" : { "message" : "log message in DC1" } }, { <strong>"_index" : "logs-dc2",</strong> "_type" : "_doc", "_id" : "iACS0G0Ba60KYTfVc8Jb", "_score" : 1.0, "_source" : { "test" : "log message in DC2" } } ] } }

2.8 CCR集群管理

2.8.1检查索引的复制状况

代码语言:javascript
复制
GET ccr_test/_ccr/stats
GET /<index>/_ccr/info

2.8.2 暂停集群复制

代码语言:javascript
复制
POST /follower_index/_ccr/pause_follow

2.8.3 恢复集群复制

代码语言:javascript
复制
POST /follower_index/_ccr/resume_follow
{
  "max_read_request_operation_count" : 1024,
  "max_outstanding_read_requests" : 16,
  "max_read_request_size" : "1024k",
  "max_write_request_operation_count" : 32768,
  "max_write_request_size" : "16k",
  "max_outstanding_write_requests" : 8,
  "max_write_buffer_count" : 512,
  "max_write_buffer_size" : "512k",
  "max_retry_delay" : "10s",
  "read_poll_timeout" : "30s"
}

2.8.4 删除ccr集群复制信息

代码语言:javascript
复制
POST /<follower_index>/_ccr/unfollow

3.总结

1.ES 跨集群复制(CCR)技术必须满足如下两个条件方能够使用:A.ES必须大于6.6版本以上;B. ES7.0一下版本索引需要设置soft_delete属性;

2.ES 跨集群复制(CCR)技术无法做到在CRUD场景下的双活,在主机房异常的情况下,灾备机房既可以提供有损服务;

3.目前业界比较完善的双活方案应该是腾讯的三机房部署(采用zone的方案+隐藏的master节点),本公司也有这种方案,但是这个方案强依赖于跨机房的高速网络通道。

4.参考文献

https://www.elastic.co/guide/en/elasticsearch/reference/6.8/ccr-apis.html

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.前言
    • CCR双向复制
    • 2.ES CCR实践
      • 2.1 集群介绍
        • 2.2 激活集群
          • Kibana激活:
          • 通过命令激活:
        • 2.3 定义远程集群
          • 也可以通过kibana实现ccr连接创建
        • 2.4 创建双向复制索引
          • 2.5 复制初始化
            • 2.6 定义别名写入
              • 2.7 CCR集群数据同步测试
                • 测试DC2复制到DC1
              • 2.8 CCR集群管理
                • 2.8.1检查索引的复制状况
                • 2.8.2 暂停集群复制
                • 2.8.3 恢复集群复制
                • 2.8.4 删除ccr集群复制信息
            • 3.总结
            • 4.参考文献
            相关产品与服务
            Elasticsearch Service
            腾讯云 Elasticsearch Service(ES)是云端全托管海量数据检索分析服务,拥有高性能自研内核,集成X-Pack。ES 支持通过自治索引、存算分离、集群巡检等特性轻松管理集群,也支持免运维、自动弹性、按需使用的 Serverless 模式。使用 ES 您可以高效构建信息检索、日志分析、运维监控等服务,它独特的向量检索还可助您构建基于语义、图像的AI深度应用。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档