데이터베이스(DB)

DB 용어정리(HA, RAC, TTL, Cluster)

반도체는 프로그래밍을 좋아해 2023. 12. 26. 17:48
728x90

Redis 공부를 하던 중 DB(database)에 관한 모르는 용어가 너무 많아서 준비하였습니다.

먼저 HA에 대해 알기 전에 Redis에는standalone 모드와 Sentinel 모드가 있습니다. 이 두 가지 모드는 Redis 서버를 운영하고 관리하는 방식에 차이를 가지고 있습니다.

  1. Standalone 모드:
    • Standalone 모드는 가장 기본적인 Redis 서버 운영 방식입니다. 이 모드에서는 단일 Redis 인스턴스가 데이터를 저장하고 관리합니다. 단일 인스턴스는 메모리 내에서 모든 데이터를 관리하므로, 별도의 데이터 복제나 고가용성 기능이 없습니다. 하나의 Redis 서버가 데이터를 저장하고 처리하는 구조입니다. 이 모드는 단순한 개발 또는 테스트 환경에서 주로 사용될 수 있습니다.
    • 쉽게 말하자면 이 모드는 하나의 작은 상자에 모든 것을 넣는 것과 같습니다. 하나의 Redis 서버만 있고, 그 서버에 데이터를 넣고 꺼낼 수 있습니다. 하지만 만약 그 상자가 고장나면 그 안에 있는 모든 것을 잃을 수 있습니다. 그래서 주로 개발이나 간단한 실험용으로 사용합니다.
  2. Sentinel 모드:
    • Sentinel 모드는 Redis의 고가용성(High Availability)을 보장하기 위해 사용됩니다. 여러 개의 Redis 서버를 관리하고 이들 중 하나가 고장 나더라도 서비스 중단 없이 작동할 수 있도록 합니다. Sentinel은 마스터-슬레이브 구조로 동작하며, 마스터 Redis와 여러 개의 슬레이브 Redis를 관리하여 마스터가 다운될 경우 슬레이브 중 하나를 새로운 마스터로 자동 승격시킵니다.
    • 쉽게 말하자면 이 모드는 여러 개의 상자를 사용하는 것과 같습니다. 그러니까 데이터를 여러 곳에 분산하여 저장하는 겁니다. 그래서 한 상자가 고장나도 다른 상자에서 데이터를 복사해줍니다. 이 모드에서는 감시자 역할을 하는 노드들이 있어서 만약 한 상자가 망가져도 다른 상자가 자동으로 일을 대신하도록 해줍니다. 이렇게 하면 데이터를 잃지 않고도 계속해서 서비스를 유지할 수 있기 때문입니다.

Sentinel 모드에서는 여러 Sentinel 노드가 클러스터를 모니터링하고, 마스터 노드의 상태를 지속적으로 감시하여 필요할 때 자동으로 장애 복구를 수행합니다. 이를 통해 Redis 클러스터의 고가용성을 보장하고 장애 시에도 서비스를 지속할 수 있습니다.

Standalone 모드는 단일 Redis 인스턴스를 사용하여 데이터를 저장하고 관리하는 반면, Sentinel 모드는 여러 Redis 인스턴스를 관리하여 고가용성을 제공합니다. 선택은 사용 사례와 요구 사항에 따라 달라질 수 있습니다. 클러스터의 안정성과 가용성을 중시하는 경우에는 Sentinel 모드를 고려해볼 수 있습니다.

이제 HA에 대해 얘기해 보자면 Redis의 Sentinel 모드를 고려해서 얘기할 수 있습니다.

  • High Availability (고가용성):
    • 고가용성은 시스템이 장애나 오류가 발생해도 지속적으로 작동할 수 있는 능력을 말합니다. Redis에서 고가용성을 구현하는 방법 중 하나는 Redis Sentinel을 활용하는 것입니다. Redis Sentinel은 마스터-슬레이브 구조에서 마스터의 장애를 감지하고, 자동으로 슬레이브 중 하나를 마스터로 승격하여 서비스 중단 없이 작동하도록 보장합니다.

제가 주로 사용하는 C#을 예시로 들겠습니다.

using StackExchange.Redis;

