본문 바로가기메뉴 바로가기


kakao의 오픈소스 Ep5 – Almighty Data Transmitter

 

“카카오의 오픈소스를 소개합니다” 다섯번째는 gordon.hahn과 동료들이 개발한 ADT – Almighty Data Trasmitter입니다.

ADT는 샤드 구성이나 사딩 규칙이 바뀔 때 샤드를 재분배하는 용도로 만들기 시작했지만, MySQL에서 데이터를 수집하여 다른 MySQL로 데이터를 전송하는 – CDCETL이 결합된 – 만능 데이터 전송 도구로 변모하고 있습니다.

ADT는 그 자체로도 유용한 소프트웨어 도구지만, MySQL 기반의 CDC/ETL 시스템을 구축하기 위한 좋은 시작점이 될 것 입니다.

ADT는 무엇을 위한 툴인가요?

ADT는 MySQL의 데이터를 수집하여 사용자가 원하는 형태로 가공하거나 다른 DB에 적재할 수 있는 툴입니다. 크게 나누면 두 가지 용도가 있습니다.

  • 1회성 마이그레이션 작업
  • 실시간 마이그레이션 작업

각각에 대해 활용 예시는 다음과 같습니다.

  • 1회성 마이그레이션
  • 샤드 데이터 재분배 혹은 샤드 룰 변경(Modulus를 Range로, 혹은 반대로 변경)
  • 완전히 새롭게 설계한 스키마로 데이터 복사
  • 1일 1회 MySQL의 데이터를 OLAP DB로 복사
  • 실시간 마이그레이션
  • MySQL의 실시간 변경되는 데이터를 NoSQL로 복사하여 read 부하 분산
  • 어떤 특별한 write 이벤트를 감지해서 Push Notification 전송
  • 사용자의 GPS 정보를 기준으로 샤드 재구성 (가까이 있는 다른 사용자들 찾기에 편리하겠죠?)

이 외에도 여러 용도들이 있을 겁니다. 나머지는 여러분들의 상상력에 맡깁니다. 풀리퀘스트의 문은 활짝 열려있습니다 ^^;

ADT는 어떤 기능들이 있나요?

ADT 자체가 하는 일은 단순합니다.

  • MySQL에서 데이터 수집
  • Table Crawler: 각 테이블에 있는 데이터 수집
  • Binary Log Receiver: 실시간으로 변경되는 데이터 수집
  • 수집한 데이터를 사용자가 구현한 Custom Handler로 전달

ADT Overall Architecture

용도에 따라 Custom Handler를 구현하는 게 허들이라면 허들일 수 있지만, 샤드 재분배용 커스텀 핸들러의 소스 코드를 참조하면 그렇게 어렵지 않….을 겁니다. 아마도…요.(이 부분에 대해서는 다른 글을 통해서 더 자세히 알아보겠습니다)

현재는 MySQL에서만 데이터를 수집하지만, 인기가 많으면 더욱 다양한 DB가 추가될 수도 있습니다. 역시나! 풀리퀘스트의 문은 활짝 열려있습니다 ^^;

적용 사례

현재까지는 적용된 사례가 딱 하나 있습니다. 모 서비스의 테이블 스키마가 많이 변경되는 작업이었는데, 도저히 ALTER TABLE로 어떻게 할 수 있는 수준이 아니었다고 합니다. 테이블 스키마가 많이 바뀌어서 서비스 무정지 변경은 못했지만, ADT의 초기 버전을 이용해 무사히 마이그레이션 할 수 있었습니다.

ADT를 만들게 된 이유이자 핵심 목표인 샤드 재분배용 커스텀 핸들러는 현재 DB 엔지니어들과 안정성/정합성을 검증하는 단계입니다.

끝으로…

  • ADT 특징에 관한 좀 더 자세한 내용
  • 사용 방법
  • 요구 사항
  • 데이터 정합성에 관한 이야기

등등… 이 글에서 다루지 못한 많은 내용들이 README에 담겨있습니다. 현재까지 구현된 ADT 프레임웍 본체와 검증이 진행 중인 샤드 재분배용 커스텀 핸들러의 소스 코드는 아래 Github 사이트에서 확인할 수 있습니다:

  • https://github.com/kakao/adt

kakao 기술 블로그위키을 통해서 ADT의 활용 사례를 소개할 예정입니다. ADT가 이름처럼 전지전능한 도구가 될 수 있도록 여러분들의 많은 관심과 참여를 기대합니다.

