写这篇文章,主要是目前公司要把ES从2.4.1升级到最新版本7.8,不过现在是7.9了,官方的文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html

由于从2.4.1跨很大基本的升级,所以不能平滑的升级了,只能重新搭建集群进行数据迁移,所以迁移数据是第一步,但是呢,2.4.1是可以支持多个type的,现在的新版已经不能支持多个type了,所以在迁移的过程中要将每一个type建立相应的索引,目前只是根据原先的type之间创建新的索引,还没考虑到业务的需求,这个可能需要重新设计索引。

本文主要针对在实际过程中遇到的几个问题进行阐述,第一步迁移的方案选择,第二怎么去迁移,第三对遇到的问题进行解决

一、迁移方案的选择

主要参考下这篇文章:https://www.jianshu.com/p/50ef4c9090f0

我个人觉得比较熟悉的方法选择三种:

一个是备份和还原,也就是说使用snapshot,官方的网址:https://www.elastic.co/guide/en/elasticsearch/reference/current/snapshot-restore.html

然后发现只能跨一个版本升级,并不不符合我目前的需求,所以排除这个方案。

第二个是使用elk的方式,使用logstash,我有另外一篇文章介绍这个的玩法:从0到1学会logstash的玩法(ELK)

logstash的官方文档:https://www.elastic.co/guide/en/logstash/current/index.html

这个方法确实可以实现迁移,但是对于不熟悉这个elk的童鞋来说有点难,因为刚开始接触,也不是那么的友好,所以我在这里并没有优先选择。

第三种方案就是采用elasticsearch的一个接口_reindex,这个方法很简单,官方文档也很详细,上手也比较快,所以选择了该方案,以前也没接触过,所以也要研究下吧,所以就有官方的文档:https://www.elastic.co/guide/en/elasticsearch/reference/7.9/docs-reindex.html,对英文不是很熟的童鞋完全可以搜索其他博客,很多博客都有详细的介绍,我也是看别人的博客,但是忘记网址了,然后再来看官网补充下,毕竟官网的是比较可信点。

二、迁移的语法

我们的需求是跨集群进行数据迁移,所以这里不说同集群的迁移,因为对于跨集群来说,同一个集群更简单。

第一步:配置新版es的参数,就是配置白名单,允许哪个集群可以reindex数据进来,在官网copy了一段,根据自己的实际情况进行修改就好,需要重启

reindex.remote.whitelist: "otherhost:9200, another:9200, 127.0.10.*:9200, localhost:*"

第二步:就是在新版的es上建立索引,设置好分片,副本(刚开始为0吧)等,因为自动创建的分片和副本都是1,所以自己先创建好索引比较好

第三步:直接配置啦,这里我就直接贴代码了,具体的介绍可以去看官网啦

curl -u user:password   -XPOST "http://ip_new:port/_reindex" -H 'Content-Type:application/json'  -d '  #这里的user,port,ip,password都是新集群的
{
"conflicts": "proceed",
"source": {
"remote": { #这是2.4.1的配置
"host": "http://ip:port/",
"username": "user",
"password": "password"
},
"index": "index_name_source", #2.4.1的要迁移的索引
"query": {
"term": {
"_type":"type_name" #查询单个type的数据
}
},
"size": 6000 #这个参数可以根据实际情况调整
},
"dest": {
"index": "index_name_dest", #这里是新es的索引名字
}
}'

好,很好,好了,那就跑起来,刚开始第一个小的索引跑起来没任何问题,刚开始以为就这么简单,后来索引大了,不合理的设计,就出现下面的问题了

三、遇到的问题和解决方案

我。。。这是神马设计,一个文档的id这么长id is too long, must be no longer than 512 bytes but was: 574;

因为在elasticsearch7.8中的id最长为512啦,可以看看这个:https://github.com/elastic/elasticsearch/pull/16036/commits/99052c3fef16d6192af0839558ce3dbf23aa148d

没啥不服气的吧,那怎么解决这个问题呢,id好像不好改吧,网上都说要自己写代码去重新缩短这个id的长度。好吧,感觉有点复杂了,我又去看reindex这个文档的,官方文档啦,原来还支持脚本呢,但是这里这个支持的脚本有点强大,比那个update_by_query的脚本强大,可以改id哦,

看到没,这些都可以修改,看到了希望有没有?接下我就修改迁移的代码啦:

curl -u user:password   -XPOST "http://ip_new:port/_reindex" -H 'Content-Type:application/json'  -d '  #这里的user,port,ip,password都是新集群的
{
"conflicts": "proceed",
"source": {
"remote": { #这是2..1的配置
"host": "http://ip:port/",
"username": "user",
"password": "password"
},
"index": "index_name_source",
"query": {
"term": {
"_type":"type_name" #查询单个type的数据
  }
},
"size": #这个参数可以根据实际情况调整
},
"dest": {
"index": "index_name_dest", #这里是新es的索引名字
},
"script": {
"source": "if (ctx._id.length()>512) {ctx._id = ctx._id.substring(0,511)}", #这里我简单粗暴,截断了,各位可以根据需求去改,这里和java的语法相似的
"lang": "painless"
}
}'

果然解决了问题,迁移数据没问题了,很好,非常好,但是总是不那么如意,当一个索引很大,3+个T的数据(吐槽下,什么鬼,原来的索引还只有6个分片,这个设计。。。)就会curl出问题了,出问题了,中途中断了,说是无法接收到网络数据:

curl: (56) Failure when receiving data from the peer  #这个问题网上很多人都问,但是都没解决方案,有人说这是bug

