1. 背景
由于业务需求,我们需要将 Elasticsearch 从 2.4.1 版本升级到7.10.2 版本。在这个过程中,需要对数据进行迁移,以确保新版本的Elasticsearch 能够正确地索引和查询数据。为此,我们采用了logstash-2.4.1来实现数据的迁移,迁移过程中遇见了需要升级logstash的插件问题。
2. 测试环境
操作系统:CentOS7.9(需要可以连接外网)
源 Elasticsearch 版本:2.4.1
目标 Elasticsearch 版本:7.10.2
迁移工具:logstash-2.4.1
3. 插件升级过程
3.1 环境准备
下载 Logstash:
下载地址:https://www.elastic.co/cn/downloads/past-releases/logstash-2-4-1
上传到目标主机并解压 Logstash:
tar xf logstash-2.4.1.tar.gz
进入解压后的目录可以看到以下内容:
创建 Logstash 配置文件:
sudo vi es_to_es_all.conf
3.2 配置 Logstash
在es_to_es_all.conf文件中,添加以下内容:
input{
elasticsearch{
# 源端ES地址。
hosts => ["http://localhost:9200"]
# 安全集群配置登录用户名密码。
user => "xxxxxx"
password => "xxxxxx"
# 需要迁移的索引列表,多个索引以英文以逗号(,)分隔。
index => "kibana_sample_data_*"
# 以下三项保持默认即可,包含线程数和迁移数据大小和Logstash JVM配置相关。
docinfo=>true
slices => 5
size => 5000
}
}
filter {
# 去掉一些Logstash自己加的字段。
mutate {
remove_field => ["@timestamp", "@version"]
}
}
output{
elasticsearch{
# 目标端ES地址,可在Elasticsearch实例的基本信息页面获取。
hosts => ["http://es-cn-zvp2m4bko0009****.elasticsearch.aliyuncs.com:9200"]
# 安全集群配置登录用户名密码。
user => "elastic"
password => "xxxxxx"
# 目标端索引名称,以下配置表示索引与源端保持一致。
index => "%{[@metadata][_index]}"
# 目标端索引type,以下配置表示索引类型与源端保持一致。
document_type => "%{[@metadata][_type]}"
# 目标端数据的id,如果不需要保留原id,可以删除以下这行,删除后性能会更好。
document_id => "%{[@metadata][_id]}"
ilm_enabled => false
manage_template => false
}
}
3.3 运行过程报错
启动 Logstash:
./bin/logstash -f es_to_es_all.conf
网上查了很多文件有关如下报错的信息都没找到解决方法。
[406] {"error":"Content-Type header [text/plain; charset=UTF-8] is not supported","status":406} {:class=>"Elasticsearch::Transport::Transport::Errors::NotAcceptable",
后来,就先尝试把读取到的数据是否可以打印到前台
可见logstash读取打印到前台是没有问题
可以判断出logstash可以从ES2.4.1版本读取到数据,但是写入不到ES7.10.2版本中,我们又更新了配置文件
启动又出现报错
仔细核对之后,发现报错指向这个插件logstash-output-elasticsearch
通过在官网查看,发现是需要升级该插件到6.2.5版本及以上
https://www.elastic.co/guide/en/logstash/2.4/plugins-outputs-elasticsearch.html
3.4 插件升级
根据斟酌情况,插件版本不宜过高,也不宜过低,就选择了该插件6.3.0版本
网上查找的插件下载地址(有问题,因为在安装插件的过程中logstash会校验该插件,需要与https://gems.ruby-china.com 里面的数据进行校验,校验不通过也不行,这也是为什么需要与外网相通的原因):https://github.com/logstash-plugins/logstash-output-elasticsearch/releases/tag/v6.3.0
可以用的下载地址在https://rubygems.org/gems/logstash-output-elasticsearch/versions/6.3.0-java
下载之后,文件如下
上传到主机安装插件
bin/logstash-plugin install --no-verifylogstash-output-elasticsearch-6.3.0-java.gem
Installing logstash-output-jdbc
Error Bundler::HTTPError, retrying 1/10
Could not fetch specs from https://rubygems.org/
Error Bundler::HTTPError, retrying 2/10
Could not fetch specs from https://rubygems.org/
...............
原因 默认的https://rubygems.org/在国内不可用,需要修改为 https://gems.ruby-china.com/
gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/
安装gem软件
yum install rubygems -y
查看gem源
gem sources -l
再次执行安装命令
bin/logstash-plugin install --no-verifylogstash-output-elasticsearch-6.3.0-java.gem
4. 总结
通过使用 Logstash-2.4.1 插件,成功实现了跨大版本 Elasticsearch 数据的迁移。在新版本的 Elasticsearch 中,我们可以看到迁移后的数据已被正确索引,从而确保了业务的正常运行。