资讯专栏INFORMATION COLUMN

ES Hang的应急处理过程

IT那活儿 / 3479人阅读
ES Hang的应急处理过程

点击上方“IT那活儿”公众号,关注后了解更多内容,不管IT什么活儿,干就完了!!!


  
某月某日06:00分:收到应用电话反馈ES出现故障只能查询不能写入,我侧第一时间登录环境,经过核查发现存在节点连接超时和节点丢失现象,集群无法正常访问。


故障紧急处理方案

07:45分:因影响到割接进度,决定先恢复业务,后续再分析故障原因,暂定两个方案:

  • 方案一:重启ES,重启需要重新分配分片,数据量太大,ES恢复时间会比较长。
  • 方案二:将应用暂时迁到新搭的ES集群,只需要应用修改url就可使用。

08:58分:因需要紧急恢复业务采用方案二,在新集群创建相关的用户并赋予权限,应用创建索引并修改url将数据写入到新集群,数据写入速率在老集群的两倍左右,业务恢复正常。

原集群恢复处理过程

1. 故障原因分析
经过数小时的分析,找到故障原因,系统守护进程异常导致主机hang死,进而导致es节点丢失影响集群正常使用。
2. 关闭分片移动(none为关闭,all为开启)
curl -u admin:admin-XPUT 
http://xxxxxxxxxx:9200/_cluster/settings -H Content-Type: application/json -d
{"transient":{"cluster.routing.allocation.enable":"none"}}
3. 将内存中的数据写入磁盘,避免数据丢失
curl -u admin: admin -XPOST http://xxxxxxxx:9200/_flush/synced
4. 重启各节点ES服务
ps -ef |grep elasticsearch
Kill -9 pid
./bin/elasticsearch -d
5. 开启分片移动

curl -u admin:admin-XPUT
http://xxxxxxxxxx:9200/_cluster/settings -H Content-Type: application/json -d
{"transient":{"cluster.routing.allocation.enable":"all"}}

数据迁回

因故障紧急恢复才用的是方案二,应用在新集群上产生的部分数据,应用迁回后需要将这部分数据迁移导老集群,本次数据迁移使用的工具为elastic-dump。

1. 安装elastic-dump工具

1.1 elastic-dump使用前置条件,需要安装node.js
1)下载node.js 安装包
官方下载地址:https://nodejs.org/dist/
2)解压node.js 安装包
tar -zxvf node-v10.16.3-linux-x64.tar.gz
3)配置环境变量
sudo vi /etc/profile
添加以下参数:
NODE_HOME=/app/node-v10.16.3-linux-x64
export PATH=$PATH:$NODE_HOME/bin
export NODE_HOME=$NODE_HOME/lib/node_modules
使环境变量生效:
source /etc/profile
4)查看版本号
node -v
npm -v
如能正常显示版本,npm至此就安装完成。
1.2 下载elastic-dump

1)官方下载地址

https://github.com/elasticsearch-dump/elasticsearch-dump?utm_source=dbweekly&utm_medium=email

2)解压elastic-dump安装包
unzip elasticdump.zip
3)安装elastic-dump工具
npm install elasticdump
2. elastic-dump工具部分参数介绍
OPTIONS常用选项参数有:
  • --output

    目的地位置。

  • --input

    源位置。

  • --limit

    用于限定每一批量操作时进行迁移的文档对象数目,默认值是100,也就是每一次从SOURCE到DESTINATION文档对象数量。

  • --quiet

    只输出错误信息,该参数的默认值是false,如果该参数设置为true。控制台中关于数据迁移的进度信息不可见。

  • --type

    数据迁移类型,可选值有analyzer, data, mapping三种。在ITOA由于统一版本的软件平台analyzer是相同的,所以进行索引迁移时,只需要迁移data, mapping两种类型的数据。该参数的默认选项是data。

  • --ignore-errors

    该参数用于控制数据迁移过程遇到错误数据的处理策略。默认情况下为false,表示遇到错误数据时,停止数据迁移。

  • --fileSize
    单个导出文件大小设置,支持文件拆分。此值必须是**字节**模块支持的字符串。
    以下缩写必须用于表示单位大小:
    b代表字节;
    kb代表千字节;
    mb代表兆字节;
    gb代表千兆字节.
  • --help
    陈列该工具使用时的帮助信息。
3. 使用elastic-dump工具导出数据(设置每个json文件为50g,一次导出10000行数据,只输出错误日志.)
nohup elastic-dump/node_modules/elasticdump/bin/elasticdump 
--input=http://user:password@IP:port/index_name --
output=/app/xxxxxx.json --fileSize=50gb --limit=10000 --quiet=true&
4. 导入数据(一次导入5000行数据,只输出错误日志.)
nohup elastic-dump/node_modules/elasticdump/bin/elasticdump 
--input=/app/xxxxxxxx.json.split-0 --
output=http://user:password@IP:port/index_name --limit=5000 --quiet=true&
5. 数据迁移总结
本次迁移的索引在ES中查询该索引大小共计2T,除去副本为1T,耗时64小时左右,实际导出文件44个共计2296G,ES默认是LZ4压缩算法,压缩比在2左右。

本文作者:刘 能(上海新炬王翦团队)

本文来源:“IT那活儿”公众号

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/129231.html

相关文章

  • ES6-Promise

    摘要:方法没有设置返回值。解决思路是,当遇到任务的返回值是一个或者,并且有自己的方法的时候,就将它当做是一个对象处理,等这个对象中的方法处理到的时候,把作为参数输出传递给后续的任务。 前段时间看到关于microTask的文章,《Tasks, microTasks, queues and schedules》,感觉有必要澄清一下。本篇里用setTimeout来实现的Promise,和浏览器原生...

    dackel 评论0 收藏0
  • 重新巩固JS(三)——JavaScript语句

    摘要:重新巩固系列,都是比较基础的东西,可以进行查漏补缺,很快看完,这是第三篇。其中,部分可以省略条件语句语句例子为,小于但大于,故输出语句当表达式的值等于值时,执行语句,遇到语句则跳出语句,若都没匹配到值,则执行中的语句。重新巩固JS系列,都是比较基础的东西,可以进行查漏补缺,很快看完,这是第三篇。 其他JS重新巩固系列: 重新巩固JS(一)——JavaScript基本类型 重新巩固JS(二)...

    tunny 评论0 收藏0

发表评论

0条评论

IT那活儿

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<