special thanks to 성동찬 (한국카카오 카카오뱅크)

  • 커버 이미지 출처: Swiss Army Knife – 3 © [Tom Von Lahndorff](https://www.flickr.com/photos/tomvon/
  • 데이터베이스 아이콘 출처: http://www.seaicons.com/database-icon/
gordon.hahn
gordon.hahn
Top Tag
2021
2021-new-krew
adaptive-hash-index
adt
agile
agilecoach
ai
Algorithm/ML
Algorithm/Ranking
almighty-data-transmitter
android
angular
anycast
applicative
Architecture
arena
async
aurora
Backend
bgp
ble
blind-recruitment
block
blockchain
bluetooth
brian
cahtbot
cd
ceph
certificate
certification
cgroup
ci
cite
client
clojure
close-wait
cloud
cloudera-manager
clustered-block
cmux
cnn
code-festival
code-review
codereview
coding
competition
component
conference
consul
container
contents
contest
couchbase
COVID-19
cpp
Data
DB
deep-learning
developer
developer relations
developers
devops
digitalization
digitaltransformation
dns
docker
dr
employeecard
eslint
Feature List
Featured
friendstime
front-end
frontend
functional-programming
funfunday
fzf
garbage-collection
gawibawibo
GC
github
go
graphdb
graphql
growth
ha
hadoop
hbase
hbase-manager
hbase-region-inspector
hbase-snashot
hbase-table-stat
hbase-tools
hri
id
ifkakao
infrastructure
innodb
internship
ios
item
Java
javascript
json
kafka
kakao
kakao-commerce
kakao-games
kakaoarena
kakaocon
kakaok
kakaokey
kakaokrew
kakaomap
kakaotalk
KCDC
khaiii
kubernetes
l3dsr
l4
links
load-balancing
machine-learning
marathon
meetup
melon
mesos
Messaging
microservice
mobil
monad
mtre
mysql
mysql-realtime-traffic-emulator
nand-flash
network
new
new-krew
nfc
nomad
ocp
open
opensource
openstack
OpenWork
page
parallel
PBA
planning poker
programming-contest
pycon
python
quagga
react
reactive-programming
reactor
recommendation
recruitment
redis
redis-keys
redis-scan
related-blind
rest
rubics
ruby
rxjs
s2graph
scala
scalaz
server
service
sharding
shopping
socket
spark
spark-streaming
SpringBoot
ssd
Statistics/Analysis
Stomp
storage
storm
style-guide
support
System
talk
talkchannel
tcp
tech
test
Thread-Debugging
time-wait
tmux
typescript
update
User Story
vim
vim-github-dashboard
vim-plugin
vue
vue.js
web-cache
webapp
WebSocket
weekly
All Tag
2021
2021-new-krew
adaptive-hash-index
adt
agile
agilecoach
ai
Algorithm/ML
Algorithm/Ranking
almighty-data-transmitter
android
angular
anycast
applicative
Architecture
arena
async
aurora
Backend
bgp
ble
blind-recruitment
block
blockchain
bluetooth
brian
cahtbot
cd
ceph
certificate
certification
cgroup
ci
cite
client
clojure
close-wait
cloud
cloudera-manager
clustered-block
cmux
cnn
code-festival
code-review
codereview
coding
competition
component
conference
consul
container
contents
contest
couchbase
COVID-19
cpp
Data
DB
deep-learning
developer
developer relations
developers
devops
digitalization
digitaltransformation
dns
docker
dr
employeecard
eslint
Feature List
Featured
friendstime
front-end
frontend
functional-programming
funfunday
fzf
garbage-collection
gawibawibo
GC
github
go
graphdb
graphql
growth
ha
hadoop
hbase
hbase-manager
hbase-region-inspector
hbase-snashot
hbase-table-stat
hbase-tools
hri
id
ifkakao
infrastructure
innodb
internship
ios
item
Java
javascript
json
kafka
kakao
kakao-commerce
kakao-games
kakaoarena
kakaocon
kakaok
kakaokey
kakaokrew
kakaomap
kakaotalk
KCDC
khaiii
kubernetes
l3dsr
l4
links
load-balancing
machine-learning
marathon
meetup
melon
mesos
Messaging
microservice
mobil
monad
mtre
mysql
mysql-realtime-traffic-emulator
nand-flash
network
new
new-krew
nfc
nomad
ocp
open
opensource
openstack
OpenWork
page
parallel
PBA
planning poker
programming-contest
pycon
python
quagga
react
reactive-programming
reactor
recommendation
recruitment
redis
redis-keys
redis-scan
related-blind
rest
rubics
ruby
rxjs
s2graph
scala
scalaz
server
service
sharding
shopping
socket
spark
spark-streaming
SpringBoot
ssd
Statistics/Analysis
Stomp
storage
storm
style-guide
support
System
talk
talkchannel
tcp
tech
test
Thread-Debugging
time-wait
tmux
typescript
update
User Story
vim
vim-github-dashboard
vim-plugin
vue
vue.js
web-cache
webapp
WebSocket
weekly

위로