本文描述问题及解决方法同样适用于 腾讯云 Elasticsearch Service(ES)。
另外使用到:腾讯云 云服务器(Cloud Virtual Machine,CVM)
将自建ES集群无缝迁移到云上,同时进行跨版本升级并支持回退,这种情况通常需要确保业务在最短的停机时间内完成。以往的方案或多或少都有限制:
迁移方案 | 支持回退 | 在线 | 友商云迁移 | 版本限制 | 迁移方式 | 迁移速度 |
---|---|---|---|---|---|---|
Snapshot 快照 | 支持,数据不一致 | 否 | 支持 | 源端<=目标 | 复制 | 快 |
在线融合 | 否 | 是 | 不支持 | 源端<=目标 | 剪切 | 很快 |
Logstash | 支持,数据不一致 | 否 | 支持 | 无要求 | 复制 | 慢 |
基于当下这种局面,就衍生了一个新的需求:有没有一种方案,既是又是还是呢?
答案是:有的。
通过将应用流量引导至网关,请求会被同步发送至自建 ES 和 云上 ES。网关负责记录并按顺序在云上 ES 中重新执行所有写入请求。从而实现了无缝的双集群写入,达成了平稳且安全的数据迁移。
说明:
网关和控制台都需要使用 ES 作为元数据存储,可以复用源端 ES,也可以在网关&控制台服务器部署一个单机 ES(推荐)。
该步骤不是必要操作,可以复用其他ES集群作为网关&控制台的元数据集群。
curl -sSL http://get.infini.cloud | bash -s -- -p console -d /usr/local/service/console
安装完成后应用包位于 /usr/local/service/console
cd /usr/local/service/console
./console-linux-amd64 -service install
./console-linux-amd64 -service start
启动成功后使用浏览器打开链接进行控制台注册,默认监听 9000 端口,假如安装控制台的服务器公网 ip 是100.100.100.100,那么访问地址就为:100.100.100.100:9000
自动初始化系统索引和模板的基本设置:
第三步需要妥善保管好凭据密钥,点击👁️🗨️符号可使凭据密钥可见:
也可在最后一步一键下载配置的信息:
curl -sSL http://get.infini.cloud | bash -s -- -p gateway -d /usr/local/service/gateway
安装完成后应用包位于 /usr/local/service/gateway
下载网关双写配置:
cd /usr/local/service/gateway
# 移走默认配置
mv gateway.yml gateway.yml.bak
# 下载双写网关配置
wget https://tools-release-1253240642.cos.ap-shanghai.myqcloud.com/elasticsearch/config/gateway.yml
修改以下配置项:
主集群配置项
从集群配置项
元数据集群配置项
需要关闭auto_start
,默认是开启的:
cd /usr/local/service/gateway
./gateway-linux-amd64 -service install
./gateway-linux-amd64 -service start
编辑实例名称:
注册完成后可以在实例管理界面看到网关实例:
编辑集群名称:
编辑集群名称:
完成在集群管理界面可以看到集群总览:
点击开启:
为了方便测试,我们将网关也当做集群注册到控制台:
编辑集群名称:
在网关进行如下操作:
# 创建索引
PUT gateway-test
# 插入文档
PUT gateway-test/doc/1
{
"name": "dy"
}
PUT gateway-test/doc/2
{
"name": "dy2"
}
# 更新文档
PUT gateway-test/doc/2
{
"name": "dy_update"
}
# 删除文档
DELETE gateway-test/doc/2
# 删除
DELETE gateway-test
在云上 ES 验证同步结果:
测试完成,需要将增量备份关闭,因为接下来正式使用双写网关之前需要做一次全量同步:
说明:
由于我们已经使用快照已经做了全量+增量,所以现在切换流量到下次做最后一次快照增量备份不会产生太多增量数据,不会导致数据大量堆积,影响同步效率。
切换流量
业务指向目前还没有连接网关,所以正式切换时需要修改业务代码连接配置,当前流量流向如下图:
业务将原先指向源端集群的 IP 配置,改为双写网关的 IP:18000,代码逻辑无需做任何修改。由于此时双写网关的增量同步还未开启,写入切换后,云上集群的数据同步会先堆积在消息队列中。切换后业务流向如下图:
关闭嗅探
各 SDK 关闭嗅探参考:https://cloud.tencent.com/document/product/845/19538
业务切换到双写网关后,还需要使用快照做最后一次恢复,同样参考:Elasticsearch 迁移方案
最后一次快照增量完成之后,则可以开启双写网关的增量同步,开启之后,双写网关会将堆积的写入操作回放到云上 ES 集群,直到数据追平,真正做到实时同步:
可以通过队列消费情况来观察是否同步完成:
生产和消费offset一致则说明同步完成:
如果需要保留回退方案,可以继续将业务指向双写网关。然后在网关配置中交换主备集群并重启网关,这样,云上的 ES 集群将成为主集群,而原先的老集群将变为备份集群。如果业务遇到问题,可以随时回退,因为数据是一致的。一旦所有验证都完成,就可以直接将业务 IP 切换到云上。
双写网关方案成功解决了过去许多难以应对的问题,如跨云 ES 服务的在线迁移、传统迁移方案缺乏实时回退能力等。甚至支持从高版本到低版本的在线迁移,尽管这样的迁移不支持快照,只能通过 Logstash 等工具实现。由于 Logstash 仅支持全量同步,这将使双写网关的消息堆积压力增大。尽管如此,也聊胜于无,未来迁移方案必将会朝实时化的趋势发展。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。