升级 Elasticsearch 集群数量实战记录
搜索引擎 升级 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 集群数量实战记录的更多相关文章
- Elasticsearch学习总结 (Centos7下Elasticsearch集群部署记录)
一. ElasticSearch简单介绍 ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elasticse ...
- 实战之elasticsearch集群及filebeat server和logstash server
author:JevonWei 版权声明:原创作品 实战之elasticsearch集群及filebeat server和logstash server 环境 elasticsearch集群节点环境为 ...
- Elasticsearch集群升级指引
目录 背景 第一部分 版本升级指引 第二部分 升级方法和具体步骤 总结 参考文献及资料 背景 Elasticsearch集群的版本升级是一项重要的集群维护工作.本篇文章参考官方文档,将详细介绍相关细节 ...
- ElasticSearch实战系列一: ElasticSearch集群+Kinaba安装教程
前言 本文主要介绍的是ElasticSearch集群和kinaba的安装教程. ElasticSearch介绍 ElasticSearch是一个基于Lucene的搜索服务器,其实就是对Lucene进行 ...
- 手把手教你搭建一个Elasticsearch集群
一.为何要搭建 Elasticsearch 集群 凡事都要讲究个为什么.在搭建集群之前,我们首先先问一句,为什么我们需要搭建集群?它有什么优势呢? (1)高可用性 Elasticsearch 作为一个 ...
- 手把手教你搭建一个 Elasticsearch 集群
为何要搭建 Elasticsearch 集群 凡事都要讲究个为什么.在搭建集群之前,我们首先先问一句,为什么我们需要搭建集群?它有什么优势呢? 高可用性 Elasticsearch 作为一个搜索引擎, ...
- PB 级大规模 Elasticsearch 集群运维与调优实践
PB 级大规模 Elasticsearch 集群运维与调优实践 https://mp.weixin.qq.com/s/PDyHT9IuRij20JBgbPTjFA | 导语 腾讯云 Elasticse ...
- Elasticsearch集群规模和容量规划的底层逻辑
转载自: https://mp.weixin.qq.com/s?__biz=MzI2NDY1MTA3OQ==&mid=2247484628&idx=1&sn=666e416ae ...
- 运维利器-ClusterShell集群管理操作记录
在运维实战中,如果有若干台数据库服务器,想对这些服务器进行同等动作,比如查看它们当前的即时负载情况,查看它们的主机名,分发文件等等,这个时候该怎么办?一个个登陆服务器去操作,太傻帽了!写个shell去 ...
随机推荐
- 在 Mac 上使用多点触控手势
使用多点触控触控板或妙控鼠标,可以通过轻点.轻扫.捏合或开合一根或多根手指进行有用的操作. 触控板手势 有关这些手势的更多信息,请选取苹果菜单 () >“系统偏好设置”,然后点按“触控板”.您 ...
- WEB服务器搭建–IIS
功能作用 IIS是一个World Wide Web server.Gopher server和FTP server全部包容在里面. IIS意味着你能发布网页,并且有ASP(Active Server ...
- Spring Security教程(三):自定义表结构
在上一篇博客中讲解了用Spring Security自带的默认数据库存储用户和权限的数据,但是Spring Security默认提供的表结构太过简单了,其实就算默认提供的表结构很复杂,也不一定能满足项 ...
- 使用vs的查找功能,简单大概的统计vs中的代码行数
VS强大的查找功能,可以使用正则表达式来进行查找,这里统计代码行数的原理就是: 在所有指定文件中进行搜索,统计匹配的文本行数. 但是匹配的行需要满足:非注释.非空等特殊非代码行. 使用Ctrl+Shi ...
- Android基础知识之API等级介绍
原文:http://android.eoe.cn/topic/android_sdk :可以让开发者通过一个表示API级别的整数来描述程序在android平台上的兼容性,系统会将与系统本身提供的API ...
- VS Code插件Vue2 代码补全工具
一.简介 此扩展将Vue 2代码片段和语法突出显示添加到Visual Studio代码中. 这个插件基于最新的Vue官方语法高亮文件添加了语法高亮,并且依据Vue 2的API添加了代码片段. 支持语言 ...
- 菜鸟学Java(六)——简单验证码生成(Java版)
验证码大家都知道,它的作用也不用我多说了吧.如果不太清楚请参见百度百科中的解释,一般验证码的生成就是随机产生字符(数字.字母或者汉字等),然后将这些生成的字符绘制成一张图片,再在图片上加上一些干扰元素 ...
- Multi-cloud Kubernetes with Triton
https://www.joyent.com/blog/triton-kubernetes-multicloud While running an experimental Kubernetes cl ...
- JavaScript 记录页面停留时间-通过测试
<html> <head> <meta http-equiv="Content-Type" content="text/html; char ...
- 未能为数据库 '*'中得对象'*'分配空间,因文件组'PRIMARY'已满
服务器使用mssqlserver2005,最近经常出现无法新增信息错误,查看日志,发现严重错误提示,内容大致为: 无法为数据库 'weixin_main' 中的对象 'dbo.wx_logs'.'PK ...