1. 글을 쓰게 된 이유

게임 서버를 운영하다 보면 단순 로그 저장을 넘어서, 유저 행동이나 컨텐츠 이용 현황, 재화 소비 흐름 같은 지표 데이터를 꾸준히 수집하고 분석할 필요가 생긴다.

이번 프로젝트에서는 게임 서버 지표를 별도로 관리하기 위해 InfluxDB를 도입했고, 이 글에서는 다음 내용을 기록용으로 정리해두려고 한다.

  • 왜 InfluxDB를 선택했는지
  • Docker를 이용해 InfluxDB 2.x를 실행하는 방법

초기 셋업 과정과 Node.js 연동 및 실제 지표 수집 코드는 다음 글에서 따로 정리할 예정이다.


2. InfluxDB를 선택한 이유

2.1. 기존 DB(MySQL 등)의 한계

초기에는 MySQL 같은 일반적인 RDB에 지표 데이터를 함께 저장하는 것도 고려했다. 하지만 실제로 운영하면서 다음과 같은 문제를 예상할 수 있었다.

지표 데이터의 양이 매우 많음

  • 유저 행동 기준으로 수집할 경우 데이터가 빠르게 증가
  • 시간이 지날수록 테이블 크기가 기하급수적으로 늘어남

집계 쿼리 부담

  • 일자별 / 시간대별 집계를 자주 호출해야 함
  • 운영 DB와 함께 사용 시 DB 락 발생 가능성
  • 실시간 서비스 쿼리와 분석 쿼리가 같은 DB를 공유하게 됨

분석 목적의 쿼리가 점점 복잡해짐

  • 시간 범위 기반 조회가 잦은데, 인덱스 설계가 까다로움
  • 집계 함수를 반복적으로 사용하면서 쿼리 성능 저하

지표 데이터가 쌓일수록 운영 DB의 성능과 안정성에 직접적인 영향을 줄 수 있다고 판단했다.

특히 게임 서비스는 실시간 응답이 중요한데, 분석 쿼리 때문에 게임 플레이가 영향을 받는 구조는 피하고 싶었다.


2.2. InfluxDB를 선택한 이유

그래서 지표 전용 DB를 검토했고, 다음 이유로 InfluxDB를 선택했다.

시간 기반(Time-Series) 데이터에 특화

  • 모든 데이터가 타임스탬프를 기준으로 저장됨
  • 시간 범위 조회가 기본적으로 최적화되어 있음

대량 데이터 쓰기에 유리한 구조

  • 배치 쓰기를 지원해서 한 번에 여러 데이터 포인트를 효율적으로 저장
  • 실시간으로 발생하는 대량의 지표 데이터를 안정적으로 처리

시간 범위 기준 조회 및 집계가 용이

  • Flux 쿼리 언어를 통해 시간 기반 집계를 직관적으로 작성 가능
  • "최근 7일", "시간대별 평균" 같은 쿼리를 간단하게 표현

시각화 도구와의 연동이 쉬움

  • Grafana 같은 시각화 도구와 즉시 연결 가능
  • 운영팀이나 기획팀에게 실시간 대시보드 제공이 쉬워짐

이번 프로젝트에서 수집하려는 데이터 성격과 InfluxDB의 설계 방향이 잘 맞는다고 판단했다.


2.3. 실제 수집 예정 지표 예시

  • 일자별 상품 구매량
  • 일자별 뽑기 횟수
  • 일자별 유저 컨텐츠 진입 정보

대부분 시간을 기준으로 분석하는 지표들이며, InfluxDB를 사용하는 이유가 명확한 케이스였다. 특히 "어제 대비 오늘 매출 증감률"이나 "시간대별 동접 추이" 같은 분석이 자주 필요한 상황이었다.


3. Docker로 InfluxDB 2.x 실행하기

이번에는 InfluxDB 2.x (latest) 기준으로 셋업했다. 로컬 및 서버 환경에서 동일하게 사용할 수 있도록 Docker Compose를 활용했다.

설계 당시에는 2.x가 최신 버전이었는데, 글을 작성하며 공식 문서를 확인해보니 이미 3.x가 릴리즈되어 있었다. 다만 Docker Docs에서는 원하는 버전의 이미지를 직접 지정해 사용할 수 있고, Docker Compose 설정 예시도 최신 기준으로 제공하고 있어 상황에 맞게 선택하면 된다.

3.1. Docker Compose 설정

# compose.yaml
name: influxdb2
services:
  influxdb2:
    container_name: influxdb2
    image: influxdb:latest
    networks:
      - default
    security_opt:
      - no-new-privileges:true
    ports:
      - 8086:8086
    volumes:
      - type: bind
        source: ./dbData/data
        target: /var/lib/influxdb2
      - type: bind
        source: ./dbData/core/config
        target: /etc/influxdb2

