一个ES设置操作引发的“血案”
背景说明
ES版本 7.1.4
在ES生产环境中增加字段,一直提示Setting index.mapper.dynamic was removed after version 6.0.0错误。但是我只是加一个字段而已啊。
详细错误
curl --request PUT --url http://ca.yorkbbs.elasticsearch:9200/object006_bbs_post/_mapping --header 'content-type: application/json' --data '{"properties": {"property_inWeChat": {"type": "long"}}}'
{
"error": {
"root_cause": [{
"type": "illegal_argument_exception",
"reason": "Setting index.mapper.dynamic was removed after version 6.0.0"
}],
"type": "illegal_argument_exception",
"reason": "Setting index.mapper.dynamic was removed after version 6.0.0"
},
"status": 400
}
产生原因
直接先说原因吧
错误的设置了index.mapper.dynamic属生,导致此问题。
你也可以理解为是es的一个bug,在设置时并没有提醒,可以设置成功,但是设置后修改时,启动时都会判断。
甚至ES启动也会失败,如果ES被更改错误后,再次启动将会失败,导致无法启动。
所以,此错误是非常可怕的。
而且此错误,在当时不一定能发现,可能过了好久,ES出现异常重启时,发现启动不了,这个时候可能连备份都已经没有了。
我发现这个问题时,还算是比较及时的,在错误的设置完index.mapper.dynamic后,第二天偶然间需要在index中增加一个字段。
详细过程
在某一天,我同事发现我们现在生产用的index的字段是自动创建的,在早期的时候都是设置为手动创建的,这样做是为了防止程序出现错误时,导致ES字段爆炸(比如:原来想写入一个字段值,结果把一个对象赋值上去了,结果ES就创建了大量的字段)。所以,我们都会要求把index的字段改为手动创建,当赋值错误时提示错误,或者创建失败。我以前都是用发HTTP请求来完成了,最近一直在用cerebro,了解到里面可以有一个index setting选项,发现里面有一个dynamic的设置,就直接改成flase了。这个操作正式引爆了核弹。
第二天需要在index中增加一个字段。才发现增加不了,增加的API语句也是以前用过N次了,而且在测试环境也可以正常增加,只有生产无法增加。回想了一下最近的操作,想想前一天设置过es的设置。当时本意是想把ES设置为字段不可能自动增加,只能人工增加。
以前呢,我都是用API指令修改,哪天呢,发现公司配置的cerebro集群管理工具,有UI的修改界面,觉得有UI,就直接修改吧,于是感觉一定与此有关。
我用的cerebro版本是0.9.4
设置界面
后来分析可能是cerebro工具版本比较早,早期确实是用的index.mapper.dynamic,但是es6.0.0以后就不用了,但是这个工具呢,并没有修改。设置时仍然设置的是index.mapper.dynamic值,刚好呢,es在设置时也没有校验。
这里觉得ES责任最大,你要不支持,你设置时就提示不支持,不让设置啊。设置时不判断,设置成功了,修改时又不让修改。造成的后果无法修复。
同时,以后慎用第三方工具吧,至少在测试环境先多测试测试。
重新创建了一个新的index,就可以添加成功。
curl --request GET --url http://ca.yorkbbs.elasticsearch:9200/object006_bbs_post
出现错误的原因就在这里,设置的时候没有提示不能设置,设置后再做变更时,提示数据配置文件错误,不允许设置,也无法再修复。
此命令一定要谨慎执行,在6.0.0以上版本执行可能会引发此问题
此命令一定要谨慎执行,在6.0.0以上版本执行可能会引发此问题
此命令一定要谨慎执行,在6.0.0以上版本执行可能会引发此问题
### 此命令一定要谨慎执行,在6.0.0以上版本执行可能会引发此问题
PUT http://127.0.0.1:9200/zpf001/_settings
Content-Type: application/json
{
"index": {
"mapper": {
"dynamic": "true"
}
}
}
curl --request PUT --url http://127.0.0.1:9200/zpf001/_settings --header 'content-type: application/json' --data '{"index": {"mapper": {"dynamic": "true"}}}'
尝试过的解决办法(都失败了)
由于分析出来原因是因为index setting中错误的设置了dynamic属性,所以解决办法就是删除它(也曾想过改个名字,让ES不认识它),
通过HTTP请求无法把设置删除,现在只要是修改setting的,都会有这样提示,查看了源码,在操作前进行了这个判断。
尝试修改名字,也无效。修改名称后,ES连启动都启动不了了。
在上面位置,可以找到dynamic字段,修改为其他名字,重启无效。ES直接无法启动了。这个时候发现,其实在设置了dynamic后,你的ES就无法启动,因为在启动时,也有上面的版本判断。
坑爹不!
至此,已经过去几天了。仍然没有解决
最后的解决办法
尝试好多办法都无法解决,那就只能重建ES了,还好我们ES的数据可以从DB恢复。
建议
一定要做好备份,比如快照备份,磁盘备份,数据库备份等等。并且在任何操作前,都要做好可以回退的措施,你真的不知道下一秒会发生什么?
正式设置ES字段为手动创建的HTTP请求
### 设置mapping字段手工同步,不自动创建 true 动态添加新的字段—缺省 false忽略新的字段 strict 如果遇到新字段抛出异常
PUT {{esHost}}/object006/_mapping
Content-Type: application/json
{
"dynamic": "strict"
}
一个ES设置操作引发的“血案”的更多相关文章
- 一个Tomcat配置参数引发的血案
转载:https://mp.weixin.qq.com/s/3IuTcDCTB3yIovp6o_vuKA 一.现象 有用户反馈访问PC首页偶尔会出现白页情况,也偶尔会收到听云的报警短信 二.监控(听云 ...
- jenkins配置findbugs失败---不要随便忽略警告!一个因为文件所有权引发的血案
一:背景交代 这两天组长让我这边搭一个持续集成环境.梳理了需求后,因为我们的项目都是maven项目,所以我选择了jenkins+外置maven(区别于直接从jenkins里面安装)的方案.(cento ...
- mysql参数max_binlog_cache_size设置不当引发的血案
日常运维中的坑真是防不胜防,不一小心就遇到别人给你挖的坑.最近又遇到经验不足的DBA不知道从哪拷贝的配置文件(据说是当时参加某培训机构视频培训是资料里的模板,真的是误人子弟呀),其中把max_binl ...
- 一个由正则表达式引发的血案 vs2017使用rdlc实现批量打印 vs2017使用rdlc [asp.net core 源码分析] 01 - Session SignalR sql for xml path用法 MemCahe C# 操作Excel图形——绘制、读取、隐藏、删除图形 IOC,DIP,DI,IoC容器
1. 血案由来 近期我在为Lazada卖家中心做一个自助注册的项目,其中的shop name校验规则较为复杂,要求:1. 英文字母大小写2. 数字3. 越南文4. 一些特殊字符,如“&”,“- ...
- Replication的犄角旮旯(六)-- 一个DDL引发的血案(上)(如何近似估算DDL操作进度)
<Replication的犄角旮旯>系列导读 Replication的犄角旮旯(一)--变更订阅端表名的应用场景 Replication的犄角旮旯(二)--寻找订阅端丢失的记录 Repli ...
- 一个无锁消息队列引发的血案(六)——RingQueue(中) 休眠的艺术 [续]
目录 (一)起因 (二)混合自旋锁 (三)q3.h 与 RingBuffer (四)RingQueue(上) 自旋锁 (五)RingQueue(中) 休眠的艺术 (六)RingQueue(中) 休眠的 ...
- 一个无锁消息队列引发的血案(五)——RingQueue(中) 休眠的艺术
目录 (一)起因 (二)混合自旋锁 (三)q3.h 与 RingBuffer (四)RingQueue(上) 自旋锁 (五)RingQueue(中) 休眠的艺术 (六)RingQueue(中) 休眠的 ...
- 一个无锁消息队列引发的血案(四)——月:RingQueue(上) 自旋锁
目录 (一)起因 (二)混合自旋锁 (三)q3.h 与 RingBuffer (四)RingQueue(上) 自旋锁 (五)RingQueue(中) 休眠的艺术 (六)RingQueue(中) 休眠的 ...
- Replication的犄角旮旯(七)-- 一个DDL引发的血案(下)(聊聊logreader的延迟)
<Replication的犄角旮旯>系列导读 Replication的犄角旮旯(一)--变更订阅端表名的应用场景 Replication的犄角旮旯(二)--寻找订阅端丢失的记录 Repli ...
随机推荐
- fetch和axios区别,摘自Stack Overflow网站答案
fetch 请求let url = 'https://someurl.com'; let options = { method: 'POST', mode: 'cors', headers: { 'A ...
- 【编译原理】自底向上分析方法——LR文法分析方法的总结
LR(0).SLR(1).LR(1).LALR(1) de 若干方面的区别 目录 推导过程 分析能力 本质区别 文法对比 可以适当利用物理意义对二义性文法进行冲突处理 推导过程 LR(0)的基础上才有 ...
- Python中使用模块和库编程
""" python中使用模块和库编程 导入模块 import modulename [as alias] from modulename import fun1,fun ...
- Ubuntu更换apt镜像源
1. 手动更改 备份镜像源 cd /etc/apt cp sources.list sources.list.bak 修改镜像源 sudo vim sources.list # 复制粘贴下面镜像源,保 ...
- spring-xml实现aop-通知的种类
如果本代码有疑问,请访问spring-aop快速入门或者spring-aop动态代理技术(底层分析) 1.导入aop的相关坐标 <dependency> <groupId>or ...
- What is ACPI
What is ACPI, OnNow, and PCI Power Management? Microsoft began an initiative called OnNow to shorten ...
- JVM虚拟机类加载机制(一)
类从被加载到虚拟机内存中开始,到卸载出内存截止,整个生命周期包括:加载.验证.准备.解析,初始化.使用.卸载七个阶段.其中验证.准备.解析三个部分统称为连接. 类初始化情况: 遇到new.getsta ...
- 2021.08.09 P4868 Preprefix sum(树状数组)
2021.08.09 P4868 Preprefix sum(树状数组) P4868 Preprefix sum - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 前缀和(pr ...
- 得到知识服务app原型设计比较与实践
一.几种原型设计工具的比较 墨刀 优点: 拥有PC端.手机端.网页版,让你随时随地可以进行产品原型设计: 其定位是主要用于设计移动APP原型,其控件的拖拉.大小的调整,都会自然去匹配相应的母版大小,非 ...
- 【前端干货】别再羡慕别人的Excel啦,教你点击按钮直接打开侧边栏!
负责技术支持的葡萄又来啦. 三日不见,我们的客户又为我们发来新的问题. 这次我们需要实现的场景是在前端表格环境中,像模板按钮那样,点击之后弹出一个侧边栏,然后通过点击不同的单元格显示不同的内容. 挤接 ...