이번 포스팅에서는 저희 회사에서 아주 잘 사용하고 있는 AWS Aurora를 이해하기 위한 첫번째 포스팅 입니다.
우선 AWS Aurora는 분산처리를 위한 DB로 이를 이해하기 위해선 Replication에 대한 이해가 기초라고 생각했기 때문에 첫 번째 포스팅은 Replication을 이해하는 것으로 시작하겠습니다.
해당 글은 MySQL을 기준으로 합니다.
'두 개 이상의 DBMS 이용하여 Master/Slave (수직적)구조를 활용하여 DB의 부하를 분산 시키는 기술 입니다.'
Replication의 정의만 들어도 Replication 기술이 왜 탄생 했는지 알 수 있습니다. 서비스 사용자가 많아진다면 당연히 DB의 부하는 엄청나게 커질 것 입니다. 이렇게되면 Dead Lock이 발생할 확률이 높아지게 되며 이는 성능저하에 큰 기여를 할 것입니다.
어떻게 Replication 방식은 과부하 문제를 해결할까 해답은 Replication 구성을 보면 알 수 있습니다.
<이미지 출처: https://nesoy.github.io/articles/2018-02/Database-Replication>
Replication은 Master DB에는 Insert, Update, Delete 작업을 수행하도록 하고 Select 작업을 Slave DB에서 하도록 구성을 합니다.
그렇다면 왜 Select 작업을 따로 뺄까요?? 보통 select 작업이 시간이 많이 걸리기 때문 입니다. 데이터가 5만개가 있는데 Table Full Scan을 해야 하거나 한다면 시간을 엄청나게 잡아 먹을 것 입니다. 그리고 이 시간동안 다른 작업을 하지 못하게 되니 병목 현상의 주요 원인이라고 할 수 있습니다.
MySQL은 Replication을 '바이너리 로그'를 통하여 Replication이 이루어지는데 이 바이너리 로그가 무엇인지 알아보겠습니다.
Slave에 데이터를 복제할 때 로그기반으로 복제가 되며 MySQL이 제공하는 바이너리 로그에는 3가지 종류가 있는데 해당 글은 Replication에 대한 글이기 때문에 어떤 종류가 있는지는 넘어가도록 하겠습니다.
(궁금하신 분은 이 부분에 대해서 잘 정리 해주신 좋은 블로그가 있어 '링크'를 참고 해주세요)
MySQL 서버에서 Create, Alter, Drop과 같은 작업을 수행하면 MySQL은 그 변화된 이벤트를 기록하는데 이러한 변경사항들에 대한 정보를 담고 있는 이진 파일을 바이너리 로그 파일 이라고 합니다.
이때 show나 select와 같은 조회 문법은 제외 됩니다.
MySQL의 Replication은 기본적으로 비동기 복제 방식을 사용하고 있습니다. Master 노드에서 변경되는 데이터에 대한 이력을 로그에 기록하면 Relication Master Thread가 비동기적으로 이를 읽어서 Slave쪽으로 전송합니다.
<이미지 출처: http://cloudrain21.com/mysql-replication>
순서
각 스레드별 자세한 내용은 '여기'를 참고하세요
DB는 기본적으로 Read 작업에서 자원 소모가 많기 때문에 Read작업이 많아 성능 이슈가 발생한다면 경우 가장 먼저 고려해볼 전략 입니다.
Replication 적용 하여도 성능 향상을 체감 할 수 있습니다. 하지만 단점 또한 치명적이기 때문에 만능이라고 할 수는 없습니다.
다음에는'Clustering' 에 대해서 알아볼 예정 입니다. Clustering은 데이터 동기화를 진행하기 때문에 일관성을 보장하고 Fail Over를 지원하기 때문에 고가용성이 보장됩니다.
따라서 현재 수많은 기업에서 도입하고 있으며 분산처리에서 핵심 포인트로 자리 잡았습니다. 자세한 내용은 다음 포스팅에서 다루기로 하겠습니다.
감사합니다.