搜索引擎 升级 Elasticsearch 集群数量实战记录

现在线上有一个elasticsearch集群搜索服务有三台elasticsearch实例(es1、es2、es3),打算将其升级为5台(增加es4、es5)。这篇文章主要是对整个操作的过程记录,以及出现的问题总结,包括移动数据量所需要的时间。因为,一开始由于不知道线上数据量全部分配完需要多少时间,如果从凌晨开始操作,到早上8点都还没有同步完,这样会影响到白天线上业务的正常使用。

准备阶段

线上es集群使用的是阿里云服务器,copy其中一个镜像。然后更改其elasticsearch.yml配置文件,检查IK插件是否安装成功。按照这个流程,准备两台新的服务器放入阿里云的隔离组,并安装好elasticsearch,测试elasticsearch实例可以正确启动。也做了将这两台服务器构建一个集群的测试。开始升级操作前30分钟,再次检查elasticsearch.yml 配置。主要的修改是:

discovery.zen.minimum_master_nodes:3
discovery.zen.ping.unicast.hosts: ["es1_ip", "es2_ip","es3_ip","es4_ip","es5_ip"]

升级操作

关闭es集群shard分配功能。对es1执行:

curl -XPUT es1_ip:9200/_cluster/settings -d '{
"transient": {
"cluster.routing.allocation.enable": "none"
}
}'

然后检查:

curl es1_ip:9200/_cluster/settings
curl es2_ip:9200/_cluster/settings
curl es3_ip:9200/_cluster/settings

得到的结果是:

{"transient":{"cluster":{"routing":{"allocation":{"enable":"none"}}}}}

说明es集群已经关闭shard分配功能

关闭es1、es2、es3上的monit

sudo service monit stop

手动控制elasticsearch进程的启动,避免monit自动拉起elasticsearch进程导致意外问题

这时,新的两台服务器es4、es5还在隔离组。把隔离取消,然后启动这两台服务器的elasticsearch实例

使用目录下面写好的启动脚本,这个脚本可以在启动时,为elasticsearch获取所设定的内存(控制分配给es进程的最大内存、最小内存),JVM的设置等

./elasticsearch.sh start

执行

curl es1_ip:9200/_cat/nodes
curl es1_ip:9200/_cat/shards
curl es1_ip:9200/_cat/health
curl es1_ip:9200/_cat/indices

验证nodes节点信息是否变为五个,以及shard现在的分布情况,应该只分布在es1、es2、es3上。es4和es5还没有shard

然后记录下当前的indices信息

例子:

health status index    pri rep docs.count docs.deleted store.size pri.store.size
green open users 5 1 15036978 4262221 13.2gb 6.6gb
green open posts 5 1 15036978 4262221 13.2gb 6.6gb

我们可以看到索引的健康度、状态、文档数量、数据大小和主分片数量、副分片的倍数设置。记录下这些信息,在最后升级完的时候 进行比对,看是否有偏差。如果一切正常,这些信息是不会变的。

启动es集群shard分配功能

这是集群操作,所以只要对其中一台es实例操作即可

curl -XPUT es1_ip:9200/_cluster/settings -d '{
"transient": {
"cluster.routing.allocation.enable": "all"
}
}'

shard分配开始

执行:

curl es1_ip:9200/_cat/shards

curl es1_ip:9200/_cat/health

curl es1_ip:9200/_cat/indices

curl es1_ip:9200/_cat/recovery
  • 观察shards分布情况,是否向es4和es5分配shards。以及分配的百分比进度
  • 监控es4 和 es5 服务器的elasticsearch的log
  • 登入 es4和es5, 查看挂载的SSD数据盘数据量是否在增长
  • 测试进行es搜索的测试,快速搜索,工单筛选,客户筛选,观察对线上业务的影响

这段时间,主要使用:

curl es1_ip:9200/_cat/shards

curl es1_ip:9200/_cat/health

curl es1_ip:9200/_cat/recovery

观测shard分配进度和情况,以及线上系统健康度。

curl es1_ip:9200/_cat/shards 可以看见具体哪个索引的,哪个es服务器在移动shard到另一台es服务器

正在shard移动时的状态
posts r RELOCATING 3628884 5.4gb es_ip1 elasticsearch1 -> es_ip5 elasticsearch5

可以看到哪个索引,哪个shard分片,从哪台服务器上移到另一台服务器上

这个过程发现,elasticsearch会选择将reproduction shard(副本分片)移到新的elasticsearch服务器上,而避免移到主分片。

这样可以避免移到主分片时候发生数据丢失的情况,而移动副本分配不用担心这个问题,并且线上的health一直是green。尽可能不影响线上正常搜索业务。

