지난 7월부터 2023 오픈소스 컨트리뷰션 아카데미라는 활동을 통해 오픈소스에 직접 기여하는 활동을 진행하게 되었다.
오픈소스라면 그저 사용할 줄 밖에 몰랐던 사람인데..
아직도 내가 스타 2000개 넘는 repo에 PR을 올리고 merge 시켰다는 사실이 믿기지 않는다..!!
총 20가지 이상의 프로젝트 중 python-mysql-replication이라는 오픈소스 프로젝트에 함께 참여했는데,
이번 글에서는 먼저 해당 오픈소스가 어떤 것인지 다뤄보고자 한다.
Python-mysql-replication 이 왜 필요할까?
먼저 python-mysql-replication (줄여서 PyMyRepl) 에 대한 공식 설명은 다음과 같다.
MySQL 복제 프로토콜에 대한 순수 python 구현체
(Pure Python implementation of MySQL replication protocol)
말만 들으면 3달 동안 봐온 나에게도 이해하기 좀 어렵지만.. 그냥 한마디로 하자면
"사용 중인 MySQL 데이터베이스에서 어떤 변화가 일어났는지 직접 조회하지 않아도 알 수 있게 해주는 패키지"이다.
왜 해당 패키지가 MySQL을 이용할 때 필요할까?
먼저 1명만 MySQL 데이터베이스를 이용하고 있다고 해보자. (엄청 과도하게만 사용하지 않는다면) 원하는 쿼리가 무리 없이 잘 수행될 것이다.
하지만 5명, 10명, .... 점점 무수하게 많아진다면? 아무리 성능 좋은 데이터베이스도 모든 처리량을 감당하지 못하고 점점 느려져서 응답 지연이 일어나고 죽어버릴지도 모른다.
그래서 이런 경우를 대비해서 데이터를 복제해서 메인 데이터베이스에 무리가 되지 않도록 이용하게 도와주는 것이다.
Replication Protocol
Replication Protocol은 데이터 및 시스템 상태를 복제할 때 어떻게 관리하고 유지할지 정의하는 프로토콜을 나타내는데,
Replication Protocol에도 다음과 같이 3가지 종류가 있다.
- Master-Slave Replication
: master라는 node가 write 작업을 수행하고, 다른 slave라는 node들이 전파(read)하는 역할을 담당하는 것이다.
slave에서는 master와 데이터를 동기화시키고 read 작업을 처리하게 된다. - Multi-Master Replication
: 여러 node들이 write / read 작업을 독립적으로 수행하는 것으로, 각 node에서 업데이트될 때마다 다른 node로 전파시키게 된다. - Leader-Based Replication
: leader node가 write 작업을 조정하고, 다른 follower node들에게 작업을 복제시킨다.
follower node들은 read 작업을 처리하고 자신 상태를 leader와 동기화시키게 된다.
이 중 PyMyRepl은 Master-Slave Replication을 따른다.
메인 MySQL 데이터베이스를 Master로 두고, Master는 특정 작업이 일어나는 내역을 파일로 기록해둔다.
이 파일을 Binary Log라고 하며, Slave에서는 이를 기반으로 해서 Master에서 변경된 내역을 파악해서 전달해준다.
Binary Log - Event
Binary Log에는 Event라는 데이터 변경 최소 단위로 기록이 된다.
Event는 대표적으로 아래와 같은 여러 필드로 구성되어 있다.
- Common-Header
: 생성 시점(timestamp), 종류(event type), 생성 서버 id, 크기 등 Event에 대한 주요 정보를 담고 있다. - Post-Header
: Event에 대한 부가 정보(metadata)가 담기게 된다. - Body (Payload)
: Event에 대한 실질적인 데이터가 담기는 곳으로, DDL은 쿼리가 필드로 남고 DML은 변경된 정보들이 필드로 남는다.
종류는 DDL / DML 쿼리에 따라 크게 2가지로 나눌 수 있다.
- Query Event : DDL 쿼리 요청마다 생성되는 이벤트
- Rows Event : DML 쿼리 요청마다 생성되는 이벤트
본격적으로 처음 기능적인 부분 기여를 시도했던 것이 바로 이 Event를 추가 구현하는 것이었는데,
MySQL에는 정의되어 있지만 아직 PyMyRepl에는 구현되지 않은 Event를 구현하는 작업이었다.
다음 글에서 어떤 과정을 통해서 Event를 추가 구현하게 되었는지 살펴보고자 한다.
References
https://www.linkedin.com/pulse/replication-consensus-protocols-yeshwanth-n/
https://dev.mysql.com/doc/dev/mysql-server/latest/page_protocol_replication.html
'COMPUTER SCIENCE > PYTHON' 카테고리의 다른 글
[OSSCA] python-mysql-replication - UserVarEvent 구현하기 (0) | 2023.12.20 |
---|---|
[OSSCA] python-mysql-replication - RandEvent 구현하기 (0) | 2023.10.04 |
[Python] dateutil import 오류 해결 (0) | 2021.10.14 |
[Python] 카멜 / 파스칼 / 스네이크 표기법 변환 (0) | 2021.06.28 |
[Python] pygraphviz 설치 오류 해결 (0) | 2021.05.11 |