[파이썬] 데이터베이스 연동에서 샤딩과 파티셔닝

데이터베이스는 대규모의 데이터를 효율적으로 관리하기 위한 필수 도구입니다. 데이터베이스를 연동할 때는 샤딩(Sharding)과 파티셔닝(Partitioning)이라는 기술을 사용하여 데이터를 분산 저장하고 처리합니다. 이번 글에서는 파이썬을 사용하여 데이터베이스 연동에서 샤딩과 파티셔닝을 소개하겠습니다.

샤딩(Sharding)

샤딩은 데이터를 여러 개의 데이터베이스 서버에 분산 저장하는 기술입니다. 이를 통해 데이터베이스의 성능과 확장성을 향상시킬 수 있습니다. 보통은 데이터베이스의 특정 필드를 기준으로 데이터를 분할하여 각각의 서버에 저장합니다.

샤딩의 장점

샤딩의 단점

샤딩을 구현하기 위해서는 데이터베이스 서버를 설정하고, 데이터의 분할 방법을 결정하는 로직을 작성해야 합니다. 이러한 작업을 파이썬을 사용하여 수행할 수 있습니다.

import uuid
import hashlib
from pymongo import MongoClient

class Sharder:
    def __init__(self, num_shards):
        self.num_shards = num_shards
        self.shard_dbs = [self._get_shard_db(i) for i in range(num_shards)]
        
    def _get_shard_db(self, shard_id):
        client = MongoClient()  # 데이터베이스 서버 접속 정보 입력
        shard_db = client[f"shard_{shard_id}"]
        return shard_db
    
    def _get_shard_id(self, key):
        hash_object = hashlib.sha1(key.encode())
        hash_hex = hash_object.hexdigest()
        shard_id = int(hash_hex, 16) % self.num_shards
        return shard_id
    
    def insert_data(self, data):
        shard_id = self._get_shard_id(data['id'])
        shard_db = self.shard_dbs[shard_id]
        shard_db.collection.insert_one(data)
    
    def get_data(self, data_id):
        shard_id = self._get_shard_id(data_id)
        shard_db = self.shard_dbs[shard_id]
        return shard_db.collection.find_one({'id': data_id})
    
sharder = Sharder(num_shards=3)
data = {'id': str(uuid.uuid4()), 'name': 'John Doe', 'age': 30}
sharder.insert_data(data)

retrieved_data = sharder.get_data(data['id'])
print(retrieved_data)

위의 예시 코드는 MongoDB를 사용하여 데이터베이스 연동에서 샤딩을 구현한 것입니다. Sharder 클래스는 데이터를 샤드 별로 분산하여 저장하고 조회하는 기능을 제공합니다.

파티셔닝(Partitioning)

파티셔닝은 데이터를 논리적 또는 물리적으로 여러 개의 파티션에 분산 저장하는 기술입니다. 샤딩과 마찬가지로 데이터베이스의 성능과 확장성을 향상시킬 수 있습니다. 보통은 데이터베이스의 특정 열을 기준으로 데이터를 분할하여 각각의 파티션에 저장합니다.

파티셔닝의 장점

파티셔닝의 단점

파티셔닝을 구현하기 위해서는 데이터베이스 서버를 설정하고, 파티션 키를 결정하여 데이터를 분할하는 로직을 작성해야 합니다. 파이썬에서는 다양한 데이터베이스 라이브러리를 사용하여 파티셔닝을 구현할 수 있습니다.

import sqlite3
from datetime import datetime

class Partitioner:
    def __init__(self, num_partitions):
        self.num_partitions = num_partitions
        self.partition_dbs = [self._get_partition_db(i) for i in range(num_partitions)]
        
    def _get_partition_db(self, partition_id):
        conn = sqlite3.connect(f"partition_{partition_id}.db")  # 파티션 DB 생성
        c = conn.cursor()
        c.execute("CREATE TABLE IF NOT EXISTS data (id TEXT PRIMARY KEY, name TEXT, age INTEGER)")
        return conn
    
    def _get_partition_id(self, key):
        partition_id = hash(key) % self.num_partitions
        return partition_id
    
    def insert_data(self, data):
        partition_id = self._get_partition_id(data['id'])
        conn = self.partition_dbs[partition_id]
        c = conn.cursor()
        c.execute("INSERT INTO data (id, name, age) VALUES (?, ?, ?)", (data['id'], data['name'], data['age']))
        conn.commit()
    
    def get_data(self, data_id):
        partition_id = self._get_partition_id(data_id)
        conn = self.partition_dbs[partition_id]
        c = conn.cursor()
        c.execute("SELECT * FROM data WHERE id=?", (data_id,))
        return c.fetchone()
    
partitioner = Partitioner(num_partitions=3)
data = {'id': str(uuid.uuid4()), 'name': 'John Doe', 'age': 30}
partitioner.insert_data(data)

retrieved_data = partitioner.get_data(data['id'])
print(retrieved_data)

위의 예시 코드는 SQLite를 사용하여 데이터베이스 연동에서 파티셔닝을 구현한 것입니다. Partitioner 클래스는 데이터를 파티션 별로 분산하여 저장하고 조회하는 기능을 제공합니다.

결론

샤딩과 파티셔닝은 데이터베이스 연동에서 대용량 데이터 처리와 성능 향상을 위해 필수적인 기술입니다. 샤딩은 데이터를 분산 저장하여 확장성과 성능을 개선하며, 파티셔닝은 데이터를 물리적 또는 논리적으로 분할하여 관리 용이성과 처리 속도를 향상시킵니다. 파이썬을 사용하여 데이터베이스 연동에서 샤딩과 파티셔닝을 구현할 수 있으며, 이를 통해 더욱 효율적인 데이터 관리가 가능해집니다.