Elasticsearch 双活部署:高可用性解决方案
Elasticsearch 双活部署:高可用性解决方案
简介
背景和目的
通过Elasticsearch集群双活的部署方式,提高Elasticsearch集群的可用性和容错性,保证数据的一致性和可靠性,降低业务中断的风险,特制订本文档。
使用范围
本文档适用于所有高可用需求的Elasticsearch集群。
Elasticsearch 双活部署
主备架构
本方案采用CCR进行主备切换,CCR即跨集群复制,是一种能够实现数据迁移、数据备份、降低访问延迟的高可用解决方案。跨集群复制采用的是一个主备的架构模型。在主集群中创建一系列leader索引,在备集群中通过主动Pull方式复制数据到follower索引中,且follower索引为只读索引。
业务写入主集群中,同时索引进行CCR复制到备集群。
使用前提
- 在follower集群设置远程集群信息指向leader集群。
- Leader、follower 集群都启用白金license。
- 主备Elasticsearch集群统一为6.5版本或者统一为7.17.9版本。
- Elasticsearch 6.8.5版本中,leader index 必须开启 soft_deletes。
- CCR同步机制是通过Lucene底层的soft_delete来实现的。因此需要确保leader索引是开启soft_delete属性的,7.0版本之后索引的soft_delete属性是默认开启的,7.0版本之前是默认关闭的。因此如果是使用如6.8.2等较早版本作为CCR的Leader集群,则需要在创建索引时手动开启soft_delete属性,或者在索引模版中进行开启。另外soft_delete属性为static setting,不支持通过index/_settings进行动态修改,如果需要对存量的索引开启soft_delete,则必须进行reindex操作
操作步骤
follower集群创建leader集群连接
follower集群需要与leader集群建立连接,并对follower索引进行初始化,follower索引只有在执行完初始化工作后才能接受查询和数据同步操作。follower的初始化可以理解为是leader索引的全量同步,即 “远程恢复过程”。该过程是通过全量拷贝leader索引主分片上的数据到follower集群上进行恢复。因此远程恢复是一个网络IO密集型的操作,主要工作就是将leader索引上的所有的Lucene的segment文件全量拷贝到follower集群上,然后进行恢复,有点类似于snapshot的恢复机制。默认情况下,一次Recovery请求会同时拉取5个1MB的segment文件块,且默认速度为40mb/s,可通过如下参数进行调整,详细信息可参考官方文档(https://www.elastic.co/guide/en/elasticsearch/reference/6.8/ccr-settings.html)
curl -u${username}:${password}-X PUT "http://${follower_url}:9200/_cluster/settings?pretty" -H 'Content-Type: application/json' -d'
{
"persistent": {
"cluster": {
"remote": {
"leader_cluster": {
"seeds": [
"${leader_url}:9300"
]
}
}
}
}
}'
参数解释:
- ${username}:follower集群用户
- ${password}:follower集群密码
- ${follower_url}:follower集群地址
- ${leader_url}:leader集群地址
查看集群连接状态
用于观察主备集群连接是否正常
curl -X GET ${username}:${password}
"https://${follower_url}:9200/_remote/info?pretty"
参数解释:
- ${username}:follower集群用户
- ${password}:follower集群密码
- ${follower_url}:follower集群地址
CCR 数据同步
CCR的数据同步是分片维度的。即当一个follower索引创建时,follower索引上的每个主分片会定期拉取leader索引分片的更新数据。也就是说,follower索引的主分片个数必须要和leader索引的主分片个数保持一致。这样能够保障在leader索引上的所有写操作都能够被复制到follower索引中,这些写操作包括create、update、delete文档等
采用两种模式进行索引同步:一对一模式和自动匹配模式(Auto-follow patterns)。
- 通过一对一模式将leader集群现有索引进行同步。
curl -u${username}:${password}
-X PUT "http://${follower_url}:9200/${follower_index}/_ccr/follow?pretty"
-H 'Content-Type: application/json' -d'
{
"remote_cluster" : "leader_cluster",
"leader_index" : "${leader_index}",
}'
参数解释:
${username}:follower集群用户
${password}:follower集群密码
${follower_url}:follower集群地址
${leader_index}: leader集群需要同步的索引
通过自动匹配模式将leader集群日增索引进行同步。
curl -u${username}:${password}
-X PUT "http://${follower_url}:9200/_ccr/auto_follow/${pattern_name}?pretty" -H 'Content-Type: application/json' -d'
{
"remote_cluster" : "leader_cluster",
"leader_index_patterns" : ["autoindex*","autotest*"],
"follow_index_pattern" : "copy_{{leader_index}}",
}'
参数解释:
- ${username}:follower集群用户
- ${password}:follower集群密码
- ${follower_url}:follower集群地址
- ${pattern_name}: 创建规则名
- leader_index_patterns: leader集群日增索引通配符名称匹配
- follow_index_pattern:follower集群日增同步索引以copy_前缀创建
添加别名(6.8.5)
因6.8.5版本缺陷别名不会通过CCR同步,需批量给索引添加别名
curl -u${username}:${password}
-X PUT "http://${follower_url}:9200/${follower_index}/_alias/${alias}
参数解释:
- ${username}:follower集群用户
- ${password}:follower集群密码
- ${follower_url}:follower集群地址
- ${follower_index}: follower索引
- ${alias}: 需要添加的别名
Elasticsearch CCR 监控方案
CCR monitor
通过countAPI实时获取leader索引与follower索引的文档总数,再做文档一致性对比以监控CCR集群索引文档同步情况。
Elasticsearch 索引激活
架构说明
当主集群不可用时,通过将follower集群索引激活,保证业务正常写入备集群来实现Elasticsearch集群主备切换
删除 follower 集群自动匹配模式规则
curl -u${username}:${password}-X DELETE
"http://${follower_url}:9200/_ccr/auto_follow/${pattern_name}"
参数解释:
- ${username}:follower集群用户
- ${password}:follower集群密码
- ${follower_url}:follower集群地址
- ${pattern_name}:需要删除的auto-pattern名字
将follower索引切换为普通索引
# 暂停follow
curl -u${username}:${password}-X POST
"http://${follower_url}:9200/${follower_index}/_ccr/pause_follow"
# close索引
curl -u${username}:${password}-X POST "http://${follower_url}:9200/
${follower_index}/_close"
# unfollow
curl -u${username}:${password}-X POST "http://${follower_url}:9200/
${follower_index}/_ccr/unfollow"
# open索引
curl -u${username}:${password}-X POST "http://${follower_url}:9200/
${follower_index}/_open"
参数解释:
- ${username}:follower集群用户
- ${password}:follower集群密码
- ${follower_url}:follower集群地址
- ${follower_index}:需要操作的follower索引