본문 바로가기
Experience/Error FIx

Influx DB 의 캐시 메모리 오류 해결

by jaeaemin 2023. 5. 3.

 

1. 문제 상황

 

InfluxDB 사용 중 시스템이 주기적으로 셧다운 현상이 발생 

서버가 완전히 꺼지는 상태는 아니고, 쿼리 및 입력 수행이 안되고, CLI로 접속도 불가능한 상태로 서버가 유지되는 현상으로 센서 데이터의 출력이 안되는 상황이였습니다.

 

기존 서버에서 돌아가던 환경이였으나, 최근 db 서버 이전이 일어나면서 갑자기 생겨난 이슈로, 데이터가 redis와 influx 에 동시에 쓰여지고 있어서 데이터의 손실은 없었으나 서버가 다운되지 게속적으로 멈춤 상태가 되지 않도록 빠른 조취가 필요한 상황이였습니다.

 

 

우분투 OS위에서 influxdb 서버를 systmctl에 등록한 뒤 사용하고 있는 상황인데, systemctl로 status를 찍어봤을 때, 로그에서 snapshot을 압축 할 때, info 등급의 오류가 발생했습니다. 

 

 

 

1-1. 오류 내용

 

 

 

● influxdb-server.service - Influxdb_1.8-Server
   Loaded: loaded (/etc/systemd/system/influxdb-server.service; enabled; vendor preset: enabled)
   Active: active (running) since Tue 2023-05-02 13:34:51 KST; 21h ago
 Main PID: 10356 (influxd)
    Tasks: 84 (limit: 6143)
   CGroup: /system.slice/influxdb-server.service
           └─10356 /home/sonic/InfluxDB/influxdb-1.8.10-1/usr/bin/influxd -config /home/sonic/InfluxDB/influxdb-1.8.10-1/etc/influxdb/influxdb.conf

May 03 11:24:47 r540 influxd[10356]: ts=2023-05-03T02:24:47.657730Z lvl=info msg="Error writing snapshot" log_id=0hYgiDdl000 engine=tsm1 error="compaction in progress: open
May 03 11:24:47 r540 influxd[10356]: ts=2023-05-03T02:24:47.666810Z lvl=info msg="Cache snapshot (start)" log_id=0hYgiDdl000 engine=tsm1 trace_id=0hZrfKCW000 op_name=tsm1_c
May 03 11:24:47 r540 influxd[10356]: ts=2023-05-03T02:24:47.667150Z lvl=info msg="Error writing snapshot from compactor" log_id=0hYgiDdl000 engine=tsm1 trace_id=0hZrfKCW000
May 03 11:24:47 r540 influxd[10356]: ts=2023-05-03T02:24:47.667181Z lvl=info msg="Cache snapshot (end)" log_id=0hYgiDdl000 engine=tsm1 trace_id=0hZrfKCW000 op_name=tsm1_cac
May 03 11:24:47 r540 influxd[10356]: ts=2023-05-03T02:24:47.667203Z lvl=info msg="Error writing snapshot" log_id=0hYgiDdl000 engine=tsm1 error="compaction in progress: open
May 03 11:24:47 r540 influxd[10356]: ts=2023-05-03T02:24:47.759826Z lvl=info msg="Cache snapshot (start)" log_id=0hYgiDdl000 engine=tsm1 trace_id=0hZrfKZl000 op_name=tsm1_c
May 03 11:24:47 r540 influxd[10356]: ts=2023-05-03T02:24:47.759877Z lvl=info msg="Cache snapshot (start)" log_id=0hYgiDdl000 engine=tsm1 trace_id=0hZrfKZl001 op_name=tsm1_c
May 03 11:24:47 r540 influxd[10356]: ts=2023-05-03T02:24:47.760454Z lvl=info msg="Error writing snapshot from compactor" log_id=0hYgiDdl000 engine=tsm1 trace_id=0hZrfKZl001
May 03 11:24:47 r540 influxd[10356]: ts=2023-05-03T02:24:47.760487Z lvl=info msg="Cache snapshot (end)" log_id=0hYgiDdl000 engine=tsm1 trace_id=0hZrfKZl001 op_name=tsm1_cac
May 03 11:24:47 r540 influxd[10356]: ts=2023-05-03T02:24:47.760502Z lvl=info msg="Error writing snapshot" log_id=0hYgiDdl000 engine=tsm1 error="compaction in progress: open
~

 

 

 

 

 

 

 

1-2. 오류 내용

