前一段时间呢,遇到点问题,就是生产上某个索引库累积了 T 为单位的数据,且这个索引库是单点的.........
对没错,这个索引库没有分片没有副本(因为当时上线太着急,没来得及设置,后期已经不能再加了)
所以这个单点问题必须处理,毕竟是以T为单位的,万一索引库挂了,容易造成这个Elasticsearch集群节点的离线,这要是节点离线了,可能会对其他节点以及索引库造成不可预知的影响,毕竟其他索引库在这个节点上也是有分片和副本的....
有这么几个处理方案:
1、使用策略
占用多大空间时就自动开启一个新的索引库写入,或每天、每周、每月定时开启新的索引库写入
缺点:查询影响不是特别大,但是对于会发生变更的数据,难以操作
2、使用Elasticsearch官方提供的 reindex 重建索引
此方法其实就是将老索引的数据迁移到新索引中,既然老索引无法更改,那就换一个设置好的新索引,将数据导过去
语法:
POST _reindex
{
"source": {"index": "old_index"},
"dest": {"index": "new_index"}
}
既然已经说了是讲老的索引数据导入新的索引,那肯定需要新老索引你需要导入的部分结构一致,比如说一个username字段,你老索引是keyword类型,你新索引是long类型,这明显不行啊
reindex 底层也是滚动查询,为了避免对正常业务的影响,默认的读取速度还是很慢的(我测试的时候,一天只复制了300W的数据,实话实说,太慢了,但是不敢调,怕对别的业务有影响)
3、使用 logstash 读取
此种做法也是将老索引库的数据读到新索引库中,logstash 是Elastic生态中的一个也很重要的组件,本次对logstash不做解释,详细的请移步官网~
4、最简单的就是写一个程序,这边取,写到那边,这是最麻烦的,也是复用程度最低的,而且你写的程序,很大情况下没有logstash这种中间件读得快.....
下篇讲具体怎么迁移