问题1:我现在集群是:5.X、6.X、7.X,要不要升级?
问题2:版本跨度这么大,如何升级?
7月6日,读者凌晨 00:30 留言:“怎么不出升级的文章呢?
需求比较迫切,所以,就有了今天的文章。
我们系统得敲一遍,让大家明白如何升级。
Elasticsearch 版本迭代历史如下:
Elasticsearch 的特点就是一个字快!
速度快,PB级别数据全文检索秒级响应,这是用户群体大的根因,不展开论述。
版本更新快,几乎每个月都更新一个小版本,大版本基本2年左右升级一次。
所以,市面上的各家公司在使用 Elasticsearch 过程中,都有自己的版本选型。根据我个人的调研和不完全观察,当前 1.X、2.X、5.X、6.X、7.X、8.X 版本都有大量的公司在使用。
面临 Elasticsearch 的如此快速的迭代,大家都会有如下的疑惑:
要不要升级?
怎么升级?
当前集群规模几十个甚至数百个节点,如何升级?
升级有没有风险?会不会导致集群不可用?
升级后,原有的 LowLevel REST客户端、HighLevel REST 客户端还能不能用?
升级有没有兼容性问题?
升级不成功或者成功后用得不爽,能否回退?
新版本听说安全成为必选项,好不好用,如何用?
......
层出不穷的问题,加上公司内部产品线版本的选型非一个人说了算,一般是群策群力,在充分调研或者验证的基础上,才敢给出具体的结论和可行的方案。
不升级是基于上面的疑惑,升级的原因如下:
8.X 高版本的安全加固已成必须,想不做安全都变得很困难。
8.X 高版本会在7.X版本上做的升级,低版本已知bug都已修复,理论上性能也更优。
8.X 的新特性、新 feature,只有升级才能使用。
现在不升级,未来推出 9.X 甚至 10.X,再升级可能会更麻烦。
......
本文不做理论层面的过多阐释,直接拿已有的 7.13 版本的单节点 Elasticsearch集群一步步升级到 8.1.3 版本。
为什么没有选择最新的 8.3+ 版本?因为 Elastic 认证的版本刚从 7.13.0 升级到 8.1.3,我们就模拟这个版本。
想升级到哪个版本,就先看哪个版本的官方文档。
官方文档位置:
https://www.elastic.co/guide/en/elastic-stack/8.1/upgrading-elastic-stack.html
上面的说明很关键,针对不同的版本会有不同的升级步骤。
如果是 8.1.3 之前的 8.X 版本,直接升级就可以。
如果是 7.X 版本,需要先升级至7.X 最新版:7.17.5(下图蓝色部分),然后再由 7.17.5 升级到我们期望的 8.X 版本(下图红色部分)。

