본문 바로가기

Develop/DevOps

[Grafana] database is locked 에러 대응 + DB migration

반응형

 

쿠버네티스 환경에서의 grafana 작업을 진행하다가 계속해서 끊기는 문제가 발생하더니 더이상 접속이 안되는 현상이 발견됐다. grafana pod을 확인해보니 에러 로그와 함께 "database is locked"라는 로그가 계속해서 올라왔다.

 

일단 원인은

  • Grafana에서도 다양한 정보를 저장하기 위해 DB를 사용하는데 기본적으로 SQLite3를 사용하고있음
  • 하지만 SQLite3같은 경우 저장되는 정보량(또는 트래픽)이 커질경우 동시제어성이 떨어져서 기존작업이 이미 할당되어있다면 database is locked라는 에러구문이 발생할수도 있다고한다.
  • 그래서 웬만하면 트래픽이 클경우 MySQL, Postgresql을 사용해야한다.

가장 편한건 기존 데이터를 싹 버리고 새로 MySQL과 Grafana를 띄우면 좋겠지만, 이미 저장되어있는 데이터가 꽤되어서 DB 이전작업을 할수밖에없었다.

 

새로운 DB는 MySQL을 골랐고 이유는 일단 가장 익숙한 DB이기 때문이였음. 동시제어성 방면에서는 Postgresql과 성능상 크게 차이가 없을것이라고 생각이 들었다.

 

DB이전 작업을 위해 다음과 같은 작업을 진행했다.

 

  • Grafana의 DB를 먼저 로컬 머신으로 꺼내온다음. MySQL DB형식으로 전환을 진행.
    • 보통 Grafana DB파일은 /var/lib/grafana 경로 아래에 생성되어있다. 보통 이름은 grafana.db 로 되어있다.
    • MySQL DB형식으로 전환을 위해서는 https://github.com/grafana/database-migrator 해당 깃허브 레포를 사용했다.
    • 확인해본결과 MacOS에서는 실행이 안된다. Ubuntu에서는 정상작동되는점을 확인.
chmod +x sqlitedump.sh
./sqlitedum.sh grafana.db > grafana_mysql.db
  • MySQL deployment를 생성해준다.
    • 여기서 해줘야하는건 초기 세팅시 grafana라는 database를 생성해줘야한다. env.MYSQL_DATABASE를 활용했다.
  • Grafana와 기존에 연결되어있던 PVC를 해제를 해준다음에, grafana.ini파일을 수정해서 DB를 전단계에서 생성한 MySQL 에 연결되도록 수정한다. 아래는 수정 예시
#################################### Database ####################################
    [database]
    # You can configure the database connection by specifying type, host, name, user and password
    # as separate properties or as on string using the url properties.

    # Either "mysql", "postgres" or "sqlite3", it's your choice
    type = mysql
    host = mysql.grafana.svc.cluster.local:3306
    name = grafana
    user = root
    # If the password contains # or ; you have to wrap it with triple quotes. Ex """#password;"""
    password = admin

 

  • Grafana를 띄워주고, 로그를 보면서 MySQL에 연결되었는지 확인하고 정상적으로 Grafana가 뜰때까지 기다린다.
    • 가끔 해당 단계를 진행하면서 DB생성 실패할때가 있는데 (ex. duplicate문제등) 여러번 생성 시도하면 자동으로 해결된다.
  • 정상적으로 Grafana가 생성되면, Grafana deployment를 삭제한 이후 mysql pod으로 진입하여 아래와같은 명령어를 수행
    • grafana_mysql.db는 kubectl cp명령어로 복사해왔다.
    • 데이터가 많을경우 굉장히 오래걸림. 해당 작업에서는 13000줄 가량의 SQL구문이 실행됐다.
mysql -u root -p grafana < grafana_mysql.db
  • 다시 이전에 연결했었던 pvc를 Grafana와 연결해주고 grafana deployment를 생성해준다음 정상적으로 접속이 되는지 확인.
반응형