搜索引擎 升级 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. C#基础第九天-作业-储蓄账户(SavingAccount)和信用账户(CreditAccount)

    要求1:完成以下两种账户类型的编码.银行的客户分为两大类:储蓄账户(SavingAccount)和信用账户(CreditAccount),两种的账户类型的区别在于:储蓄账户不允许透支,而信用账户可以透 ...

  2. C#基础第四天-作业-Hashtable-list<KeyValuePair>泛型实现名片

    1.名片集: 名片集实现功能:不限定集合实现 增加,查询,查询全部,删除 功能,需求条件: 根据姓名去(查询/删除)某一行数据.指定:姓名,年龄,性别,爱好,联系方式. 采用技术:Hashtable- ...

  3. 怎么在eclipse中安装svn插件

    Subclipse   Subclipse is an Eclipse Team Provider plug-in providing support for Subversion within th ...

  4. python 并发编程(socketserver)

    下面的例子是简单的ssh 登录,其实也就是客户端把指令发送给服务器.服务器把结果返还给客户端,客户端再在终端展现 服务端代码: #Author:BigBao #Date:2018/7/18 # 我们之 ...

  5. 利用阿里云如何开发一款直播app?

    在开发的过程中应该注意些什么?下面让小编告诉你: 随着互联网的发展,越来越多的人已经加入互联网的行列.而且很多的人也开始直播,和众多的网友分享自己身边事情.互联网还在加速发展,从PC互联网,到移动互联 ...

  6. cygwin下安装c语言开发环境

    1.到官网cygwin.com下载安装程序. 2.添加清华的cygwin镜像:https://mirrors.tuna.tsinghua.edu.cn/cygwin/ 3.在安装:vim,git,gc ...

  7. asp.net mvc中的用户登录验证过滤器

    在WEB项目中建立 类:      public class LoginFilter : ActionFilterAttribute     {         public override voi ...

  8. 【Unity】11.5 物理材质 (Physics Material)

    分类:Unity.C#.VS2015 创建日期:2016-05-02 一.简介 物理材质 (Physics Material) 用于调整碰撞对象的摩擦力和反弹效果. 二.创建物理材质 要创建物理材质 ...

  9. 菜鸟调错(二)——EJB3.0部署消息驱动Bean抛javax.naming.NameNotFoundException异常

    在部署EJB的消息驱动Bean时遇到了如下的错误: ERROR [org.jboss.resource.adapter.jms.inflow.JmsActivation] (WorkManager(2 ...

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

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