class RedisExample
{
    static void Main()
    {
        // Redis Sentinel을 통한 고가용성 구성
        var options = new ConfigurationOptions
        {
            ServiceName = "Master", // Redis Sentinel에서 사용하는 마스터 이름
            CommandMap = CommandMap.Sentinel,
            EndPoints = { "sentinel1:26379", "sentinel2:26379", "sentinel3:26379" } // Sentinel 노드의 주소
        };

        var sentinelConnection = ConnectionMultiplexer.Connect(options);

        // Redis 서버와의 연결을 통해 작업 수행
        var db = sentinelConnection.GetDatabase();
        db.StringSet("key", "value");

        // 데이터 가져오기
        string value = db.StringGet("key");
        Console.WriteLine("Value: " + value);
    }
}

위 코드에서 ConfigurationOptions를 사용하여 Redis Sentinel을 설정하고, ConnectionMultiplexer를 통해 Redis 서버와의 연결을 관리합니다.

  • Real Application Cluster (RAC, Oracle 용어):
    • Oracle RAC는 Oracle 데이터베이스의 클러스터링 옵션 중 하나로, 여러 대의 서버(노드)에 하나의 데이터베이스를 구성하여 공유 디스크 공간을 통해 데이터를 공유하는 방식입니다. 이를 통해 데이터베이스의 가용성과 성능을 향상시키며, 하나의 노드에서 장애가 발생하더라도 시스템 전체가 영향을 받지 않고 작동할 수 있습니다.
  • Time-To-Live (수명 설정):
    • TTL은 데이터의 수명을 나타내며, Redis에서는 데이터에 TTL을 설정하여 해당 데이터가 자동으로 삭제되도록 할 수 있습니다. 이를 통해 캐시 데이터나 임시 데이터를 다룰 때 유용하게 활용됩니다. TTL을 설정하면 데이터가 일정 기간 이후에 자동으로 만료되어 공간을 절약하고 메모리를 최적화할 수 있습니다.

TTL을 사용하는 예시를 들면

using StackExchange.Redis;
using System;

class RedisTTLExample
{
    static void Main()
    {
        var redis = ConnectionMultiplexer.Connect("localhost");

        var db = redis.GetDatabase();

        // TTL을 설정하여 데이터 저장 (예: 30분 후 만료)
        db.StringSet("key", "value", TimeSpan.FromMinutes(30));

        // TTL 확인
        TimeSpan? ttl = db.KeyTimeToLive("key");
        Console.WriteLine("Time-To-Live for key: " + ttl);
    }
}

위 예시에서는 TimeSpan.FromMinutes(30)을 사용하여 "mykey"에 30분 동안의 TTL을 설정하고, KeyTimeToLive를 사용하여 TTL을 확인하는 방법을 보여줍니다.

  • Cluster (클러스터):
    • Redis 클러스터는 여러 대의 Redis 노드를 결합하여 단일 가상 데이터베이스를 형성하는 방식입니다. 각 노드는 특정 범위의 해시 슬롯을 관리하고 데이터를 분산하여 저장합니다. 클러스터를 통해 데이터의 분산 저장과 복제를 통해 성능을 향상시키고 고가용성을 제공합니다.
using StackExchange.Redis;
using System;

class RedisClusterExample
{
    static void Main()
    {
        var options = new ConfigurationOptions
        {
            // Redis Cluster 노드들의 주소
            EndPoints = { "127.0.0.1:7000", "127.0.0.1:7001", "127.0.0.1:7002" },
            // Redis Cluster 사용을 위한 설정
            CommandMap = CommandMap.Cluster,
        };

        var cluster = ConnectionMultiplexer.Connect(options);

        // Redis 클러스터에서 데이터 저장 및 조회
        var db = cluster.GetDatabase();
        db.StringSet("key1", "value1");
        db.StringSet("key2", "value2");
        
        string value1 = db.StringGet("key1");
        string value2 = db.StringGet("key2");

        Console.WriteLine("Value for key1: " + value1);
        Console.WriteLine("Value for key2: " + value2);
    }
}

이 코드는 Redis Cluster에 연결하여 데이터를 저장하고 조회하는 간단한 예시입니다. ConfigurationOptions를 사용하여 여러 Redis Cluster 노드의 주소를 설정하고, CommandMap을 통해 클러스터 사용을 명시합니다. 그런 다음 데이터베이스에 연결하고 데이터를 저장하고 조회하는 과정을 보여줍니다.

이렇게 다양한 용어들은 각각의 시스템에서 고가용성, 클러스터링, 데이터 수명 설정 등을 구현하여 안정적이고 효율적인 데이터 관리를 가능하게 합니다.

728x90