본문 바로가기
AEWS2기

4-5-3. Grafana SQLite3 - DB Lock 이슈

by yeongki0944 2024. 3. 30.

1. SQLite3 - DB Lock 이슈 및 원인 분석

  • nmon - 네트워크 사용량 모니터링
  • iostat - io 모니터링
  • /var/lib/grafana - 파일 크기 변화 모니터링
yum install epel-release
yum install nmon

sudo yum install sysstat
sudo iostst -u grafana

cd /var/lib/grafana
watch -n 1 'ls -al'

private 환경이라 테스트 관련 자료는 없음.

 

테스트 환경

  • EC2 50대(t2.mirco) CWAgent설치 및 메트릭 수집
  • EC2 50대에 대한 Alert 10개 생성 1분에 1번씩 평가

 

테스트 결과

  • 평가되는 주기로 10~15kb 네트워크 트래픽 발생
  • write iops 5~10MB/s 발생 (알람 평가주기와 일치)
  • Alert평가시 상태변화가 없으면 grafana.db 파일 용량 변화 없음

 

DB Lock이 발생하는 원인 추측

  • 운영 초기 DB Lock이 발생하였고, 조치까지 2주가 소요
    • DB Lock 발생시 Alert에 기록이 됨 > SQLite3 파일의 용량이 증가함 > 1.5G
  • SQLite3 - WAL을 적용했음에도 메모리가 튀는 현상 발생
  • 주로 Alert수정시 - 메모리 100% - Grafana 서버가 멈추는 현상 발생
    • sqlite의 db journal로 인해 t3.medium 메모리로가 부족한 현상으로 추측

[SQLite3][C++] Sqlite3 의 journal file 에 대해

SQLite 1탄, 이것만은 알고 넘어가자!

 

 

2. SQLite3 파라미터 튜닝

  1.  작업개요 : Grafana SQLite3 동시성 향상 작업을 위한 설정 변경 작업
  2.  작업내용:
    • EC2 AMI 백업
      • AWS 웹 콘솔 > EC2 > 인스턴스(그라파나 서버, ID 확인하기) > 체크 > (우 상단) 작업 - 이미지 및 템플릿 - 이미지 생성 - 재부팅 안함 활성화 체크 - 생성
    • SQLite3 파라미터 변경 작업
      • 설정 파일 위치 확인
        • sudo cat /etc/init.d/grafana-server | grep -i CONF_DIR
      • Grafana-server stop
        • sudo systemctl stop grafana-server
        • sudo systemctl status grafana-server
      • 설정 파일, DB파일 백업
        • sudo cp /etc/grafana/grafana.ini /etc/grafana/grafana.ini_backup
        • sudo cp /var/lib/grafana/grafana.db /var/lib/grafana/grafana.db_backup
      • SQLite3 설정 변경
        • sudo vi /etc/grafana/grafana.ini
        cache_mode = shared wal = true
      • 변경
      • Grafana-server start
        • sudo systemctl start grafana-server
        • sudo systemctl status grafana-server
        • sudo grep "HTTP Server Listen" /var/log/grafana/grafana.log | tail -n 5
  3. 서비스 영향도:
    • cache_mode (private에서 shared로 변경)
      • 동시에 여러 연결에서 데이터베이스를 읽고 쓸 수 있게 되어 동시성이 향상될 수 있습니다.
      • 다수의 사용자가 데이터를 조작할 때 성능이 향상될 수 있습니다.
    • wal (false에서 true로 변경)
      • wal(Write-Ahead Logging)은 SQLite의 트랜잭션 로깅 방식입니다.
      • wal이 false(비활성화)일 경우, 각 트랜잭션은 직렬적으로 기록합니다.
      • wal이 true(활성화)일 경우, 동시적인 읽기와 쓰기작업이 가능하지며, 응답 시간이 향상될 수 있습니다.
    • 변경 후 모니터링 해야 되는 사항
      • cache_mode 설정 변경으로 인해 메모리 사용량이 증가하고 시스템 부하도 더 높아질 수 있습니다.
      • wal 설정 변경으로 인해 SQLite3 DB파일의 크기가 더 커질 수 있으며, 디스크 공간을 더 많이 사용하게 됩니다.
  4. 장애 발생시 복구 방안
    • 설정파일 롤백
      • Grafana-server stop
        • sudo systemctl stop grafana-server
        • sudo systemctl status grafana-server
      • 설정 파일, DB파일 롤백
        • 장애가 발생한 설정파일 이름 변경
          • sudo mv /etc/grafana/grafana.ini /etc/grafana/grafana.ini_error
          • sudo cp /var/lib/grafana/grafana.db /var/lib/grafana/grafana.db_error
        • 백업 설정 파일로 교체
          • sudo cp /etc/grafana/grafana.ini_backup /etc/grafana/grafana.ini
          • sudo cp /var/lib/grafana/grafana.db_backup /var/lib/grafana/grafana.db
      • Grafana-server start
        • sudo systemctl start grafana-server
        • sudo systemctl status grafana-server
        • sudo grep "HTTP Server Listen" /var/log/grafana/grafana.log | tail -n 5
    • AMI 인스턴스 백업본을 사용한 인스턴스 롤백

 

3. DB 변경

 

grafana/database-migrator를 사용한 migration방안

제약사항

  • This script isn't compatible with older versions of sqlite. 
  • It doesn't work with sqlite 3.7.17 for example (which is the latest available on RHEL 7.9). 
  • It has been tested with sqlite 3.31.1+
systemctl stop grafana-server

git clone https://github.com/grafana/database-migrator.git
cd database-migrator
sudo cp sqlitedump.sh /var/lib/grafana/sqlitedump.sh
sudo cp escape.awk /var/lib/grafana/escape.aws
sudo touch /var/lib/grafana/grafana.sql
sudo /var/lib/grafana/sqlitedump.sh /var/lib/grafana/grafana.db > /var/lib/grafana/grafana.sql
vi /var/lib/grafana/grafana.sql

 

3.7버전의 SQLite를 사용중이라, 위에 스크립트는 사용하지 못하고, 수작업으로 대시보드, Alert 정보 이동함