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,不过两个数据中心都是可读的。
当Data Center 1不可用的时候,我们可以直接使用Data Center 2,无需切换,当Data Center 1恢复后,我们也无需回切,直接继续使用Data Center 2即可,当然需要重新建立两个数据中心的联系,以Data Center 2的数据为主。
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
建立集群的索引并建立联系
2.2 激活集群
可以通过命令激活也可以在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集群数据同步测试
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