728x90

시계열 데이터베이스는 기본적으로 다량의 데이터 포인트를 수집하여 보관하고, 시각화 도구를 이용하여 필요한 메트릭을 만드는 과정을 거치게 됩니다. 하지만 데이터 포인트가 지속적으로 쌓이게 되면 데이터를 조회하는 속도가 느려질 뿐만 아니라 스토리지의 공간 문제도 발생할 수 밖에 없습니다.

이 때 사용하는 것이 대용량의 데이터 포인트를 일정한 주기로 다시 요약하여 가공된 데이터로 만드는 것인데요, 롤업 혹은 리텐션이라는 용어로 많이 부릅니다. 처음 사회 생활을 시작했을 때는 RDBMS 에 쿼리를 만들어 배치 작업으로 주단위, 월단위 등의 리텐션 작업을 했던 기억이 새록새록 납니다 (아재 인증...)

InfluxDB 는 패키지를 이용하여 기본 값으로 제품을 설치했을 때, 리텐션 주기에 대한 설정이 켜져 있지 않습니다. 이 상태에서 데이터베이스를 생성하면 리텐션 주기에 맞추어 데이터를 롤업, 리텐션 하지 않고 라인 프로토콜을 통해 입력된 그대로 쌓아두게 됩니다. 시간이 흐름에 따라 데이터의 조회 속도가 느려지고 스토리지 문제의 영향이 생길 수 밖에 없겠죠?

출처 : wikipedia

InfluxDB 의 리텐션 자동 활성화 옵션 켜기

리텐션을 활성화 하고 리텐션 주기를 설정하기 위해서는 아래의 단계로 작업을 해야 합니다. 이미 데이터베이스를 생성해서 사용하고 있는 경우와 처음 생성하는 경우로 나뉘어 질텐데요, InfluxDB 설정 파일의 변경 이전에 만든 DB 인가, 이후에 만든 DB 인가로 설정 값이 적용되게 됩니다. 

InfluxDB 의 설정 파일은 CentOS 기준으로 /etc/influxdb/influxdb.conf 로 저장되어 있습니다. 이 파일을 열어서 초반부를 살펴보면 `retention-autocreate=true` 라는 옵션이 주석 처리 되어 있는걸 볼 수 있습니다. 데이터 베이스 생성시 자동으로 리텐션을 사용하도록 하기 위해서 주석문을 풀어야겠죠?

// CentOS 기준
$ vim /etc/influxdb/influxdb.conf

###
### [meta]
###
### Controls the parameters for the Raft consensus group that stores metadata
### about the InfluxDB cluster.
###

[meta]
  # Where the metadata/raft database is stored
  dir = "/var/lib/influxdb/meta"

  # Automatically create a default retention policy when creating a database.
  # retention-autocreate = true

  # If log messages are printed for the meta service
  # logging-enabled = true

리텐션 작업이 필요한지 확인하는 설정 항목은 조금 더 아랫쪽에 있습니다. vim 을 쓰고 있다면 슬래시를 눌러 키워드를 검색하여 위치를 빠르게 찾아가도록 하겠습니다. 주석처리 되어 있는 두가지 옵션을 활성화 해야 합니다. `enabled=true` 는 주기적인 점검시 정의된 리텐션 정책을 적용의 On, Off 역할이고, `check-internal` 은 점검을 수행하는 간격을 지정하는 값입니다. 

(vim 에서 /[retention] 을 입력하면 빠르게 찾을 수 있습니닷!)

###
### [retention]
###
### Controls the enforcement of retention policies for evicting old data.
###

[retention]
  # Determines whether retention policy enforcement enabled.
  # enabled = true

  # The interval of time when retention policy enforcement checks run.
  # check-interval = "30m"

 

리텐션 자동 활성화 확인하기

위의 옵션들의 주석 처리를 해제한 후 InfluxDB 를 재기동 했습니다. 재기동을 했으니 새로운 변경 사항이 반영되었겠죠? InfluxDB CLI 에 접근하여 새로운 DB 를 생성하여 설정 변경전에 생성한 DB 와 리텐션 정책이 어떻게 차이가 나는지 확인해 보도록 하겠습니다. 

// InfluxDB 재기동 (CentOS 7.x 이후 기준)
$ systemctl restart influxdb.service

// 리텐션 자동 생성 활성화 전에 만든 DB 의 정보
$ influx
Connected to http://localhost:8086 version 1.8.3
InfluxDB shell version: 1.8.3
> use encreport
Using database encreport
> show retention policies
name    duration shardGroupDuration replicaN default
----    -------- ------------------ -------- -------
autogen 0s       168h0m0s           1        true