● influxdb-server.service - Influxdb_1.8-Server
Loaded: loaded (/etc/systemd/system/influxdb-server.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2023-05-03 11:54:14 KST; 24h ago
Main PID: 32964 (influxd)
Tasks: 85 (limit: 6143)
CGroup: /system.slice/influxdb-server.service
└─32964 /home/sonic/InfluxDB/influxdb-1.8.10-1/usr/bin/influxd -config /home/sonic/InfluxDB/influxdb-1.8.10-1/etc/influxdb/influxdb.conf

May 04 12:48:49 r540 influxd[32964]: ts=2023-05-04T03:48:49.092448Z lvl=info msg="Cache snapshot (end)" log_id=0hZtMAiG000 engine=tsm1 trace_id=0haDsTGW000 op_name=tsm1_cache_snapshot op_event=end op_elapsed=1.576ms
May 04 12:48:49 r540 influxd[32964]: ts=2023-05-04T03:48:49.092472Z lvl=info msg="Error writing snapshot" log_id=0hZtMAiG000 engine=tsm1 error="compaction in progress: open /var/lib/influxdb/data/pipe_database/seven_days/37660/000044545-000000001.tsm.tmp: too many open files"
May 04 12:48:49 r540 influxd[32964]: ts=2023-05-04T03:48:49.116222Z lvl=info msg="Cache snapshot (start)" log_id=0hZtMAiG000 engine=tsm1 trace_id=0haDsTN0000 op_name=tsm1_cache_snapshot op_event=start
May 04 12:48:49 r540 influxd[32964]: ts=2023-05-04T03:48:49.116743Z lvl=info msg="TSM compaction (end)" log_id=0hZtMAiG000 engine=tsm1 tsm1_level=1 tsm1_strategy=level trace_id=0haDsPT0000 op_name=tsm1_compact_group db_shard_id=37650 op_event=end op_elapsed=1000.265ms
May 04 12:48:49 r540 influxd[32964]: ts=2023-05-04T03:48:49.116935Z lvl=info msg="Error writing snapshot from compactor" log_id=0hZtMAiG000 engine=tsm1 trace_id=0haDsTN0000 op_name=tsm1_cache_snapshot error="compaction in progress: open /var/lib/influxdb/data/rmm_database/three_months/37650/000
May 04 12:48:49 r540 influxd[32964]: ts=2023-05-04T03:48:49.116962Z lvl=info msg="Cache snapshot (end)" log_id=0hZtMAiG000 engine=tsm1 trace_id=0haDsTN0000 op_name=tsm1_cache_snapshot op_event=end op_elapsed=0.750ms
May 04 12:48:49 r540 influxd[32964]: ts=2023-05-04T03:48:49.116971Z lvl=info msg="Error writing snapshot" log_id=0hZtMAiG000 engine=tsm1 error="compaction in progress: open /var/lib/influxdb/data/rmm_database/three_months/37650/000042794-000000001.tsm.tmp: too many open files"
May 04 12:48:49 r540 influxd[32964]: ts=2023-05-04T03:48:49.124926Z lvl=info msg="Error writing snapshot from compactor" log_id=0hZtMAiG000 engine=tsm1 trace_id=0haDsT7G000 op_name=tsm1_cache_snapshot error="compaction in progress: open /var/lib/influxdb/data/_internal/monitor/37640/000045398-0
May 04 12:48:49 r540 influxd[32964]: ts=2023-05-04T03:48:49.124952Z lvl=info msg="Cache snapshot (end)" log_id=0hZtMAiG000 engine=tsm1 trace_id=0haDsT7G000 op_name=tsm1_cache_snapshot op_event=end op_elapsed=71.007ms
May 04 12:48:49 r540 influxd[32964]: ts=2023-05-04T03:48:49.124959Z lvl=info msg="Error writing snapshot" log_id=0hZtMAiG000 engine=tsm1 error="compaction in progress: open /var/lib/influxdb/data/_internal/monitor/37640/000045398-000000001.tsm.tmp: too many open files"

 

May 04 12:48:53 r540 influxd[32964]: ts=2023-05-04T03:48:53.078233Z
  lvl=info msg="Error writing snapshot"
  log_id=0hZtMAiG000 engine=tsm1
  error="compaction in progress: open /var/lib/influxdb/data/utility_database/seven_days/37655/000044549-000000001.tsm.tmp: too many open files"

 

해당 오류를 살펴보면 InfluxDB 서비스가 계속 실행 중이며 정상적으로 작동하고 있지만, 파일을 열 때 "too many open files" 오류가 발생하여 스냅샷 및 컴팩션 작업이 실패한 것으로 보입니다

 

[sonic@r540:influxdb]$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.5 LTS
Release:        18.04
Codename:       bionic
[sonic@r540:influxdb]$ ulimit -n
1024

 

해당 명령어로 알아본 결과 파일 디스크립터 맥스치가 1024로 디폴트 값으로 설정된 것을 확인할 수 있습니다.

influxDB는 데이터 베이스와 각 RP에 해당하는 다수의 파일을 디스크립터를 이용하여 읽고 쓰면서, 데이터를 효율적으로 처리하기 때문에 파일 디스크립터를 적절히 설정하는 것이 중요합니다.

하지만 1024는 시계열 DB를 사용하는데 너무 적은 수치이고, 실제 사용 환경에서는 1만개에서 4만개 까지 선택되고 있다고 하니 이를 늘리는 것이 좋다고 판단되었습니다. 

 

 

 

2. 해결 방법

 

 

 

 

 

 

 

 

 

 

 

3. INFLUX 설정 파일의 DATA 섹션

 


InfluxDB의 구성 파일에서 "data"항목은 데이터베이스와 관련된 설정을 정의합니다. 다음은 각 항목의 자세한 설명입니다.

 

[1] 기본 설정 & 최적화

 


"dir": 이 항목은 InfluxDB가 데이터 파일을 저장할 디렉토리를 지정합니다. 기본값은 "/var/lib/influxdb/data"입니다.

 

"wal-dir": 이 항목은 InfluxDB가 write-ahead log (WAL) 파일을 저장할 디렉토리를 지정합니다. WAL은 InfluxDB에서 데이터를 쓰는 데 사용되는 방법 중 하나입니다. 기본값은 "/var/lib/influxdb/wal"입니다.

 

"max-series-per-database": 이 항목은 데이터베이스당 최대 시리즈 수를 제한합니다. 시리즈는 InfluxDB에서 데이터를 저장하는 방식 중 하나입니다. 기본값은 1000000입니다.

 

"max-values-per-tag": 이 항목은 태그당 최대 값 수를 제한합니다. 태그는 InfluxDB에서 데이터를 태그하기 위해 사용되는 메타데이터입니다. 기본값은 100000입니다.

 

"retention-autocreate": 이 항목은 데이터베이스 유지 관리 정책을 자동으로 생성할지 여부를 결정합니다. 기본값은 true입니다.

 

"retention-check-enabled": 이 항목은 InfluxDB가 데이터 유지관리 정책을 확인할지 여부를 결정합니다. 기본값은 true입니다.

 

"retention-check-period": 이 항목은 데이터베이스 유지 관리 정책을 확인하는 주기를 지정합니다. 기본값은 10m입니다.

 

"retention-create-period": 이 항목은 데이터베이스 유지 관리 정책을 생성하는 주기를 지정합니다. 기본값은 10m입니다.

 

"retention-default": 이 항목은 새 데이터베이스 생성시 기본적으로 적용되는 데이터 유지 관리 정책을 정의합니다. 기본값

은 "INF"입니다.

 

"wal-flush-interval": 이 항목은 InfluxDB가 WAL을 플러시하는 빈도를 제어합니다. WAL 플러시는 메모리와 데이터베이스 파일 간의 데이터 일치성을 유지하는 데 사용됩니다. 기본값은 10s입니다.

 

"wal-partition-flush-delay": 이 항목은 InfluxDB가 WAL 부분을 플러시하는 데 걸리는 시간을 제어합니다. WAL 부분은 WAL 내에서 관련된 측정 값의 그룹이며, 일반적으로 관련된 시간 범위에 따라 정렬됩니다. 기본값은 2s입니다.
이러한 설정을 조정하여 InfluxDB를 사용자의 요구에 맞게 최적화할 수 있습니다.


[2] 데이터 쿼리 및 로깅 동작 조절

 

"query-log-enabled": 이 항목은 InfluxDB의 쿼리 로깅을 활성화할지 여부를 지정합니다. 기본값은 false입니다.

 

"query-log-file": 이 항목은 쿼리 로그를 작성할 파일의 경로를 지정합니다. 기본값은 "stderr"입니다.

 

"trace-logging-enabled": 이 항목은 InfluxDB의 추적 로깅을 활성화할지 여부를 지정합니다. 기본값은 false입니다.

 

"trace-logging-dir": 이 항목은 추적 로그를 저장할 디렉토리를 지정합니다. 기본값은 "/var/log/influxdb"입니다.

 

"series-file-max-size": 이 항목은 InfluxDB가 각 데이터 파일에 저장하는 시리즈 수를 제한합니다. 시리즈는 InfluxDB에서 데이터를 저장하는 방식 중 하나입니다. 기본값은 1073741824입니다.

 

"series-id-set-cache-size": 이 항목은 InfluxDB가 검색할 때 캐시하는 시리즈 식별자 집합의 크기를 제한합니다. 기본값은 100000이며, 값이 높을수록 검색 속도가 빨라집니다.


[3] 캐시 및 데이터 파일 관리 동작 조절 

 

"cache-max-memory-size": 이 항목은 InfluxDB가 캐시로 사용할 수 있는 최대 메모리 크기를 지정합니다. 기본값은 104857600입니다.

 

"cache-snapshot-memory-size": 이 항목은 캐시 내에서 스냅샷을 유지하는 데 사용되는 메모리 크기를 지정합니다. 스냅샷은 쿼리 수행 시 캐시 내에서 실제 데이터를 복사하지 않고도 쿼리 결과를 제공하기 위해 사용됩니다. 기본값은 26214400입니다.

 

"cache-snapshot-write-cold-duration": 이 항목은 쿼리 결과가 캐시에 계속 유지되지 않고 새로 저장되어야 하는 상태를 결정하는 데 사용되는 시간을 지정합니다. 기본값은 "10m"입니다.

 

"compact-full-write-cold-duration": 이 항목은 InfluxDB가 데이터 파일을 세그먼트로 압축하는 데 사용하는 최대 시간을 지정합니다. 기본값은 "4h"입니다.

 

"compact-throughput": 이 항목은 InfluxDB가 데이터 파일 압축 속도를 제한하는 데 사용되는 처리량 제한 값을 지정합니다. 기본값은 50331648입니다.

 

 

[4] 데이터 파일 관리(저장 방식)  & 결과 반환 

 

"max-cache-size": 이 항목은 캐시에 저장할 수 있는 데이터 크기의 상한선을 정의합니다. 기본값은 1073741824입니다.

 

"max-index-log-file-size": 이 항목은 InfluxDB에서 인덱스 로그를 저장할 수 있는 최대 파일 크기를 정의합니다. 인덱스 로그는 데이터가 디스크에서 읽혀지고 쓰여지는 위치를 추적하기 위해 사용됩니다. 기본값은 104857600이며, 이 값 이상으로 파일이 커지면 InfluxDB는 새 파일을 생성합니다.

 

"max-open-shards": 이 항목은 InfluxDB에서 동시에 열 수 있는 샤드(데이터베이스의 데이터 조각) 수를 제한합니다. 기본값은 0이며, 이 경우 InfluxDB는 무제한으로 샤드를 열 수 있습니다. 이 값을 조절하여 InfluxDB의 메모리 사용량을 관리할 수 있습니다.

 

"max-row-limit": 이 항목은 InfluxDB에서 쿼리 결과로 반환할 수 있는 최대 행 수를 제한합니다. 기본값은 10000입니다.

 

"store-enabled": 이 항목은 InfluxDB가 데이터를 저장하는 모드를 지정합니다. "store-enabled"가 false인 경우 InfluxDB는 데이터를 수신하고 대상을 거부하며, "store-enabled"가 true인 경우 InfluxDB는 데이터를 수신하고 저장합니다. 기본값은 true입니다.

 

"tsm-use-madv-willneed": 이 항목은 InfluxDB가 메모리 맵 드 파일에서 페이지 단위로 읽기를 신호하는 경우("madvise - WILLNEED"라고 함) 사용되는 옵션을 지정합니다. 이 옵션은 파일 읽기 속도를 높이는 데 사용됩니다. 기본값은 false입니다.

 

 

[5] HTTP 및 HTTPS API 사용, 인증 및 보안

 

"tsm-use-mmap": 이 항목은 InfluxDB가 메모리 맵 파일을 사용하여 데이터를 저장할지 여부를 지정합니다. 메모리 맵 파일은 파일 내의 메모리 주소를 파이썬이 가져와 다룰 수 있는 것으로, 빠른 데이터 엑세스를 가능하게 합니다. 기본값은 true입니다.

 

"tsm-use-tsm-mmap": 이 항목은 InfluxDB가 TSM 파일 형식을 사용할 때 메모리 맵 파일을 사용할지 여부를 지정합니다. TSM은 InfluxDB에서 사용되는 데이터 파일 형식입니다. 기본값은 true입니다.

 

"admin-enabled": 이 항목은 InfluxDB의 Admin HTTP API를 사용할 수 있는지 여부를 지정합니다. 기본값은 true입니다.

 

"http-bind-address": 이 항목은 InfluxDB의 HTTP API가 바인딩할 IP 주소와 포트를 지정합니다. 기본값은 ":8086"입니다.

 

"https-enabled": 이 항목은 InfluxDB의 HTTPS API를 사용할 수 있는지 여부를 지정합니다. 기본값은 false입니다.

 

"https-certificate": 이 항목은 HTTPS API에서 사용할 인증서 파일을 지정합니다.

 

"https-private-key": 이 항목은 HTTPS API에서 사용할 개인 키 파일을 지정합니다.

 

"https-verify-client-certs": 이 항목은 클라이언트에서 제공된 인증서를 확인할지 여부를 지정합니다. 기본값은 false입니다.

 

[6] 데이터 수신, 인증, 쿼리 수행, 측정 값을 수집 및 보관 정책

 

"max-body-size": 이 항목은 InfluxDB에서 데이터 수신시 허용하는 최대 바이트 수를 정의합니다. 기본값은 536870912입니다.

 

"shared-secret": 이 항목은 InfluxDB와 통신하는 클라이언트에서 사용할 공유 비밀번호를 지정합니다.

 

"bind-address": 이 항목은 InfluxDB가 사용하는 IP 주소와 포트를 지정합니다. 대부분의 경우 ":8088"을 사용합니다.

 

"auth-enabled": 이 항목은 InfluxDB에서 인증을 사용할지 여부를 지정합니다. 인증을 사용하면 InfluxDB에 로그인하고 데이터 액세스를 제한할 수 있습니다. 기본값은 false입니다.

 

"max-select-point": 이 항목은 InfluxDB에서 쿼리할 수 있는 최대 포인트 수를 지정합니다. 포인트는 InfluxDB에서 데이터를 저장하는 방식 중 하나입니다. 기본값은 0이며, 이 경우 InfluxDB는 제한을 두지 않습니다.

 

"metrics-enabled": 이 항목은 InfluxDB에서 측정 값을 수집하도록 설정할지 여부를 지정합니다. 기본값은 true입니다.

 

"reporting-disabled": 이 항목은 InfluxDB가 사용 통계를 수집하도록 설정할지 여부를 지정합니다. 기본값은 false입니다.

 

"default-retention-policy": 이 항목은 새로운 데이터베이스가 생성될 때 적용되는 기본 유지 관리 정책을 설정합니다. 유지 관리 정책은 InfluxDB에서 데이터를 보관하는 방법을 지정합니다. 기본값은 "autogen"입니다.

 

[7] 샤드 관리 및 엔진 선택 (고급 동작)

 

"default-engine": 이 항목은 새로운 데이터베이스가 생성될 때 기본 엔진을 설정합니다. 엔진은 InfluxDB가 데이터를 저장하는 내부 메커니즘을 관리하는 용도로 사용됩니다. 기본값은 "tsm1"입니다.

"write-tracing": 이 항목은 InfluxDB에서 쓰기 시간 정보를 추적할지 여부를 지정합니다. 쓰기 추적은 InfluxDB에서 성능 튜닝과 디버그에 사용됩니다. 기본값은 false입니다.

"write-timeout": 이 항목은 InfluxDB에서 데이터 쓰기에 대한 타임아웃 값을 설정합니다. 기본값은 "10s"입니다.

"shard-precreation-enabled": 이 항목은 InfluxDB에서 사전 생성된 샤드를 사용할지 여부를 지정합니다. 사전 생성된 샤드는 InfluxDB가 데이터를 관리하는 방법으로 사용됩니다. 기본값은 true입니다.

"shard-precreation-delay": 이 항목은 InfluxDB에서 샤드를 사전 생성하는 지연 시간을 지정합니다. 기본값은 "10m"입니다.

"shard-precreation-check-interval": 이 항목은 InfluxDB에서 샤드를 사전 생성하는지 확인하는 주기를 지정합니다. 기본값은 "1h"입니다.

반응형

'Experience > Error FIx' 카테고리의 다른 글

Redis-Container  (0) 2023.05.08