移动shard默认是两个并发操作。一开始误解了,以为每个es实例会进行两个并发的shard移动,会有6个shard在并发移动,实际情况是,整个集群只有2个shard在并发移动。下次可以将这个值调大一些,加快shard的移动速度,幸好shard数据移动的速度比想象的要快。

通过htop观察服务器的负载,在进行shard分配的服务器,CPU使用率一般在20%-40%之间。服务器是16核,也就是一个elasticsearch进程shard的移动,一个核心都没有跑满,服务器负载在0.2。可见elasticsearch的分片移动还是很保守的,对服务器几乎没有很大的压力。并且观察发现,elasticsearch不会一次把某个索引该分配的shard都分配完再选择下一个索引,而是轮询的分配索引的shard。A 索引分配了一个shard,就分配B索引的shard,一圈之后,又回到A 索引继续分配shard。直到最后所有索引shard数量在集群中平衡。

收尾操作

大约一个小时时间,shard分配结束。一共将88G左右的数据分配到了两台新的服务器上。这是在默认shard并发分配数2的情况下的时间记录。大家以后可以根据这个记录,预估自己的elasticsearch shard分配会需要多少时间。

动态修改 master选举数量。根据elasticsearch文档推荐的公式: (N(master)+1)/2

curl -XPUT es1_ip:9200/_cluster/settings -d '{
"persistent" : {
"discovery.zen.minimum_master_nodes" : 3
}
}'

检查配置:

{"persistent":{"discovery":{"zen":{"minimum_master_nodes":"3"}}},"transient":{"cluster":{"routing":{"allocation":{"enable":"all"}}}}}

再检测API命令

curl es1_ip:9200/_cat/health

curl es1_ip:9200/_cat/indices

curl es1_ip:9200/_cat/shards

这时候,观察到shard分配的结果是,每个索引有10个shard,每个es服务器拥有一个索引的两个shard。新加入的es4、es5上都是副本shard,原有集群中的es1、es2、es3拥有主shard和副本shard。

例子:

index              shard   prirep   state     docs     store  ip    node
posts 2 r STARTED 993718 3.5gb es1_ip es1
posts 2 p STARTED 993718 3.5gb es1_ip es1
posts 0 p STARTED 993428 3.7gb es2_ip es2
posts 0 p STARTED 993428 3.7gb es2_ip es2
posts 3 p STARTED 993653 3.6gb es3_ip es3
posts 3 p STARTED 993653 3.6gb es3_ip es3
posts 1 r STARTED 994063 3.5gb es4_ip es4
posts 1 r STARTED 994063 3.5gb es4_ip es4
posts 4 r STARTED 993938 3.5gb es5_ip es5
posts 4 r STARTED 993938 3.5gb es5_ip es5

posts索引的十个shard分片在每台elasticsearch服务器上有两个分片。perfect!(实际结果是乱序的)

后悔的操作选择

我们修改了es1的配置文件,想要重启es1 elasticsearch实例。重启后,发生了意想不到的事情,索引的shard又开始分配移动,等了快40分钟分配移动结束,但是,这时候不是每个es服务器平均拥有一个索引的两个shard,而是有的es服务器有该索引的三个shard。

posts               2 r STARTED   993718   3.5gb es4_ip es4
posts 2 p STARTED 993718 3.5gb es2_ip es2
posts 0 p STARTED 993428 3.7gb es4_ip es4
posts 0 r STARTED 993428 3.7gb es1_ip es1
posts 3 r STARTED 993653 3.6gb es1_ip es1
posts 3 p STARTED 993653 3.6gb es2_ip es2
posts 1 r STARTED 994063 3.5gb es5_ip es5
posts 1 p STARTED 994063 3.5gb es1_ip es1
posts 4 r STARTED 993938 3.5gb es5_ip es5
posts 4 p STARTED 993938 3.5gb es3_ip es3

posts在elasticsearch1 上出现了三个shard

实际上,原本集群中的三台服务器是不用重启的,你可以修改他们elasticsearch.yml 配置中的单拨数组设置:discovery.zen.ping.unicast.hosts。加上新加的两台服务器的ip,和 discovery.zen.minimum_master_nodes:3。下次重启的时候,就会读取这个新的配置,而不需要马上重新。因为,k可以通过调用API的方式,动态配置discovery.zen.minimum_master_nodes,而discovery.zen.ping.unicast.hosts的配置,在新的elasticsearch服务器上配置五台服务器的ip地址就可以了。

打开所有es服务器的monit,测试线上elasticsearch搜索功能

修改项目代码,加上新加的两台elasticsearch服务器IP

