elk5.2升级到7.17的问题

发布时间 2023-09-29 23:38:14作者: windysai
elk5.2升级到7.17
  记个流水账,从能用到原nginx日志格式能写入到logstash折腾了好几天。
  官方有个升级路线的(大家要克服下读英文的恐惧),对于我这个5.2的版本(单机版,网上很多都是集群版),升级路线是这样的:
5.2.x ——》 5.6 ——》 6.8 ——》 7.17.12

  5.2.x ——》 5.6,直接下载5.6版本的elasticsearch(后面简说成es)、kibana、logstash,然后修改es的data目录指向原5.2的版本就能正常启动。

  直到遇到5.6升级到6,6升级到7,开始就比较麻烦了(尤其到7,要解决各个索引重建的问题,因为新版本的索引跟5版本是不兼容的!)

  先说下一个非常非常重要的点:升级失败会污染数据,导致不可用,而且还不可逆!什么意思?es配置文件:elasticsearch.yml 有个配置参数 path.data,上面说过,5.2到5.6的升级,5.6版本的es参数path.data直接指向5.2的就能用。但如果好巧不巧,例如后面想走捷径从5.6直接升到7(实际操作就是rpm 安装es、kibana、logstash的包),path.data改成5.6版本的(实际就是5.2的数据目录)启动的时候发现es再也无法启动了,你想用回5.6甚至是5.2的elk去启动也起不来。因为这个path.data 被新版本的es污染了,导致无法回退!!!

  所以其实最正确的方法是,我们从最原始的5.2的path.data (假设叫A path.data)复制一份一摸一样的,假设叫B path.data,升级时,es是指向B的,而不是原来的A。

问题一:5.6升级到6.8.23

  最大的问题是6版本的kibana起不来,说kibana索引需要重建,令人欣慰的是,不是数据索引要重建(我的测试环境有十几个)。虽然6版本的kibana起不来,但是6版本的es是能起来的,如果想看kibana控制台的,可以用回 5.6 的kibana启动。

kibana 6 起不来报错图:

解决:处理kibana索引问题
我是直接在kibana的dev tool运行的
1、设置只读:
PUT .kibana/_settings 
{"index.blocks.write":true}

2、创建 .kibana-6索引(参考链接直接复制吧,太长了)

3、重新索引.kibana 为 .kibana-6(linux命令行执行的)

curl -X POST "localhost:9500/_reindex?pretty" -H 'Content-Type: application/json' -d'
{
  "source": {
    "index": ".kibana"
  },
  "dest": {
    "index": ".kibana-6"
  },
  "script": {
    "inline": "ctx._source = [ ctx._type : ctx._source ]; ctx._source.type = ctx._type; ctx._id = ctx._type + \":\" + ctx._id; ctx._type = \"doc\"; ",
    "lang": "painless"
  }
}
'
4、旧索引的别名.kibana-6和.kibana删除旧.kibana索引:
curl -X POST "localhost:9500/_aliases?pretty" -H 'Content-Type: application/json' -d'
{
  "actions" : [
    { "add":  { "index": ".kibana-6", "alias": ".kibana" } },
    { "remove_index": { "index": ".kibana" } }
  ]
}
 

(1)未处理前叫:.kibana

 (2)处理后叫:.kibana-6

 

问题二:6.8.23升级到7.17.12

  官方及网上很多都叫用kibana自带的7.0升级助手来实现,长这样:

   有些索引可以自动处理(处理后,会新建一个一摸一样前缀为 reindex_ 的索引),但有些(譬如我设置了nginx日志格式,在5.2的版本通过filebeat写入的)说无法重建,只能手动处理(又是考英文的时候)

 

   手动处理这些无法自动重建的索引时,记得先做好es的快照(具体可以百度)

   赶着睡觉,直接贴步骤

1、未设置前:
GET 索引A/_settings
 返回:
"refresh_interval" : "5s",
"number_of_replicas" : "1",
 

2、设置(大抵有点像数据库的锁表):
PUT /索引A/_settings
{
  "index": {
    "refresh_interval": "-1",
    "number_of_replicas": "0"
  }
}

POST _reindex?wait_for_completion=false

{

"source": {

"index": "索引A"

},

"dest": {

"index": "new-索引A"

}

}

3、恢复及创建索引访问别名

PUT /new-索引A/_settings
{
   "index": {
    "refresh_interval": "5s",
    "number_of_replicas": "1"
  }
 
}

POST /_aliases
{
  "actions" : [
    { 
    "add" : { 
    "index" : "new-索引A", 
    "alias" : "索引A_latest" 
    } 
    },
     { 
    "remove" : { 
    "index" : "索引A", 
    "alias" : "索引A_latest" 
    } 
    }
  ]
}


删除旧索引
DELETE /索引A

 然后我们访问既可以是 new-索引A 也可以是  索引A _latest

参考:

https://zhuanlan.zhihu.com/p/548858458

https://blog.csdn.net/qq_22049773/article/details/103243852

  最后,我是建议大家非不得已,能用6.8就用6.8吧,7的kibana上有很多新功能,也涉及很多权限报错问题,要逐一解决,例如下面这个,而且用起来非常不习惯。