随着腾讯云 ES 集群稳定性越来越高、产品体验越来越好。有越来越多的外部客户希望将自建的 ES 集群迁移到腾讯云上来。本文将介绍一种腾讯云 ES 在业界独有的业务不停服无感知的迁移方案:在线融合迁移方案。本方案目前已经迁移了上百套客户自建 ES 集群上云。下面将结合我们在给客户迁移过程中总结出的宝贵经验,来详细介绍在线融合迁移技术方案的基本原理、核心优势、迁移步骤和注意事项。
从图中我们可以看出以上四种迁移方案都有一个共同的特点,那就是都需要业务停服,即都属于离线迁移。离线迁移最大的痛点就是迁移期间业务需要停止写入,且迁移流程非常繁琐,工作量巨大。对于一些核心的业务集群,客户几乎不可能接受任何时刻的停服操作。因此对于负责迁移的同学来说就急需一种平滑的、业务无感知的、高可用的迁移技术方案。这便是腾讯云 ES 在线融合迁移技术方案要解决的问题。
如云上 ES 当前提供的最高版本号是7.14.2,因此如果自建集群版本号大于7.14.2,则无法通过在线融合方案迁移;主要原因是云上低版本的集群节点无法加入高版本的自建集群中。另外对于版本号,最好是两个集群大版本号一致,例如自建版本是6.4.6,则云上优先选择6.8.2,自建版本是7.5.2,云上优先选择7.10.1。
自建 ES 集群上不能安装有云上集群不存在的插件
在迁移之前需要先在自建集群节点上执行如下 API 来查看自建集群上都安装了哪些插件。
curl http://127.0.0.1:9200/_cat/plugins
如果有发现安装了云上不存在的插件则会使得云上 ES 集群节点融合后,分片分配失败导致集群状态异常问题。下图4是云上 ES 集群支持安装的插件列表。
1. 腾讯云 CVM 自建 ES 集群迁移到腾讯云 ES:
由于腾讯云 ES 集群采用了跨租户弹性网卡直接打通了 ES 集群 VPC 和客户 VPC 网络环境,因此对于腾讯云 CVM 自建的 ES 集群,只需要使用自建集群所在的 VPC在云 ES 控制台购买集群即可实现网络双向互通。如果自建集群和腾讯云 ES 集群不在同一个地域,则可以采用云上云联网或者对等连接方案进行打通网络。
2. IDC 自建 ES 集群迁移到腾讯云 ES:
如果客户的自建 ES 集群是在自己的 IDC 机房或者是其他云厂商云服务器中,则可以通过专线方式打通两边的网络。两个集群网络打通后可以通过在云上集群节点上至下 telnet 自建 ip 9300方式进行验证。
默认情况下,腾讯云 ES 集群会随机生成一个固定格式固定长度的字符串作为集群的名称,即 elasticsearch.yml 配置文件中的 cluster.name,如 cluster.name: "es-cohesszwr"(此集群 ID 配置名为虚构)。
而如果需要和自建集群进行融合,则必须要保证两个集群的 cluster.name 相同才可以。由于是让云上集群去加入自建集群,因此需要保证云上集群的集群名称与自建集群相同。自定义云上集群配置名需要开通白名单支持,开白后会看到如下图所示的填写项。如果集群创建出来后没有设置自定义的集群名称,可以找腾讯云 ES 迁移同学后台处理。
在线融合迁移基本步骤
在线融合迁移的过程需要客户的运维同学和腾讯云ES团队的迁移同学密切配合才能完成,由于 ES 在7.0版本优化了 Master 选主逻辑,因此7.0以下的版本和7.0以上的版本需要分别采用不同融合策略。下面介绍下不同版本迁移的基本步骤和差异。
7.0以下版本迁移
7.0以下版本的迁移是指客户自建 ES 集群版本和腾讯云 ES 集群版本都是7.0以下的版本,如客户版本是6.4.5,云上版本为6.8.2。
结合我们的测试情况来看,当数据迁移完成两个集群分离后,自建的 ES 集群会出现 Red 情况,主要是由于索引都迁移到了云上,而自建集群上只有索引的元信息,因此会出现索引无法分配的情况,这也是集群分离后自建集群 Red 的原因。
通常这种情况下客户会选择删除这些索引以让集群恢复 Green。如果这时候再次将两个集群融合来迁移剩余索引的话,由于是通过全量重启云上集群节点来加入自建集群,因此融合后会以自建集群上当选 Master 上的集群元数据为准。因此一旦融合成功,就会把自建集群的元数据同步给云上集群节点,这时候就会直接删除云上第一次融合迁移过去的索引,从而导致之前迁移的索引数据全部丢失。这个风险的根本原因就是我们第一次分离后将自建集群上 Red 的索引删除了,而这些删除的索引都会记录在自建集群的元数据里,在一个叫索引坟墓的地方。融合后会同步这些元数据给云上集群。详情可参考官方文档 Index tombstones。
客户端开启嗅探 Sniff 功能是为了能够让 Client 端自动发现集群侧 ES 节点的动态变更。云上 ES 是通过 PrivateLink 打通的客户侧 VPC 和云上集群 VPC 网络,如果融合后客户端将访问配置切换到云上后,同时保持开启了嗅探功能,就会出现嗅探到的节点 IP 访问不同的情况,从而导致 Client 端大量的超时请求,影响业务使用。客户端报错信息可能如下:
NoNodeAvailableException[None of the configured nodes are available: [{#transport#-1}{VTss4h8SRsCpP6EW5PoLxxxrQ}{192.168.106.xxx}{192.168.106.xxx:9300}] ]at org.elasticsearch.client.transport.TransportClientNodesService.ensureNodesAreAvailable(TransportClientNodesService.java:347) at org.elasticsearch.client.transport.TransportClientNodesService.execute(TransportClientNodesService.java:245) at org.elasticsearch.client.transport.TransportProxyClient.execute(TransportProxyClient.java:59) ......
因此为了保障融合迁移方案对业务的透明和平滑,需要在融合前检查客户端是否开启了 Sniff 嗅探,如果开启需关闭此功能。不同语言客户端接入云上 ES 集群方式可以参考腾讯云 ES 官方文档 通过客户端访问集群。