升级 Elasticsearch 集群数量实战记录的更多相关文章

  1. Elasticsearch学习总结 (Centos7下Elasticsearch集群部署记录)

    一.  ElasticSearch简单介绍 ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elasticse ...

  2. 实战之elasticsearch集群及filebeat server和logstash server

    author:JevonWei 版权声明:原创作品 实战之elasticsearch集群及filebeat server和logstash server 环境 elasticsearch集群节点环境为 ...

  3. Elasticsearch集群升级指引

    目录 背景 第一部分 版本升级指引 第二部分 升级方法和具体步骤 总结 参考文献及资料 背景 Elasticsearch集群的版本升级是一项重要的集群维护工作.本篇文章参考官方文档,将详细介绍相关细节 ...

  4. ElasticSearch实战系列一: ElasticSearch集群+Kinaba安装教程

    前言 本文主要介绍的是ElasticSearch集群和kinaba的安装教程. ElasticSearch介绍 ElasticSearch是一个基于Lucene的搜索服务器,其实就是对Lucene进行 ...

  5. 手把手教你搭建一个Elasticsearch集群

    一.为何要搭建 Elasticsearch 集群 凡事都要讲究个为什么.在搭建集群之前,我们首先先问一句,为什么我们需要搭建集群?它有什么优势呢? (1)高可用性 Elasticsearch 作为一个 ...

  6. 手把手教你搭建一个 Elasticsearch 集群

    为何要搭建 Elasticsearch 集群 凡事都要讲究个为什么.在搭建集群之前,我们首先先问一句,为什么我们需要搭建集群?它有什么优势呢? 高可用性 Elasticsearch 作为一个搜索引擎, ...

  7. PB 级大规模 Elasticsearch 集群运维与调优实践

    PB 级大规模 Elasticsearch 集群运维与调优实践 https://mp.weixin.qq.com/s/PDyHT9IuRij20JBgbPTjFA | 导语 腾讯云 Elasticse ...

  8. Elasticsearch集群规模和容量规划的底层逻辑

    转载自: https://mp.weixin.qq.com/s?__biz=MzI2NDY1MTA3OQ==&mid=2247484628&idx=1&sn=666e416ae ...

  9. 运维利器-ClusterShell集群管理操作记录

    在运维实战中,如果有若干台数据库服务器,想对这些服务器进行同等动作,比如查看它们当前的即时负载情况,查看它们的主机名,分发文件等等,这个时候该怎么办?一个个登陆服务器去操作,太傻帽了!写个shell去 ...

随机推荐

  1. 在 Mac 上使用多点触控手势

    使用多点触控触控板或妙控鼠标,可以通过轻点.轻扫.捏合或开合一根或多根手指进行有用的操作. 触控板手势 有关这些手势的更多信息,请选取苹果菜单 () >“系统偏好设置”,然后点按“触控板”.您 ...

  2. WEB服务器搭建–IIS

    功能作用 IIS是一个World Wide Web server.Gopher server和FTP server全部包容在里面. IIS意味着你能发布网页,并且有ASP(Active Server ...

  3. Spring Security教程(三):自定义表结构

    在上一篇博客中讲解了用Spring Security自带的默认数据库存储用户和权限的数据,但是Spring Security默认提供的表结构太过简单了,其实就算默认提供的表结构很复杂,也不一定能满足项 ...

  4. 使用vs的查找功能,简单大概的统计vs中的代码行数

    VS强大的查找功能,可以使用正则表达式来进行查找,这里统计代码行数的原理就是: 在所有指定文件中进行搜索,统计匹配的文本行数. 但是匹配的行需要满足:非注释.非空等特殊非代码行. 使用Ctrl+Shi ...

  5. Android基础知识之API等级介绍

    原文:http://android.eoe.cn/topic/android_sdk :可以让开发者通过一个表示API级别的整数来描述程序在android平台上的兼容性,系统会将与系统本身提供的API ...

  6. VS Code插件Vue2 代码补全工具

    一.简介 此扩展将Vue 2代码片段和语法突出显示添加到Visual Studio代码中. 这个插件基于最新的Vue官方语法高亮文件添加了语法高亮,并且依据Vue 2的API添加了代码片段. 支持语言 ...

  7. 菜鸟学Java(六)——简单验证码生成(Java版)

    验证码大家都知道,它的作用也不用我多说了吧.如果不太清楚请参见百度百科中的解释,一般验证码的生成就是随机产生字符(数字.字母或者汉字等),然后将这些生成的字符绘制成一张图片,再在图片上加上一些干扰元素 ...

  8. Multi-cloud Kubernetes with Triton

    https://www.joyent.com/blog/triton-kubernetes-multicloud While running an experimental Kubernetes cl ...

  9. JavaScript 记录页面停留时间-通过测试

    <html> <head> <meta http-equiv="Content-Type" content="text/html; char ...

  10. 未能为数据库 '*'中得对象'*'分配空间,因文件组'PRIMARY'已满

    服务器使用mssqlserver2005,最近经常出现无法新增信息错误,查看日志,发现严重错误提示,内容大致为: 无法为数据库 'weixin_main' 中的对象 'dbo.wx_logs'.'PK ...