코딩공부

redis를 사용하여 원하는 데이터 백업하기

integerJI 2025. 3. 16. 23:40

 

최근 글또 활동을 하며 마인크래프트를 즐기고 있다.

GCP를 사용해 서버를 열고 사용자와 함께 즐기고 있는데 같은 데이터 직군분께서 마크 데이터를 활용하여 통계를 내주시고는 하는데 이는 마크 서버에서 특정 데이터를 백업하고, 추출해야 하는 번거로움이 있었다. 

 

기존에는 크론탭을 이용해 정해진 시간마다 백업을 수행했다. 하지만 이는 불필요한 데이터까지 백업하게 되어 비효율적이었다. 따라서 실제 접속이 발생한 시간대만 백업하는 방식이 필요했고, 이 문제를 해결하기 위해 Redis를 도입했다. Redis를 활용하면 접속 상태를 실시간으로 감지하고 특정 조건에서만 백업을 실행할 수 있어, 불필요한 백업을 줄이고 서버 리소스를 절약할 수 있다. 이 과정을 적어보며 redis를 설치 & 적용하며 수행했던 명령어와 느낀 점을 적어본다.

 

 

크론탭으로 특정 시간마다 이렇게 데이터를 백업을 하고 있었다. 

 

이를 개선할 수 있는 방법은 무엇이 있을까? 고민을 하다 이 김에 redis를 사용해볼까? 하여 도전해 보기로 하였다.

현재 마크 서버에는 이렇게

 

특정 사용자가 로그인을 하면 스레드에 알림을 주는 파이썬 스레드가 돌고있다. 

 

이를 이용해서 사용자가 접속하여 접속 인원이 1명 이상인 날짜 + 사용자가 퇴장하여 접속 인원이 0명이 된 날짜의 데이터만 백업을 하면 좋을 것 같았다. 

 

이렇게 될 경우 특정지어서 데이터 분석에 효과를 줄 수 있지 않을까 ?! 싶다.

 

1. 레디스 설치

sudo apt install redis -y

sudo systemctl status redis

 

 

레디스를 설치하고 실행상태를 확인해보자.

 

 

 

2. Hello, Redis

pip install redis

import redis

# Redis 서버 연결
r = redis.Redis(host='localhost', port=6379, decode_responses=True)

# 테스트 데이터 저장
r.set("test_key", "Hello from Python!")
print(r.get("test_key"))

 

 

사용 중인 python 가상환경에 redis를 설치하고 서버에 연결하여 key를 가져와본다.

 

 

3. redis 함수 삽입

    for player in new_players:
        redis_client.lpush("mc_players", player)  # Redis 리스트에 플레이어 추가

 

특정 플레이어가 접속하면 Redis에 플레이어 추가 

 

    for player in left_players:
        redis_client.lrem("mc_players", 1, player)  # Redis 리스트에서 제거

 

플레이어가 퇴장하면 레디스에서 플레이어 제거 

 

여기서 가운데 인자인 1은

Redis의 LREM 명령어 중 리스트에서 특정 값을 제거할 때 사용한다. 

 

redis_client.lrem(name, count, value)

 

가운데 count가 의미하는 값은

count 값 동작 방식
0 리스트에서 해당하는 모든 값을 제거
1 왼쪽(0번째)의 값 부터 일치하는 값을 제거
-1 오른쪽(맨뒤)의 값 부터 일치하는 값을 제거
N 왼쪽부터 N개의 일치하는 값을 제거

 

이 정도이다. 

 

추가로 모든 플레이어가 나가면 백업을 실행할 수 있게 함수를 추가한다.

 

if redis_client.llen("mc_players") == 0:
    last_backup_time = redis_client.get("last_backup")

    if last_backup_time:
        last_backup_time = datetime.datetime.strptime(last_backup_time, "%Y-%m-%d %H:%M")
        now = datetime.datetime.now()
        
        if (now - last_backup_time).total_seconds() < 3600:
            print("최근 1시간 내에 백업이 실행되어 실행하지 않음.")
        else:
            print("백업 스크립트 실행 중...")
            subprocess.run(["backup_script.sh"])
            redis_client.set("last_backup", now.strftime("%Y-%m-%d %H:%M"))
    else:
        print("백업 스크립트 실행 중...")
        subprocess.run(["backup_script.sh"])
        redis_client.set("last_backup", datetime.datetime.now().strftime("%Y-%m-%d %H:%M"))

 

특정 플레이어 리스트가 0이 되면 특정 sh 파일을 실행하여 백업을 진행한다. 

 

 

서버를 관리하며 백업을 실행해 보자!

 

마무리.

따로 백업 스크립트를 사용하거나 크론탭으로 감지하여 실행해 볼 수 있었지만 간단하게 진행하는 미니 프로젝트 용으로는 redis를 사용해 보며 도입해 보면 좋을 것 같았다. 그래서 이번 서버의 경우 서버 접속 감지가 기존에도 사용이 되고 있었으며 특정 스크립트를 통해 백업 트리거가 목적이었다. 따라서 접속 상태를 리스트(LPUSH/LREM)로 간단하게 관리가 가능하고 메모리 기반으로써 실시간 응답속도가 빠른 redis를 도입한 이유이다.

 

만약 게임 서버에서 활동되는 모든 이벤트를 저장한 뒤 분석 도구와 연결하거나 여러 서버를 동시에 운영한다면 대용량 서비스인 kafka를 이용하는 것도 좋아 보인다.