설정 포인트

  • 8086 포트로 InfluxDB UI 접근
  • 데이터 및 설정을 로컬 디렉토리에 바인딩하여 컨테이너 재시작 시에도 데이터 유지
  • InfluxDB 2.x 기준 디렉토리 경로 사용

3.2. 실행 명령어

$ docker compose up --build -d   # 이미지 다운로드 포함
$ docker compose up -d           # 일반 실행

 

정상적으로 실행되면 아래 로컬주소로 InfluxDB UI에 접근할 수 있다.

👉 http://localhost:8086

이 시점에서는 아직 계정이나 Bucket이 없는 초기 상태의 InfluxDB UI가 노출된다. 처음 접속하면 초기 설정 화면이 나오는데, 다음 글에서 이 과정을 정리할 예정이다.


4. 정리하며

이번 글에서는 왜 InfluxDB를 선택했는지, 그리고 Docker 환경에서 InfluxDB 2.x를 실행하는 것까지를 정리했다.

지표 데이터처럼

  • 양이 많고
  • 시간 기준 분석이 잦은 데이터는

처음부터 운영 DB와 분리해서 설계하는 것이 확실히 안정적이라고 느꼈다. 실제로 운영 DB와 분석 DB를 분리하니, 대시보드에서 집계 쿼리를 자주 실행해도 게임 서버 응답 속도에는 전혀 영향이 없었다.

다음 글에서는 순서대로

  • InfluxDB 초기 셋업 과정 (계정, Bucket 생성)
  • Node.js 서버에서 실제로 지표를 적재하는 방식
  • 사용 중인 데이터 구조와 쿼리

를 코드 중심으로 정리할 예정이다.


참고 링크

키바나는 기본적으로 포그라운드 실행으로 되어있다... 찾아보니 node와 pm2를 이용하여 백그라운드 실행하는 방법이 있어 진행했다.

 

노드를 이용하여 진행하므로 노드와 관련되어 세팅이 먼저 진행되어야한다.

1. nvm 설치

참고: https://github.com/nvm-sh/nvm 

위의 참고 사이트로 들어가면 nvm를 설치하는 방법이 쓰여있다.
curl 또는 wget으로 받으면 된다.

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash
wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash

nvm 실행

 . ~/.nvm/nvm.sh

 

2. Kibana에서 사용하는 node의 버전 세팅

다른 버전의 node는 실행되지 않는다고 한다.

위치 : kibana폴더/package.json

현재 확인한 버전은 16.16.0이다.

다운로드

nvm install 16.16.0

 

돌아가는지 확인하는 방법은 다음과 같다.

cd kibana폴더
nvm run 16.16.0 ./src/cli/cli.js

위 명령어가 오류 없이 돌아가면 된다.

위 명령어에서 확인할 수 있듯이 실행하는 파일은 cli.js라는 파일이다.

 

+. 오류

모듈이 없다는 내용의 node메시지가 나오면서 실행이 안되는 경우가 있다.

해당경우에는 압축파일이 제대로 안풀렸거나 하는 경우라 키바나를 지워서 다시 설치하거나 압축파일을 다시 해제하여 덮어쓰기하는 것을 제안한다.

 

3. pm2 설치

npm install -g pm2

 

4. 백그라운드로 실행하기

pm2 start ./src/cli/cli.js --name kibana

이제 위와 같은 명령으로 실행하면 백그라운드로 실행된다.

결과 화면은 다음과 같다.

 

5. 실행 파일 만들기

배시 명령어로 실행을 자동 세팅하기 위해 해당 파일을 만들었다.

sh start.sh
===내용===
#!/bin/bash

pm2 delete kibana
pm2 start ./src/cli/cli.js --name kibana

혹시 이전에 돌아가는 kibana 가 있을 수도 있기에 삭제후 생성으로 제작하였다.

'Open Source > Elasticsearch' 카테고리의 다른 글

Elasticsearch 오류 정리  (0) 2022.08.19
Kibana AWS 설치 및 초기 세팅  (0) 2022.08.18
AWS EC2에 Elasticsearch 설치하기  (0) 2022.08.18

1. vm.max_map_count 에러

참고: https://www.elastic.co/guide/en/elasticsearch/reference/current/vm-max-map-count.html 

sudo sysctl -w vm.max_map_count=262144

문서 추가 수정

 vi /etc/sysctl.conf
 아래 내용 추가
 vm.max_map_count=262144

시스템 적용

sudo sysctl -p

 

2. Elasticsearch 접근이 되지 않는 오류

https://(ip주소):9200

