Tag Archives: Database

샤딩과 파티셔닝의 차이점

이글은 Quora에 올라온 “What’s the difference between sharding and partition?“글의 질문과 모자이크 CTO가 답변한 내용을 번역한 글입니다.

샤딩(sharding)과 파티셔닝(partitioning)의 차이가 무엇인가?

분산 데이터베이스 시스템에서 샤딩과 파티셔닝이라는 단어를 종종 듣는다. 하지만 그들의 차이점을 잘 모르겠다. 그래서 이것들을 위키에서 검색해보았지만 여전히 혼란스럽다. 약간의 예제를 줄 수 있을까?

Tony Bako, Mosaic의 CTO의 답변

파티셔닝이란 퍼포먼스(performance), 가용성(availability) 또는 정비용이성(maintainability)를 목적으로 당신의 논리적인 데이터 엘리먼트들을 다수의 엔티티(table)로 쪼개는 행위를 뜻하는 일반적인 용어이다.

샤딩수평 파티셔닝(horizontal partitioning)과 동일하다. 데이터베이스를 샤딩하게 되면 기존에 하나로 구성될 스키마를 다수의 복제본으로 구성하고 각각의 샤드에 어떤 데이터가 저장될지를 샤드키를 기준으로 분리한다. 예를 들면, 나는 고객의 데이터베이스를 CustomerId를 샤드키로 사용하여 샤딩하기로 하였다. 0 ~ 10000 번 고객의 정보는 하나의 샤드에 저장하고 10001 ~ 20000 번 고객의 정보는 다른 샤드에 저장하기로 하였다. DBA는 데이터 엑세스 패턴과 저장 공간 이슈(로드의 적절한 분산 , 데이터의 균등한 저장)를 고려하여 적절한 샤드키를 결정하게 된다.

Horizontal Partitioning

Horizontal Partitioning

수직 파티셔닝(vertical partitioning)은 하나의 엔티티에 저장된 데이터들을 다수의 엔티티들로 분리하는것을 말한다. (마찬가지로 공간이나 퍼포먼스의 이유로) 예를 들면, 한 고객은 하나의 청구 주소를 가지고 있을 수 있다. 그러나 나는 데이터의 유연성을 위해 다른 데이터베이스로 정보를 이동하거나 보안의 이슈등을 이유로 CustomerId를 참조하도록 하고 청구 주소 정보를 다른 테이블로 분리할 수 있다.

Vertical Partitioning

Vertical Partitioning

요약하면 파티셔닝은 퍼포먼스, 가용성, 정비용이성등의 목적을 위해 논리적인 엔티티들을 다른 물리적인 엔티티들로 나누는것을 의미하는 일반적인 용어이다. 수평 파티셔닝 또는 샤딩은 스키마 복제 후 샤드키를 기준으로 데이터를 나누는것을 말한다. 수직 파티셔닝은 스키마를 나누고 데이터가 따라 옮겨가는것을 말한다.

[CentOS] MySQL to MariaDB Migration

기존에 MySQL을 5년이상 운영해오던 개인서버의 DB를 MariaDB로 변경하기로 하였습니다. 정말 신기할 정도로 다양한 MySQL기반의 웹서비스들을 구동중이던 서버에서 아무런 사이드이펙트 없이 마이그레이션이 가능했습니다. yum 기반에서 운영중인 CentOS를 기준으로 글을 작성하였습니다.

스크린샷 2014-01-06 오후 9.49.10

[링크]에 방문하여 자신의 배포본에 적당한 yum 설정을 찾은 뒤 /etc/yum.repos.d/ 안에 MariaDB.repo 파일을 생성하여 내용을 붙여넣기 합니다.

# MariaDB 5.5 CentOS repository list - created 2014-01-06 12:49 UTC
# http://mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/5.5/centos5-x86
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

이제 기존에 설치된 mysql을 삭제합니다. APM 환경일 경우 의존성이 있는 mysql-devel, php-mysql도 함께 삭제 됩니다.

$ yum remove mysql mysql-manual

삭제시에 기존의 설정파일인 /etc/my.cnf파일이 /etc/my.cnf.rpmsave로 바뀌어 저장되므로 /etc/my.cnf로 되돌려 줍니다. 이후에 필요한 MariaDB 패키지들을 설치해줍니다.

$ yum install MariaDB-client MariaDB-common MariaDB-compat MariaDB-devel MariaDB-server MariaDB-shared php-mysql

위의 명령을 통해 모든 필요한 MariaDB 패키지들의 설치가 완료됩니다. 기존의 MySQL에서 사용했던 설정파일을 그대로 사용해도 MariaDB에서 문제 없이 동작합니다. 하지만 한가지 생각해 볼 부분이 있는데 MariaDB는 내부 스토리지 엔진으로 MyISAM대신에 Aria를 사용합니다.

그러므로 기존의 설정의 key_buffer_size(key_buffer)와 동일한 값으로 aria-pagecache-buffer-size의 값을 설정해줄 필요가 있습니다. 만약 기존에 MyISAM 테이블을 사용하지 않고 있었다면 key_buffer_size64K정도의 매우 낮은 값으로 설정해 두길 권장합니다.

이제 MariaDB를 구동해봅시다. 이상하리만치 MySQL의 그것과 동일합니다.

$ /etc/init.d/mysql start

MariaDB 콘솔에 접속해 봅시다.  그 명령어조차 mysql입니다.

$ mysql
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 3662205
Server version: 5.5.34-MariaDB MariaDB Server

Copyright (c) 2000, 2013, Oracle, Monty Program Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>

일반적으로 아무런 문제없이 마이그레이션 작업이 끝납니다만 작은 오류가 발생할수도 있는데 이경우 mysql_upgrade를 실행해 주면 테이블 포맷등의 변동 사항을 업그레이드해줍니다.

참고 자료