개요

Elasticsearch 및 키바나를 5.x에서 6.x로 업그레이드 할 때 .kibana Index의 경우 수동 마이그레이션을 해주거나 X-Pack 5.6을 활용하여야 한다.

필자는 X-pack을 사용하지 않아 수동 마이그레이션을 택했고 이 방법을 가이드를 보고 정리해둔다.
아래의 일련의 명령어들을 키바나 5.6.x에서 수행해주어야 한다.

해당 방법은 기존의 .kibana index를 지우므로 테스트로 실행해보거나 미리 실행해두는 것이 아니라
반드시 마이그레이션 직전에 수행해준다.

.kibana Read Only만들기

PUT .kibana/_settings
{
  "index.blocks.write": true
}

.kibana-6 Index 생성

PUT .kibana-6
{
  "settings" : {
    "number_of_shards" : 1,
    "index.mapper.dynamic": false,
    "index.format": 6,
    "index.mapping.single_type": true
  },
  "mappings" : {
    "doc": {
      "properties": {
        "type": {
          "type": "keyword"
        },
        "updated_at": {
          "type": "date"
        },
        "config": {
          "properties": {
            "buildNum": {
              "type": "keyword"
            }
          }
        },
        "index-pattern": {
          "properties": {
            "fieldFormatMap": {
              "type": "text"
            },
            "fields": {
              "type": "text"
            },
            "intervalName": {
              "type": "keyword"
            },
            "notExpandable": {
              "type": "boolean"
            },
            "sourceFilters": {
              "type": "text"
            },
            "timeFieldName": {
              "type": "keyword"
            },
            "title": {
              "type": "text"
            }
          }
        },
        "visualization": {
          "properties": {
            "description": {
              "type": "text"
            },
            "kibanaSavedObjectMeta": {
              "properties": {
                "searchSourceJSON": {
                  "type": "text"
                }
              }
            },
            "savedSearchId": {
              "type": "keyword"
            },
            "title": {
              "type": "text"
            },
            "uiStateJSON": {
              "type": "text"
            },
            "version": {
              "type": "integer"
            },
            "visState": {
              "type": "text"
            }
          }
        },
        "search": {
          "properties": {
            "columns": {
              "type": "keyword"
            },
            "description": {
              "type": "text"
            },
            "hits": {
              "type": "integer"
            },
            "kibanaSavedObjectMeta": {
              "properties": {
                "searchSourceJSON": {
                  "type": "text"
                }
              }
            },
            "sort": {
              "type": "keyword"
            },
            "title": {
              "type": "text"
            },
            "version": {
              "type": "integer"
            }
          }
        },
        "dashboard": {
          "properties": {
            "description": {
              "type": "text"
            },
            "hits": {
              "type": "integer"
            },
            "kibanaSavedObjectMeta": {
              "properties": {
                "searchSourceJSON": {
                  "type": "text"
                }
              }
            },
            "optionsJSON": {
              "type": "text"
            },
            "panelsJSON": {
              "type": "text"
            },
            "refreshInterval": {
              "properties": {
                "display": {
                  "type": "keyword"
                },
                "pause": {
                  "type": "boolean"
                },
                "section": {
                  "type": "integer"
                },
                "value": {
                  "type": "integer"
                }
              }
            },
            "timeFrom": {
              "type": "keyword"
            },
            "timeRestore": {
              "type": "boolean"
            },
            "timeTo": {
              "type": "keyword"
            },
            "title": {
              "type": "text"
            },
            "uiStateJSON": {
              "type": "text"
            },
            "version": {
              "type": "integer"
            }
          }
        },
        "url": {
          "properties": {
            "accessCount": {
              "type": "long"
            },
            "accessDate": {
              "type": "date"
            },
            "createDate": {
              "type": "date"
            },
            "url": {
              "type": "text",
              "fields": {
                "keyword": {
                  "type": "keyword",
                  "ignore_above": 2048
                }
              }
            }
          }
        },
        "server": {
          "properties": {
            "uuid": {
              "type": "keyword"
            }
          }
        },
        "timelion-sheet": {
          "properties": {
            "description": {
              "type": "text"
            },
            "hits": {
              "type": "integer"
            },
            "kibanaSavedObjectMeta": {
              "properties": {
                "searchSourceJSON": {
                  "type": "text"
                }
              }
            },
            "timelion_chart_height": {
              "type": "integer"
            },
            "timelion_columns": {
              "type": "integer"
            },
            "timelion_interval": {
              "type": "keyword"
            },
            "timelion_other_interval": {
              "type": "keyword"
            },
            "timelion_rows": {
              "type": "integer"
            },
            "timelion_sheet": {
              "type": "text"
            },
            "title": {
              "type": "text"
            },
            "version": {
              "type": "integer"
            }
          }
        },
        "graph-workspace": {
          "properties": {
            "description": {
              "type": "text"
            },
            "kibanaSavedObjectMeta": {
              "properties": {
                "searchSourceJSON": {
                  "type": "text"
                }
              }
            },
            "numLinks": {
              "type": "integer"
            },
            "numVertices": {
              "type": "integer"
            },
            "title": {
              "type": "text"
            },
            "version": {
              "type": "integer"
            },
            "wsState": {
              "type": "text"
            }
          }
        }
      }
    }
  }
}