1. http가 아닌 https로 접근해야한다.

2. 키바나를 제외하고 접근이 안되는 오류에 대해 검색했을 때 가장 많이 뜨는 이유는 elasticsearch폴더/config/elasticsearch.yml 파일에 기본세팅에서 xpack.security.enabled관련된 부분이 true로 되어 있기 때문이라고한다. 하지만 해당 값을 false로 바꾸면 키바나에서 접근이 되지 않는다. 때문에 다른 해결방식을 찾아보았다.

discovery.seed_hosts: ["127.0.0.1", "[::1]", "localhost", "0.0.0.0"]

elasticsearch.yml파일에 접근 호스트에 관련된 값들을 모두 넣었더니 아래와 같이 접근이 되기 시작하였다.

여기에서도 계정정보를 입력하면 확인할 수 있다.(elastic 계정 등)

3. elasticsearch 터미널에서 로컬로 접근하기

보안처리 때문에 password를 입력하여야 한다.

curl --cacert ./elasticsearch-8.3.3/config/certs/http_ca.crt -u "elastic:<비밀번호>" -X GET https://localhost:9200/

'Open Source > Elasticsearch' 카테고리의 다른 글

Kibana, PM2로 백그라운드 실행  (0) 2022.08.20
Kibana AWS 설치 및 초기 세팅  (0) 2022.08.18
AWS EC2에 Elasticsearch 설치하기  (0) 2022.08.18

1. 설치

설치한 버전은 작성일(22.8.18)기준으로 가장 최신버전인 8.3.3 이다.

