ES 跨集群复制 Cross-Cluster Replication

2021-03-22 10:19:32 浏览数 (1)

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

0 人点赞