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 에 대해
2. SQLite3 파라미터 튜닝
- 작업개요 : Grafana SQLite3 동시성 향상 작업을 위한 설정 변경 작업
- 작업내용:
- 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
- 변경
- 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
- 설정 파일 위치 확인
- EC2 AMI 백업
- 서비스 영향도:
- cache_mode (private에서 shared로 변경)
- 동시에 여러 연결에서 데이터베이스를 읽고 쓸 수 있게 되어 동시성이 향상될 수 있습니다.
- 다수의 사용자가 데이터를 조작할 때 성능이 향상될 수 있습니다.
- wal (false에서 true로 변경)
- wal(Write-Ahead Logging)은 SQLite의 트랜잭션 로깅 방식입니다.
- wal이 false(비활성화)일 경우, 각 트랜잭션은 직렬적으로 기록합니다.
- wal이 true(활성화)일 경우, 동시적인 읽기와 쓰기작업이 가능하지며, 응답 시간이 향상될 수 있습니다.
- 변경 후 모니터링 해야 되는 사항
- cache_mode 설정 변경으로 인해 메모리 사용량이 증가하고 시스템 부하도 더 높아질 수 있습니다.
- wal 설정 변경으로 인해 SQLite3 DB파일의 크기가 더 커질 수 있으며, 디스크 공간을 더 많이 사용하게 됩니다.
- cache_mode (private에서 shared로 변경)
- 장애 발생시 복구 방안
- 설정파일 롤백
- 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
- Grafana-server stop
- 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 정보 이동함