설치 참고(https://www.elastic.co/guide/en/kibana/8.3/targz.html)

curl -O https://artifacts.elastic.co/downloads/kibana/kibana-8.3.3-linux-x86_64.tar.gz
curl https://artifacts.elastic.co/downloads/kibana/kibana-8.3.3-linux-x86_64.tar.gz.sha512 | shasum -a 512 -c -
tar -xzf kibana-8.3.3-linux-x86_64.tar.gz

설치 방식은 Elasticsearch와 유사 하다.

압축을 푼 후 생성되는 폴더는 kibana-8.3.3으로 해당 디렉토리는 $KIBANA_HOME이 된다.

구성은 아래와 같다.

 

bin  config  data  LICENSE.txt  logs  node  node_modules  NOTICE.txt  package.json  plugins  README.txt  src  x-pack

 

2. 기본 설정 및 파일 수정

외부 접근을 허용해 주기 위해 다음과 같이 진행하였다.

cd kibana-8.3.3
vi config/kibana.yml

kibana.yml 파일 수정

server.port: 5601
server.host: "0.0.0.0"

server.host의 값이 기본 세팅이 localhost로 되어 있는데 해당 값을 "0.0.0.0"으로 수정되어야 한다.

 

3. 키바나 실행

초반 키바나 설치 삭제만 여러번하고 나서 오류들을 찾아보던 중 ELK가 생각보다 높은 사양으로 돌아가고 현재 사용하던 AWS서버의 사양에 돌아가지 않는다는 것을 깨달았다....

권장 사양 참조 : https://www.google.com/search?q=elasticsearch+%EA%B6%8C%EC%9E%A5+%EC%82%AC%EC%96%91

 

또한 OS별로 지원되는 ES와 Kibana 사양이 다르니 참고 해야한다. (https://www.elastic.co/kr/support/matrix)

 

위에 내용대로 새로운 AWS 서버에 설치하고 나니 Elasticsearch와 키바나가 실행되었다.

 

실행하고 아래 주소 접근하면 된다.

1. http://(ip주소):5601

2. 또는 키바나는 실행했을 때 뜨는 링크(http://(ip주소):5601/?code=(랜덤6자리))로 접속해도 된다.

키바나를 처음 실행 했을 때, 설정 안내문

위의 링크로 접근이 되지 않으면 먼저 방화벽을 확인해보아야한다. 해당 포트인 5601포트가 열려 있어야한다. 포트여는 내용은 생략한다.

 

접속하면 토큰값을 입력하라는 안내문구를 볼 수 있다. 해당 토큰은 Elasticsearch를 처음 실행했을 때 뜨는 토큰을 넣어주면 된다.

ℹ️  Configure Kibana to use this cluster:
• Run Kibana and click the configuration link in the terminal when Kibana starts.
• Copy the following enrollment token and paste it into Kibana in your browser (valid for the next 30 minutes):
<kibana token>

1번으로 접근했을 때는 6자리 숫자를 입력해주는 단계를 한번 더 거친다. 해당값은 키바나 창에서 볼 수 있다.

키바나 실행한 곳에서 확인할 수 있다.

위의 토큰 문구에서 확인할 수 있듯 토큰값을 입력하는 제한시간이 30분이므로 주의하자.

 

필자는 키바나 설치하고 다른 테스트 중에 다시 압축을 풀어서 config 폴더의 kibana.yml 파일을 덮어씌워버리는 실수를 해버렸다.. 복사를 해두던가 했어야 했는데 그대로 날려서 토큰을 재발급 받았어야했다.... 관련내용은 다음 글에 작성하려한다.

 

위에 과정 후 로그인이 뜨는데 처음에 생성된 사용자 값은 Elasticsearch에서 복사해두었던 토큰값과 같이 있다.

ℹ️  Password for the elastic user (reset with `bin/elasticsearch-reset-password -u elastic`):
<암호>

위내용은 id(user name): elastic pw:<암호> 가 된다.

해당값으로 접근하면 아래와 같이 확인할 수 있다.

'Open Source > Elasticsearch' 카테고리의 다른 글

Kibana, PM2로 백그라운드 실행  (0) 2022.08.20
Elasticsearch 오류 정리  (0) 2022.08.19
AWS EC2에 Elasticsearch 설치하기  (0) 2022.08.18

검색엔진 시스템을 구축하기 위해 사용한 Elasticsearch의 설치 과정을 기록한다.

 

Elasticsearch 공식 홈페이지에서 한글판 가이드를 보았는데, 버전이 5.4 였다..

해당 버전 가이드를 보면서 JDK 부터 설치해야 한다고 하길래 검색하던 중 Elasticsearch 7.0 버전부터는 필요한 open-jdk가 포함되어있어 설치를 먼저 진행하지 않아도 된다고 한다. (권장 JDK 버전 정보 : https://www.elastic.co/kr/support/matrix#matrix_jvm )

가이드를 찾아보니 최신 버전의 가이드는 영어로 버전 8.3까지 나와있다. [ 링크 https://www.elastic.co/guide/en/elasticsearch/reference/current/targz.html ]

해당 글을 작성할 때 v8.3.2로 나와있어 해당 버전으로 작업하였다.

추가적으로 Elastic 가이드북( https://esbook.kimjmin.net/02-install/2.2/2.2.1-download-install )을 참고하여 실행파일을 만들어 사용하였다.

1. 설치

압축파일 설치

$ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.3.2-linux-x86_64.tar.gz

2. 해시 검증

- 해당 과정은 파일이 제대로 받아졌는지 확인하는 기능이라고 보면 된다.

$ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.3.2-linux-x86_64.tar.gz.sha512
$ shasum -a 512 -c elasticsearch-8.3.2-linux-x86_64.tar.gz.sha512
-- 결과
elasticsearch-8.3.2-linux-x86_64.tar.gz: OK

3. 압축 풀기

tar -xzf elasticsearch-8.3.2-linux-x86_64.tar.gz

4. 실행

cd elasticsearch-8.3.2/
./bin/elasticsearch

여기서 elasticsearch-8.3.2 폴더는 $ES_HOME이다.

실행 종료는 Ctrl+C

 

4.1. 백그라운드 실행

-- 실행
$ ./bin/elasticsearch -d

-- 백그라운드로 실행중인 Elaticsearch 프로세스 검색
$ ps -ef | grep elasticsearch

-- 로그
$ head logs/elasticsearch.log

-- 종료
$ kill {프로세스ID}

종료 시 사용하는 프로세스 ID는 프로세스를 검색했을 때 확인할 수 있다.

 

-p {파일명} 을 사용하면 실행한 프로세스 ID를 특정 파일에 저장할 수 있다. 이를 이용하여 실행파일, 종료 파일을 만들 수 있다.

-- 백그라운드 실행 후 프로세스 ID 저장
$ ./bin/elasticsearch -d -p es.pid
-- 파일 내용확인
$ cat es.pid

실행 파일 start.sh

./bin/elasticsearch -d -p es.pid

종료 파일 stop.sh

kill `cat es.pid`

위 두 파일의 권한은 실행할 수 있도록 755로 변경해둔다.

$ echo './bin/elasticsearch -d -p es.pid' > start.sh
$ echo 'kill `cat es.pid`' > stop.sh
$ chmod 755 start.sh stop.sh

 

주의!!

Elasticsearch를 처음 실행했을 때 토큰값이 여러가지 뜬다. 해당 값을 복사해두자. 없으면 나중에 새로 발급받고 수정해야해서 복잡해진다..!

'Open Source > Elasticsearch' 카테고리의 다른 글

Kibana, PM2로 백그라운드 실행  (0) 2022.08.20
Elasticsearch 오류 정리  (0) 2022.08.19
Kibana AWS 설치 및 초기 세팅  (0) 2022.08.18

+ Recent posts