// 리텐션 자동 생성 활성화후 DB 생성 및 정보 확인
>
> create database test
> use test
> show retention policies
name    duration shardGroupDuration replicaN default
----    -------- ------------------ -------- -------
autogen 0s       168h0m0s           1        true

어랏..? 생각과는 좀 다릅니다. 리텐션 자동 활성화를 선택 하건 하지 않건 변화가 보이지 않습니다. 자동 생성 되었음을 알려주는 이름인 `autogen` 을 가진 정책이 각 데이터베이스에 이미 존재합니다. 도대체 무슨일이 일어나는지 알수가 없어서 가장 처음에 나온 설정인 `retention-autocreate=false` 로 명시적으로 끈 뒤에 데이터베이스를 생성해 보겠습니다. 당연히 리로딩도 해주셔야 합니다!

> create database test2
> use test2
Using database test2
> show retention policies
name duration shardGroupDuration replicaN default
---- -------- ------------------ -------- -------

아하... 이런 것이었습니다. 설정의 주석을 풀던 풀지 않던 일단 기본 값은 `autogen` 정책을 만드는 것이었습니다. 어렵게 주석을 묶고 풀고 할 이유가 없었던 것 같은 느낌적 느낌입니다. 여튼, 기본 정책은 자동으로 잘 생성되니 다음 포스팅에서는 실제 정책을 만들어서 데이터베이스에 적용하는 방법을 살펴보도록 하겠습니다!

 


오늘의 교훈 : 기본 문서를 잘 읽자

 

Configure InfluxDB OSS | InfluxDB OSS 1.8 Documentation

Configure InfluxDB OSSThe InfluxDB open source (OSS) configuration file contains configuration settings specific to a local node.ContentConfiguration overviewInfluxDB is configured using the configuration file (influxdb.conf) and environment variables. If

docs.influxdata.com

 

728x90
728x90

influxDB 는 시계열 DB (TSDB) 입니다. 일반적인 SQL 문장을 사용할 수 있다보니 종종 TSDB 가 아닌 RDB 로 착각할때가 많습니다. 때문에 일어나는 해프닝이 참 많은데요, <SELECT INTO> 를 이용하여 Measurement 간에 데이터를 옮길 때도 종종 문제가 생기곤 합니다. 

사실 저 역시 infludDB 를 많이 사용해 보지는 못했습니다. 어쩌다 보니 다른 분이 운영하던 Graphite 에 저장하고 있던 데이터가 더 이상 적재되지 않고 있어 어디서부터 손을 대볼까하다 "새롭게 해보자!" 는 마음으로 influxDB 를 구성해서 쓰는 정도이기 때문입니다. 아시겠지만 무언가를 할 때마다 매번 새로운 기분이라...

우선, influxDB 에서 <SELECT INTO> 구문을 사용하기 전에 공식 문서를 한 번 읽어보는 것을 추천드립니다. influxDB 의 공식문서가 마음에 드는 점 중 하나는 설명만 나열하는 것이 아니라 샘플 쿼리와 같은 예시가 중간중간에 소개된다는 점입니다. 설명을 읽는 것도 중요하지만 샘플을 가지고 이해하는 것이 더 좋을떄도 많기 때문이지요!

InfluxDB 공식 문서의 <SELECT INTO> 구문 사용법

# 관련 URL : archive.docs.influxdata.com/influxdb/v1.0/query_language/data_exploration/#the-into-clause

 

Data Exploration | InfluxData Documentation

 

archive.docs.influxdata.com

여전히 많은 사람들이 RDB 사고 방식으로 TSDB 를 보고 있나 봅니다. 공식 문서에서도 <Common Issues> 항목으로 <Missing data> 가 있어서 빠르게 해결할 수는 있었습니다. TSDB 에 대한 인식, InfluxDB 의 Tag 에 대한 이해 없이 막 사용하다 보니 발생한 해프닝이겠죠? 사실 이렇게 글을 적고는 있지만 현업에서의 이슈 해결이 급하다 보니 Tag 에 대해 이해할 수 있는 문서들을 더 열람해 보지는 않았습니다. 공부하는대로 다음 포스팅으로 적을 것을 약속합니다 :-)

제 경우의 이슈는 Issue 1 에 설명된 부분이었습니다. RDB 에서 의례 했던 것처럼 아래의 구문으로 특정 값을 가진 데이터를 다른 Measurement 로 옮기려는 것이 제 의도였습니다. 하지만, where 절의 값을 바꾸면서 3회 정도 쿼리를 수행했지만, 목적지의 레코드 갯수는 턱없이 적었습니다. 

