본문 바로가기
Dart/Dart Server

[추가학습] Dart 서버/ 분산 시스템 및 서버 확장성 / 분산 시스템의 개념과 Dart의 적용

by Maccrey Coding 2024. 9. 22.
728x90
반응형

 

Dart 서버와 분산 시스템: 기본 개념과 구성 방법

오늘은 분산 시스템의 개념과 이를 Dart 서버에서 어떻게 적용할 수 있는지에 대해 알아보겠습니다.

초보자도 쉽게 이해할 수 있도록 구성할게요.

분산 시스템의 기본 개념

분산 시스템은 여러 대의 컴퓨터가 네트워크를 통해 연결되어 함께 작업하는 시스템입니다. 이 시스템은 고가용성, 확장성, 내결함성을 제공합니다. 다음은 분산 시스템에서 자주 사용되는 개념입니다.

1. Consistent Hashing

Consistent Hashing은 데이터의 분산 저장을 효율적으로 관리하기 위한 알고리즘입니다. 서버의 수가 변해도 데이터의 재배치가 최소화되는 장점이 있습니다. 예를 들어, 서버가 추가되거나 제거될 때, 전체 데이터를 다시 배치할 필요 없이 일부 데이터만 이동하면 됩니다.

2. 분산 데이터 저장

분산 데이터 저장은 여러 대의 서버에 데이터를 나누어 저장하는 기술입니다. 이렇게 하면 데이터에 대한 요청을 여러 서버에서 동시에 처리할 수 있어 성능이 향상됩니다. 예를 들어, 사용자의 데이터를 여러 서버에 분산하여 저장하면, 서버의 부하를 줄일 수 있습니다.

Dart 서버에서 분산 시스템 구성하기

Dart를 사용하여 간단한 분산 시스템을 구성해 보겠습니다. 여기서는 Consistent Hashing을 사용하여 데이터를 분산 저장하는 방법을 소개합니다.

필요 패키지

pubspec.yaml 파일에 다음과 같은 패키지를 추가합니다.

dependencies:
  crypto: ^3.0.0

코드 예제

아래 코드는 Consistent Hashing을 구현하여 데이터를 여러 서버에 분산하는 예제입니다.

import 'dart:math';
import 'package:crypto/crypto.dart';
import 'dart:convert';

class ConsistentHashing {
  final List<String> _servers;
  final Map<int, String> _circle = {};
  final int _replicas;

  ConsistentHashing(this._servers, {int replicas = 3}) : _replicas = replicas {
    for (var server in _servers) {
      for (var i = 0; i < _replicas; i++) {
        final hash = _hash('$server-$i');
        _circle[hash] = server;
      }
    }
  }

  int _hash(String key) {
    return _generateHash(key);
  }

  int _generateHash(String key) {
    final bytes = utf8.encode(key);
    final digest = md5.convert(bytes);
    return digest.hashCode;
  }

  String getServer(String key) {
    if (_circle.isEmpty) return null!;
    final hash = _hash(key);
    final keys = _circle.keys.toList()..sort();
    
    for (var serverHash in keys) {
      if (hash <= serverHash) {
        return _circle[serverHash]!;
      }
    }
    return _circle[keys.first]!;
  }
}

void main() {
  final servers = ['server1', 'server2', 'server3'];
  final consistentHashing = ConsistentHashing(servers);

  // 테스트 키
  final keys = ['user1', 'user2', 'user3', 'user4', 'user5'];

  for (var key in keys) {
    final server = consistentHashing.getServer(key);
    print('Key: $key is mapped to $server');
  }
}

코드 설명

  1. ConsistentHashing 클래스: 서버 목록과 해시 원(circle)을 관리합니다.
    • _servers: 사용할 서버 목록입니다.
    • _circle: 해시 값과 서버를 매핑합니다.
    • _replicas: 각 서버가 얼마나 많은 가상 노드를 가질지를 설정합니다.
  2. _hash 메소드: 주어진 키의 해시 값을 계산합니다.
  3. _generateHash 메소드: MD5 해시 함수를 사용하여 문자열의 해시 값을 생성합니다.
  4. getServer 메소드: 특정 키에 대해 어떤 서버에 데이터를 저장할지를 결정합니다.
    • 해시 값이 가장 가까운 서버를 찾아서 반환합니다.
  5. main 함수: 서버를 설정하고 여러 키를 서버에 매핑하여 출력합니다.

Dart를 사용하여 간단한 분산 시스템을 구성하는 방법을 알아보았습니다.

Consistent Hashing을 통해 데이터 분산 저장을 효율적으로 관리할 수 있습니다.

분산 시스템은 확장성과 안정성을 제공하며, 이 기술을 통해 여러분의 서버를 더욱 강력하게 만들 수 있습니다.

 

구독!! 공감과 댓글은 저에게 큰 힘이 됩니다.

Starting Google Play App Distribution! "Tester Share" for Recruiting 20 Testers for a Closed Test.

 

Tester Share [테스터쉐어] - Google Play 앱

Tester Share로 Google Play 앱 등록을 단순화하세요.

play.google.com

 

 

728x90
반응형