Primrose Docs
  • Home
    • ⛓️Blockchain
      • Avalanche
        • What is AVAX?
      • Ethereum
        • Ethereum Cancun Upgrade Explained(draft)
        • go-ethereum: gas estimate
        • Blockchain Transaction Lifecycle
        • Mempool
        • Gas optimization in Solidity, Ethereum
      • Solidity DeepDive
        • Meta transaction
        • solidity: patterns
        • UUPS vs Transparent
        • Solidity Interface
        • Smart contract storage
        • ERC-2981 Contract
        • Solidity modifier
        • Solidity delete keyword
        • How To Make NFTs with On-Chain Metadata - Hardhat and JavaScript
        • How to Build "Buy Me a Coffee" DeFi dapp
        • How to Develop an NFT Smart Contract (ERC 721) with Alchemy
        • Upgradeable Contract
        • Smart Contract Verification
      • Common
        • Eigenlayer
        • MultiSig(draft)
        • Chain-Based Proof-of- Stake, BFT-Style Proof-of-Stake
        • Byzantine Fault Tolerance
        • Zero-knowledge
        • Hierarchical Deterministic Wallet
        • Maker DAO
        • Defi
        • Uniswap
        • IBC
        • Cosmos
        • Gossip Protocol
        • Tendermint
        • UTXO vs Account
        • Blockchain Layer
        • Consensus Algorithm
        • How does mining work?
        • Immutable Ledger
        • SHA256 Hash
        • Filecoin
        • IPFS - InterPlanetary File System
        • IPFS와 파일코인
        • Livepeer
        • Layer 0
      • Bitcoin
        • BIP for HD Wallet
        • P2WPKH
        • Segwit vs Native Segwit
    • 📖Languages
      • Javascript/Typescript
        • Hoisting
        • This value in Javascript
        • Execution Context
        • About Javscript
        • tsconfig.json
        • Nest js Provider
        • 'return await promise' vs 'return promise'
      • Python
        • Pythonic
        • Python: Iterable, Iterator
        • Uvicorn & Gunicorn
        • WSGI, ASGI
        • Python docstring
        • Decorator in Python
        • Namespace in Python
        • Python Method
      • Go
        • GORM+MySQL Connection Pool
        • Context in golang
        • How to sign Ethereum EIP-1559 transactions using AWS KMS
        • Mongo DB in golang(draft)
        • Golang HTTP Package
        • Panic
        • Golang new/make
        • golang container package
        • errgroup in golang
        • Generic Programming in Golang
        • Goroutine(draft)
    • 📝Database
      • MongoDB in golang
      • Nested loop join, Hash join
      • DB Query plan
      • Index
      • Optimistic Lock Pessimistic Lock
    • 💻Computer Science
      • N+1 query in go
      • Web server 를 구성할 때 Thread, Process 개수를 어떻게 정할 것인가?
      • CAP
      • Socket programming
      • DNS, IP
      • URL, URI
      • TLS과 SSL
      • Caching(draft)
      • Building Microservices: Micro Service 5 Deploy Principle
      • Red Black Tree
      • AOP
      • Distributed Lock
      • VPC
      • Docker
      • All about Session and JWT
      • Closure
      • Singleton Pattern
      • TCP 3 way handshake & 4 way handshake
      • Race Condition
      • Process Address Space 
      • Call by value, Call by reference, Call by assignment
      • Zookeeper, ETCD
      • URL Shortening
      • Raft consensus
      • Sharding, Partitioning
    • 📒ETC
      • K8S SIGTERM
      • SQS
      • Git Branch Strategy: Ship / Show / Ask
      • Kafka
      • Redis Data Types
      • CI/CD
      • How does Google design APIs?
      • Minishell (42 cursus)
      • Coroutine & Subroutine
      • Redis
Powered by GitBook
On this page
  • Horizontal vs Vertical
  • Partitioning
  • Vertical Paritioning(수직 파티셔닝)
  • Horizontal Partitioning
  • Sharding
  • Horizontal Sharding
  1. Home
  2. Computer Science

Sharding, Partitioning

데이터베이스의 볼륨이 커질수록 RW 시 성능은 감소할 것이고, 병목지점이 될 확률이 높다.

따라서 이를 적절하게 분할 저장할 필요가 있는데, 샤딩과 파티셔닝은 그 방법중 하나이다.

둘의 개념과 그 차이점에 대해서 알아볼텐데, 우선 기본적으로 Horizontal 과 Vertical 에 대해서 짚고 넘어가자.

Horizontal vs Vertical

  • Horizontal: 레코드별로 분리하는 수평 분할을 뜻한다. 스키마 복제 후 사용자가 지정한 기준으로 분리한다.

  • Vertical: 스키마를 나누고 스키마에 따라 데이터가 분산되는 것을 뜻한다. 분할이 쉽지만, 변경이 일어나는 경우 추가 정렬이 필요할 수 있다.

Partitioning

파티셔닝은 데이터베이스의 분할을 나타내는 용어이나 일반적으로는 테이블을 여러 하위 집합으로 분리하는 것을 말한다.

Vertical Paritioning(수직 파티셔닝)

하나의 테이블 내에서 컬럼을 기준으로 분리하는 것을 말한다.

한 테이블에 매우 큰 데이터를 포함하는 컬럼이 있거나 너무 많은 컬럼이 존재하는 경우 테이블에 접근하는 비용이 매우 커진다.

이럴때 수직 파티셔닝을 통해 자주 접근하는 컬럼을 기준으로 테이블을 분리하여 성능 향상을 노려볼 수 있다.

Horizontal Partitioning

레코드 수가 많은, 데이터가 많이 축적된 테이블의 레코드를 수평으로 분할 하는 방법이다.

이 때 몇 가지 방법이 있다. 이 글에서 따로 다루지는 않는다.

  • Range

  • List

  • Hash

  • ...

파티셔닝을 사용하는 경우 PK 나 Unique key 의 변경이 필요할 수 있다.

테이블의 PK, Unique key 는 파티션 키가 포함되어야 하기 때문이다.

예를 들어, user_id 를 pk 로 사용하는 테이블을 created_at 으로 Range paritioning 하고자 할 수 있다.

이런 경우는 (user_id, created_at) 으로 PK 를 변경해주어야 한다.

Sharding

큰 테이블을 동일한 스키마를 가진 여러 데이터베이스 서버에 shard 단위로 분산 저장하는 방법이다.

물리적으로 다른 서버에 저장하기 때문에 트래픽이 분산되고, 가용성이 늘어난다.

반대로 여러 샤드에 있는 데이터를 조인할 때에는 어려움이 생긴다.

증가하는 워크로드에 따라 부하 분산이 필요한 경우나, 비대해진 데이터 볼륨으로 인해 복제 지연, 읽기/쓰기 성능 저하를 개선하기위해 스케일업을 고려할 수 있으나, 물리적인 한계로 더 이상 스케일업이 불가능한 시점이 오면 샤딩을 고려하는 것이 좋다.

반대로 말해서, 일정 수준까지는 스케일업을 하는게 더 좋을 수도 있을수 있겠다.

Horizontal Sharding

파티셔닝과 마찬가지로 기준에 따라 나뉜다.

  • Range: 컬럼 값으로 샤드를 지정하는, 파티셔닝에서의 Range 와 같은 방식이다.

  • Hash: Hash 함수를 통해 반환되는 값으로 샤드를 결정하는 방법이다.

  • ...

PreviousRaft consensusNextETC

Last updated 9 months ago

💻