就这么认命了吗,每次跑了一半多,白干活了,这个错误也是真的没啥详细说明呀,有点惨,我想升级这个curl的版本,但是升级失败了

算了,没劲,那就换一个centos7.x的机器看看curl的版本吧,果然比这个高一些,那就换机器继续试试啦。果然没让我失望,没在出现这个问题了。好吧顺利的去迁移数据去了,不过那个size参数是可以调整的,太大了会报错的,要根据文档的大小*size,这个值在5-15M之间速度会比较快一些,我这也还没对比测试。

这里感谢各个写博客的博主,看了很多的博客,解决问题思路,但是没有记录下,现在也就记得这么多了,好久没写博客了,最近看了很多基础的书,果然出来混迟早是要还的,以前落下的基础知识,总要花费一个代价补回去的,也希望自己能够与各位童鞋一起学习进步,一直相信最好的学就是教会别人

elasticsearch跨集群数据迁移的更多相关文章

  1. elasticsearch7.5.0+kibana-7.5.0+cerebro-0.8.5集群生产环境安装配置及通过elasticsearch-migration工具做新老集群数据迁移

    一.服务器准备 目前有两台128G内存服务器,故准备每台启动两个es实例,再加一台虚机,共五个节点,保证down一台服务器两个节点数据不受影响. 二.系统初始化 参见我上一篇kafka系统初始化:ht ...

  2. 从零自学Hadoop(17):Hive数据导入导出,集群数据迁移下

    阅读目录 序 将查询的结果写入文件系统 集群数据迁移一 集群数据迁移二 系列索引 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephis ...

  3. 【Redis】集群数据迁移

    Redis通过对KEY计算hash,将KEY映射到slot,集群中每个节点负责一部分slot的方式管理数据,slot最大个数为16384. 在集群节点对应的结构体变量clusterNode中可以看到s ...

  4. Elasticsearch跨集群搜索(Cross Cluster Search)

    1.简介 Elasticsearch在5.3版本中引入了Cross Cluster Search(CCS 跨集群搜索)功能,用来替换掉要被废弃的Tribe Node.类似Tribe Node,Cros ...

  5. 从零自学Hadoop(16):Hive数据导入导出,集群数据迁移上

    阅读目录 序 导入文件到Hive 将其他表的查询结果导入表 动态分区插入 将SQL语句的值插入到表中 模拟数据文件下载 系列索引 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并 ...

  6. Elasticsearch多集群数据同步

    有时多个Elasticsearch集群避免不了要同步数据,网上查找了下数据同步工具还挺多,比较常用的有:elasticserach-dump.elasticsearch-exporter.logsta ...

  7. redis集群数据迁移txt版

    ./redis-trib.rb create --replicas 1 192.168.112.33:8001 192.168.112.33:8002 192.168.112.33:8003 192. ...

  8. redis集群数据迁移

    redis集群数据备份迁移方案 n  迁移环境描述及分析 当前我们面临的数据迁移环境是:集群->集群. 源集群: 源集群为6节点,3主3备 主 备 192.168.112.33:8001 192 ...

  9. 多es 集群数据迁移方案

    前言 加入新公司的第二个星期的星期二 遇到另一个项目需要技术性支持:验证es多集群的数据备份方案,需要我参与验证,在这个项目中需要关注到两个集群的互通性.es集群是部署在不同的k8s环境中,K8s环境 ...

随机推荐

  1. 对java程序员来说时间格式永远让人挠头来看Java Date Time 教程-时间测量

    在Java中,用System.currentTimeMillis()来测量时间最方便. 你要做的是在某些操作之前获取到时间,然后在这些操作之后你想要测量时间,算出时间差.下面是一个例子: long s ...

  2. linux 解压与压缩

    转http://www.cnblogs.com/eoiioe/archive/2008/09/20/1294681.html .tar 解包:tar xvf FileName.tar打包:tar cv ...

  3. 算法-利用队列实现逐行打印杨辉三角形的前n行

    分别打印二项式(a+b)^n展开项的系数,在程序中利用了一个队列,在输出上一行系数时,将下一行的系数预先放入队列中.在各行系数间插入0. void YANGVI(int n){ Queue q(n+) ...

  4. Lambda 表达式推演全过程

    Java 的 Lambda 表达式推演过程: 第一步:正常的类实现(外部实现),new一个对象,然后重写方法实现 public class TestLambda3 { public static vo ...

  5. asyncio系列之Lock实现

    import types import select import time import socket import functools import collections class Futur ...

  6. javascript 查找属性的过程

     当执行 一个对象赋值操作的时候  js引擎会怎样处理呢??? 例如  有个foo对象  ,要进行这个操作 foo.a=2 1, 首先会在foo对象中查找,如果不存在a属性,就会去原型链上面找,如果原 ...

  7. Git深入浅出使用教程:Git安装、远程控制、常用命令(全)

    一.软件安装 1.先安装[Git-2.24.1.2-64-bit.exe]软件.(官网下载的很慢,可以在百度云盘下载我的) 链接:https://pan.baidu.com/s/1uoIS9DWSBp ...

  8. 获取android手机的屏幕分辨率 android开发

    /** * 获取屏幕分辨率 */ private void getResolution() { // TODO Auto-generated method stub Display display = ...

  9. Linux下Vim常用操作

    linux下Vim的常用操作 linux ​ 首先\(ctrl+Alt+t\)打开小框框 ​ \(./\):相当于手机上的\(home\)键 ​ \(ls\):当前文件夹的东东 ​ \(mkdir\) ...

  10. LWPR

    Scriptable Render Pipeline https://docs.unity3d.com/Manual/ScriptableRenderPipeline.html     Unity轻量 ...