由于我们是7.13版本,所以需要先升级到 7.17.5 版本。
这时候,再看 7.17.5 版本的官方文档。
https://www.elastic.co/guide/en/elastic-stack/7.17/upgrading-elastic-stack.html#prepare-to-upgrade
根据上面的版本选择并敲定如下的滚动升级步骤。
https://www.elastic.co/guide/en/elasticsearch/reference/7.17/rolling-upgrades.html
当升级到 7.17.5 之后,再看如何升级到 8.1.3 版本。
需要再次打开 8.1.3 版本的官方文档,敲定出:7.17.5 升级 到 8.1.3 版本的滚动升级步骤如下:
https://www.elastic.co/guide/en/elastic-stack/8.1/upgrading-elastic-stack.html#prepare-to-upgrade
本质上,这一步就简单了,借助:reindex 方式实现。
升级势必会有风险,且不可回退。
所以,建议提前做好集群的快照,以备不时之需。
这是大前提,大家一定要做好万全的准备!
现有集群:7.13.0版本,单节点。
7.13.0 版本已有数据列表。
两步骤策略如下:
第一步:7.13.0 版本升级到 7.17.5 版本。
第二步:7.17.5 版本升级到 8.1.3 版本。
如下的操作针对的是云服务器上的 7.13.0 版本的集群。
PUT _cluster/settings
{
"persistent": {
"cluster.routing.allocation.enable": "primaries"
}
}
单个节点不存在副本的分配,但是多个节点的集群环境,当一个节点关闭后,相关的分片会重新分配,并产生大量的磁盘IO。
POST _flush/synced
停止非必要的索引操作并执行同步刷新,分片恢复会快得多。
pkill -f elasticsearch
我演示的是单个节点,直接暴力 kill 掉进程就可以。
这点和我们理想的不一样,不是点点按钮就能升级,而是底层文件层面的手动操作升级。
需要我们先下载 7.17.5 的安装包,部署细节不赘述。
拷贝 config 路径
拷贝 jvm.options 文件(官方专门强调的)
cp -r ./elasticsearch-7.13.0/config/ ./elasticsearch-7.17.5/
上面已经全路径拷贝,下面有点多余了。
cp -r ./elasticsearch-7.13.0/config/jvm.options ./elasticsearch-7.17.5/config/jvm.options
cp -r ./elasticsearch-7.13.0/data ./elasticsearch-7.17.5/
拷贝完,更新一下用户和用户组权限:
chown -R elasticsearch:elasticsearch elasticsearch-7.17.5
原集群只安装了中文分词 IK 插件,所以要先卸载该插件。
./bin/elasticsearch-plugin remove analysis-ik
再安装新版本插件
./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.17.5/elasticsearch-analysis-ik-7.17.5.zip
到此为止,7.13.0 升级为 7.17.5 完成!
但,总体进度只完成了一半,我们的目标是:8.1.X版本。
注:如果是多个节点,需要重复上面的步骤。
革命尚未成功,同志仍需努力!
具体部署推荐参考:
云服务器 Centos7 部署 Elasticsearch 8.0 + Kibana 8.0 指南
Windows 部署 Elasticsearch + kibana 8.0 指南
这里明显和 7.13.0 升级到 7.17.5 不一样了,采用了 reindex 索引数据迁移方式来实现了。
跨集群的 reindex,需要提前设置好白名单。
白名单设置位置——在目标集群的 elasticsearch.yml 文件中添加,源集群的节点ip,设置如下:

单个脚本验证ok,剩下的交个脚本。
如下是单个脚本的 reindex 迁移数据实现:
curl -XPOST -H "Content-Type: application/json" --cacert config/certs/http_ca.crt -u elastic:mimaxx 'https://localhost:9200/_reindex' -d '
{
"source": {
"remote": {
"host": "http://172.21.0.14:19200",
"username": "elastic",
"password": "mima22x"
},
"index": "users"
},
"dest": {
"index": "users"
}
}'
全量集群索引的批量脚本 reindex 实现如下
#!/bin/sh
index_array=($(curl -XGET -H "Content-Type: application/json" -u elastic:mimaXXX 'http://172.21.0.14:19200/_cat/indices?v' | awk -F " " '{ print $3 }'))
echo ${index_array[@]}
for(( i=0;i<${#index_array[@]};i++)) do
echo ${index_array[i]};
cur_index_name=${index_array[i]};
curl -XPOST -H "Content-Type: application/json" --cacert config/certs/http_ca.crt -u elastic:mimaXXXX 'https://localhost:9200/_reindex' -d '
{
"source": {
"remote": {
"host": "http://172.21.0.14:19200",
"username": "elastic",
"password": "mimaxxx"
},
"index": "'"${cur_index_name}"'"
},
"dest": {
"index": "'"${cur_index_name}"'"
}
}'
done;
核心就两个步骤:
步骤1:批量获取 7.17.5 版本的集群的全量索引名称。
步骤2:挨个遍历索引名称列表借助 reindex 实现跨集群索引迁移。
脚本执行截图:
8.1.3 版本 kibana 查看索引列表截图如下:
注:如果是多个节点,需要提前部署好 8.1.X的多个节点的集群环境。
看似比较繁琐,梳理清楚后也就比较清晰了。
很多细节可能会和本文由细微差异或者还有本文没有覆盖到的点,建议参考官方文档。
Elasticsearch 采用了非常保守的升级策略,本质上是让集群的维护者、使用者自己去把控风险,手动升级。这或许也是 Elasticsearch 官方没有提供一键升级的原因。
因为,中间环节有太多不可控的因素。如果一键升级,每个用户的集群环境千差万别,会出各种问题。
全部交给用户手动升级,复杂是复杂了点,但这是保留用户体验方面折中的实现方案。
未来有没有可能出一键升级的方案呢?我们都很期待......
你的 Elasticsearch 集群是什么版本?有没有升级到最新版本呢?
欢迎留言交流。

更短时间更快习得更多干货!
和全球 1700+ Elastic 爱好者一起精进!

比同事抢先一步学习进阶干货!
尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub
我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘
我实际上是在尝试使用RVM在我的OSX10.7.5上更新ruby,并在输入以下命令后:rvminstallruby我得到了以下回复:Searchingforbinaryrubies,thismighttakesometime.Checkingrequirementsforosx.Installingrequirementsforosx.Updatingsystem.......Errorrunning'requirements_osx_brew_update_systemruby-2.0.0-p247',pleaseread/Users/username/.rvm/log/138121
我正在尝试修改当前依赖于定义为activeresource的gem:s.add_dependency"activeresource","~>3.0"为了让gem与Rails4一起工作,我需要扩展依赖关系以与activeresource的版本3或4一起工作。我不想简单地添加以下内容,因为它可能会在以后引起问题:s.add_dependency"activeresource",">=3.0"有没有办法指定可接受版本的列表?~>3.0还是~>4.0? 最佳答案 根据thedocumentation,如果你想要3到4之间的所有版本,你可以这
如果我使用ruby版本2.5.1和Rails版本2.3.18会怎样?我有基于rails2.3.18和ruby1.9.2p320构建的rails应用程序,我只想升级ruby的版本,而不是rails,这可能吗?我必须面对哪些挑战? 最佳答案 GitHub维护apublicfork它有针对旧Rails版本的分支,有各种变化,它们一直在运行。有一段时间,他们在较新的Ruby版本上运行较旧的Rails版本,而不是最初支持的版本,因此您可能会发现一些关于需要向后移植的有用提示。不过,他们现在已经有几年没有使用2.3了,所以充其量只能让更
我安装了ruby版本管理器,并将RVM安装的ruby实现设置为默认值,这样'哪个ruby'显示'~/.rvm/ruby-1.8.6-p383/bin/ruby'但是当我在emacs中打开inf-ruby缓冲区时,它使用安装在/usr/bin中的ruby。有没有办法让emacs像shell一样尊重ruby的路径?谢谢! 最佳答案 我创建了一个emacs扩展来将rvm集成到emacs中。如果您有兴趣,可以在这里获取:http://github.com/senny/rvm.el
我最近决定从我的系统中卸载RVM。在thispage提出的一些论点说服我:实际上,我的决定是,我根本不想担心Ruby的多个版本。我只想使用1.9.2-p290版本而不用担心其他任何事情。但是,当我在我的Mac上运行ruby--version时,它告诉我我的版本是1.8.7。我四处寻找如何简单地从我的Mac上卸载这个Ruby,但奇怪的是我没有找到任何东西。似乎唯一想卸载Ruby的人运行linux,而使用Mac的每个人都推荐RVM。如何从我的Mac上卸载Ruby1.8.7?我想升级到1.9.2-p290版本,并且我希望我的系统上只有一个版本。 最佳答案
有人知道在发布新版本的Ruby和Rails时收到电子邮件的方法吗?他们有邮件列表,RubyonRails有一个推特,但我不想听到那些随之而来的喧嚣,我只想知道什么时候发布新版本,尤其是那些有安全修复的版本。 最佳答案 从therailsblog获取提要.http://weblog.rubyonrails.org/feed/atom.xml 关于ruby-on-rails-如何在发布新的Ruby或Rails版本时收到通知?,我们在StackOverflow上找到一个类似的问题:
在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList()Obt
我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or