功能简介
跨集群复制(Cross-Cluster Replication, CCR)是搜索引擎的一项重要功能,旨在实现不同集群间的实时数据同步和复制。这一功能对于构建全球分布式系统、提高数据高可用性、支持灾备恢复、以及优化跨地域数据访问具有显著意义。
天翼云云搜索服务在OpenSearch和Elasticsearch都实现了跨集群复制功能。
核心原理
跨集群复制通过在不同的搜索集群之间建立主从索引关系来实现数据同步。一个集群中的索引被设为主索引(Leader Index),负责处理数据的写入操作。其他集群中的从索引(Follower Index)则持续地从主索引中拉取数据更新,确保各个集群的数据保持一致。
这种主从架构确保了写入操作的集中管理,减少了数据冲突的风险,并维护了数据的一致性。
应用场景与优势
分布式系统
在更大范围内部署应用时,CCR 允许数据在不同地理位置的集群之间同步。通过在用户所在地附近的集群中设置从索引,可以显著降低访问延迟,提高查询性能。例如,上海的主集群可以通过 CCR 将数据复制到北京的从集群,从而优化这些地区用户的体验。
灾备恢复
CCR 是构建高可用性和灾备系统的关键。主集群若发生故障,其他地理位置的从集群可以迅速接管,保障业务连续性。这种多集群架构能够有效防范单点故障,提高系统的可靠性。
多集群架构的弹性扩展
随着业务的增长,CCR 支持将数据和查询负载分布到多个集群中,从而实现弹性扩展。通过部署多个从集群来分担查询压力,可以提升系统的整体性能,满足更高的用户需求和并发请求。
读写分离
在高性能场景下,CCR 支持读写分离。主集群专注于处理数据写入,而从集群则负责处理查询请求。这种架构优化了查询性能,尤其适合需要高频读写操作的大数据环境。
技术实现与应用
部署跨集群复制需要在集群之间建立信任关系,并配置索引的复制参数。搜索引擎提供了灵活的 API 和管理工具,方便用户管理和控制跨集群复制任务。通过这些工具,用户可以轻松启动或暂停复制、调整复制策略,以及根据业务需求灵活配置复制模式。
CCR 支持实时复制和按需复制,用户可以根据具体需求选择适合的复制方式。无论是对数据的一致性要求极高的场景,还是需要降低跨集群网络传输开销的场景,CCR 都能提供可靠的解决方案。
操作示例
在leader集群插入数据:
PUT ccr_test
{"settings": {"number_of_shards": 1,"number_of_replicas": 0}}
POST ccr_test/_doc/
{
"name": "robert",
"age": 30,
"gender": "male"
}
在follower集群配置:
PUT _cluster/settings
{
"persistent": {
"cluster": {
"remote": {
"leader-cluster": {
"seeds": ["ip:9300"]
}
}
}
}
}
开始复制:
PUT _opendistro/_replication/follower-01/_start
{
"remote_cluster":"leader-cluster",
"remote_index": "ccr_test"
}
返回:
{
"acknowledged" : true
}
在leader集群插入数据:
POST ccr_test/_doc/
{
"name": "jane",
"age": 25,
"gender": "female"
}
再插一条:
POST ccr_test/_doc/
{
"name": "Jane",
"age": 18,
"gender": "female"
}
在follower集群查询,数据会自动复制过去:
GET follower-01/_search
返回结果:
{
"took" : 435,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 2,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "follower-01",
"_type" : "_doc",
"_id" : "WU_QFo4BrTIYgmxo8ErH",
"_score" : 1.0,
"_source" : {
"name" : "robert",
"age" : 30,
"gender" : "male"
}
},
{
"_index" : "follower-01",
"_type" : "_doc",
"_id" : "pGiQF44BZY5qpm7NPGR_",
"_score" : 1.0,
"_source" : {
"name" : "Jane",
"age" : 18,
"gender" : "female"
}
}
]
}
}