필자의 경우 만에 하나 필요할 일이 있을까봐 아래와 같이 백업을 해두기로 한다.

  PUT .kibana5
  {
  "aliases": {},
  "mappings": {
    "timelion-sheet": {
      "properties": {
        "description": {
          "type": "text"
        },
        "hits": {
          "type": "integer"
        },
        "kibanaSavedObjectMeta": {
          "properties": {
            "searchSourceJSON": {
              "type": "text"
            }
          }
        },
        "timelion_chart_height": {
          "type": "integer"
        },
        "timelion_columns": {
          "type": "integer"
        },
        "timelion_interval": {
          "type": "text"
        },
        "timelion_other_interval": {
          "type": "text"
        },
        "timelion_rows": {
          "type": "integer"
        },
        "timelion_sheet": {
          "type": "text"
        },
        "title": {
          "type": "text"
        },
        "version": {
          "type": "integer"
        }
      }
    },
    "visualization": {
      "properties": {
        "description": {
          "type": "text"
        },
        "kibanaSavedObjectMeta": {
          "properties": {
            "searchSourceJSON": {
              "type": "text"
            }
          }
        },
        "savedSearchId": {
          "type": "text"
        },
        "title": {
          "type": "text"
        },
        "uiStateJSON": {
          "type": "text"
        },
        "version": {
          "type": "integer"
        },
        "visState": {
          "type": "text"
        }
      }
    },
    "url": {
      "properties": {
        "accessCount": {
          "type": "long"
        },
        "accessDate": {
          "type": "date"
        },
        "createDate": {
          "type": "date"
        },
        "url": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        }
      }
    },
    "dashboard": {
      "properties": {
        "description": {
          "type": "text"
        },
        "hits": {
          "type": "integer"
        },
        "kibanaSavedObjectMeta": {
          "properties": {
            "searchSourceJSON": {
              "type": "text"
            }
          }
        },
        "optionsJSON": {
          "type": "text"
        },
        "panelsJSON": {
          "type": "text"
        },
        "refreshInterval": {
          "properties": {
            "display": {
              "type": "text"
            },
            "pause": {
              "type": "boolean"
            },
            "section": {
              "type": "integer"
            },
            "value": {
              "type": "integer"
            }
          }
        },
        "timeFrom": {
          "type": "text"
        },
        "timeRestore": {
          "type": "boolean"
        },
        "timeTo": {
          "type": "text"
        },
        "title": {
          "type": "text"
        },
        "uiStateJSON": {
          "type": "text"
        },
        "version": {
          "type": "integer"
        }
      }
    },
    "_default_": {
      "dynamic": "strict"
    },
    "index-pattern": {
      "properties": {
        "fieldFormatMap": {
          "type": "text"
        },
        "fields": {
          "type": "text"
        },
        "intervalName": {
          "type": "text"
        },
        "notExpandable": {
          "type": "boolean"
        },
        "sourceFilters": {
          "type": "text"
        },
        "timeFieldName": {
          "type": "text"
        },
        "title": {
          "type": "text"
        }
      }
    },
    "server": {
      "properties": {
        "uuid": {
          "type": "keyword"
        }
      }
    },
    "search": {
      "properties": {
        "columns": {
          "type": "text"
        },
        "description": {
          "type": "text"
        },
        "hits": {
          "type": "integer"
        },
        "kibanaSavedObjectMeta": {
          "properties": {
            "searchSourceJSON": {
              "type": "text"
            }
          }
        },
        "sort": {
          "type": "text"
        },
        "title": {
          "type": "text"
        },
        "version": {
          "type": "integer"
        }
      }
    },
    "config": {
      "properties": {
        "buildNum": {
          "type": "keyword"
        },
        "dateFormat": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "dateFormat:tz": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "defaultIndex": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "discover:aggs:terms:size": {
          "type": "long"
        },
        "xPackMonitoring:allowReport": {
          "type": "boolean"
        },
        "xPackMonitoring:showBanner": {
          "type": "boolean"
        }
      }
    },
    "graph-workspace": {
      "properties": {
        "description": {
          "type": "text"
        },
        "kibanaSavedObjectMeta": {
          "properties": {
            "searchSourceJSON": {
              "type": "text"
            }
          }
        },
        "numLinks": {
          "type": "integer"
        },
        "numVertices": {
          "type": "integer"
        },
        "title": {
          "type": "text"
        },
        "version": {
          "type": "integer"
        },
        "wsState": {
          "type": "text"
        }
      }
    }
  },
  "settings": {
    "index": {
      "refresh_interval": "-1",
      "number_of_shards": "1"
    }
  }
}

Reindex

.kibana 색인을 .kibana6로 재색인한다. 핵심은 기존의 type정보를 없애는 것이다.

POST _reindex
{
  "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"
  }
}

백업을 위한 reindex는 아래와 같다.

POST _reindex
{
  "source": {
    "index": ".kibana"
  },
  "dest": {
    "index": ".kibana5"
  }
}    

Alias 변경

이제 새로 만들어진 .kibana-6를 .kibana 색인인것처럼 Alias를 걸어준다.

POST /_aliases
{
  "actions" : [
    { "add":  { "index": ".kibana-6", "alias": ".kibana" } },
    { "remove_index": { "index": ".kibana" } }
  ]
}

참고자료