SELECT * INTO "new_table" FROM "old_table" WHERE "type"='audio'
SELECT * INTO "new_table" FROM "old_table" WHERE "type"='video'
SELECT * INTO "new_table" FROM "old_table" WHERE "type"='etc'

공식 문서의 Issue 1 에 나온 것처럼 <현재 Measurement 의 태그(tags)를 새로운 Measurement 의 필드(Fields)로 컨버트한다> 는 동작 때문이었습니다. 인지하지 못한 사이에 현재 Measurement 의 "type" 은 태그였던 것입니다. 왜냐구요? 아직 공부하지 못했습니다 ㅜㅜ 여튼 그런연유로 데이터가 계속 겹쳐 써지면서 제대로 이관이 되지 않았던 상황이었습니다.

역시나 문서에 나온것처럼 원래의 태그를 유지하기 위해서는 "GROUP BY *" 구문을 추가하여 사용하여 문제를 해결했습니다. 새로운 데이터베이스에 대한 이해가 부족한 상태에서 필요한 결과물을 빨리 얻으려다보니 생긴 해프닝입니다. 여러분들도 혹시 유사한 문제를 만난다면 구문을 살펴보고 GROUP BY 를 추가해 주면 이슈를 벗어날 수 있을겁니다!

SELECT * INTO "new_table" FROM "old_table" WHERE "type"='audio' GROUP BY *
SELECT * INTO "new_table" FROM "old_table" WHERE "type"='video' GROUP BY *
SELECT * INTO "new_table" FROM "old_table" WHERE "type"='etc' GROUP BY *

 

 

 

728x90
728x90

좋은 Practice 는 아니겠지만, 간단한 DB 조회를 위해서 mysql 이 제공하는 CLI 를 이용하는 경우가 다들 있으실 겁니다.

데이터를 조회 및 확인만 화면으로 한다면 특별히 문제 없겠지만 가끔을 엑셀 등의 도구로 데이터를 옮겨야 할 경우가 생기곤 합니다.

mysql CLI 의 기본 쿼리 결과는 결과를 테이블, 레이아웃, 혹은 박싱이라 불리우는 형태로 표현해 줍니다.

보기에는 좋지만 다른 도구에 붙여 넣기에는 영~ 불편한게 사실이죠


보기는 좋지만...


보기 좋은 떡이 먹기 좋다는 옛말이 있지만 이 박스를 좀 없애고 싶은 분들도 많으실겁니다.

박스를 없애려면 mysql CLI 구동시 몇 가지 옵션을 추가해 주셔야 합니다. 


$ mysql -u user_name_place -p -s -r

Enter password:

mysql>

mysql> use sys

mysql> select * from version;

sys_version     mysql_version

2.0.0   8.0.12


-s 옵션을 주면 일단 박스가 사라지긴 합니다. 

하지만 출력되는 데이터에 escape 처리를 하게 되니, 완벽한 RAW 데이터 추출을 위해서는

-s 옵션과 함께 -r 옵션을 주는 것이 좋습니다. 






728x90
728x90

mysql 8.x 이전 버전에서는 발생하는 이슈인지 조사를 해보진 못했습니다만

최소한 mysql 8.x 버전에서는 이 문제가 발생할 수 있는 상태입니다. 


제 경우 Grafana 에서 mysql 데이터 소스를 만들던 도중 에러를 만났고

소개해 드리는 링크에서 나온 것처럼 Go 로 만든 배치 스크립트에서는

동일한 이슈가 생기지 않았습니다.


// 에러메세지

this authentication plugin is not supported


문제는 강화된 보안 체계로 인해 외부 어플리케이션에서 사용되는 mysql 관련 모듈이

mysql 8.x 의 기본 값으로 설정된 패스워드 보안 알고리즘을 맞추지 못해서 발생하는 문제로 보입니다. 


해결 방법은 여러가지가 있지만 mysql 인스턴스 전체에 영향을 주지 않는 방법으로

사용자 단위로 패스워드 보안 정책을 변경하는 것이 가장 좋아 보입니다.


// mysql 8.x 의 기본 사용자 비밀번호 정책

caching_sha2_password


// 이슈 해결을 위한 비밀번호 정책

mysql_native_password



사용자 단위로 이를 적용하기 위해서는 alter user 를 사용하면 됩니다.

에러메세지를 만난 사용자를 대상으로 명령 수행후 에러가 사라진 것을 확인할 수 있으실 겁니다.


mysql> alter user 대상유저@'%' identified with mysql_native_password by '새비밀번호';


# 몇 가지 다른 대안까지 소개되고 있는 글 : https://github.com/go-sql-driver/mysql/issues/785


728x90

+ Recent posts