캐시서버인 Redis 를 MySQL/MariaDB 플러그인으로개발 MySQL Redis Plugin 공개 SW 개발자 Lab 오픈소스프론티어 2 기이형채
MySQL 5.6 이전까지는 Memcached가 UDF(User Defined Function) 형태로제공되었으나, MySQL 5.6부터는플러그인 (Plugin) 형태로제공되었다. 이시점에서 Memcached + MySQL 보다는 Redis + MySQL이더많이사용되기시작했다. 불과몇년사이에 Key-Value Database 1위와 2위자리가뒤바뀌었고, 그격차는더심화되었다. 그에반해서 Oracle MySQL, MariaDB, Percona는 Redis Plugin을개발하지않고있다. 이는예전처럼 Memcached, Redis Key-Value Database를빌트인캐시서버 (Built-in Cache Server) 로쓰기보다는분산캐시 (Distributed Caced) 를별도의레이어 (Layer) 로처리하는형식으로바뀌었기때문이다. 그럼에도불구하고아직까지도 Plugin 형태로쓰고있는사용자와서비스들이있으며 Memcached보다는 Redis 사용자가월등히많아졌기때문에 Redis Plugin 개발은필요하다. [ 그림 1] 구글트렌드 Memcached (blue) vs Redis (red) [ 목차 ] 1 분산캐시 (Distributed Cache) 2 Memcached 소개 3 Redis 소개 4 프로젝트개요 5 프로젝트현황 6 적용분야 7 Open Source DBMS 기술동향 - Oracle MySQL - MariaDB - Percona - PostgreSQL
1 분산캐시 (Distributed Cache) 분산캐시시스템 1) 일반적으로캐시라하면데이터나값을미리복사해놓는임시장소를가리킨다. 계산또는저장된값을읽기위해특정장소에접근하는시간이오래걸릴경우, 해당소요시간을줄이기위해서캐시가만들어졌다. 즉, 캐시는빠른접근을가능하게하는효율성에집중되어있다. 캐시는 CPU 성능을높이기위한 L1, L2, L3 캐시를사용하는 CPU 캐시, 디스크의내용을 RAM 에저장하는 DISK 캐시, web 브라우저의캐시나 ios, Android와같은미들웨어, 애플리케이션에서사용하는단말애플리케이션단위의캐시, DB나웹서버, 대용량서버에서사용하는분산캐시등으로크게나눌수있을것이다. 분산환경또는서버환경에서개발하면서만들고경험했던캐시시스템을소개하고, 분산캐시의대표주자인 Redis와 Memcached 등이만들어지게되는배경을살펴보고자한다. 웹서비스와같은일반적이고기초적인서버, DB의아키텍처는 [ 그림 2] 와같다. L4와같은네트웍장치와방화벽과요청에대한내용은그림에서제외했다. 서버에서요청을받고처리하고처리된정보를 DB에저장하거나서버로데이터를전달한다. [ 그림 2] 기초적인서버, DB 연동아키텍쳐 2 Memcached 소개 1 < 웹진 122 호 : 공학트렌드 > 대용량서비스를지탱하는분산캐시시스템 Part 1 - http://www.sweng.kr/member/customer/webzine/boardview.do?boardid=00000000000000022837&currpage=1& searchprefaceid=&titorder=&writeorder=®dtorder=&searchcondition=tot&searchkeyword= redis
Memcached 및웹서비스소개 2) Memcached는 Facebook, Twitter, Reddit, YouTube와같은클라우드및웹서비스제공회사에서사용하는 key-value 메모리캐시로, 웹데이터를소비자에게서비스하는데있어지연시간을줄이고데이터베이스및컴퓨팅서버에대한증설을줄여준다. Latency를줄이는것외에도 Memcached의확장성있는아키텍처 (scale-out) 는 Memcached 서버를간단하게추가만하여처리량을높일수있다. 그러나코어수가 4개를넘으면성능저하가발생하기때문에수직 scalability(scale-up) 에는문제가있다. Memcached는 Key-Value 쌍으로이뤄진간단한데이터타입을저장하며, NoSQL 데이터베이스와유사하지만 NoSQL처럼영구적 (persistent) 이지는않다. Memcached는모든 Key- Value 쌍을메모리에저장하므로서버장애나오류가발생했을때저장된데이터가모두손실된다. 이글에서는키 (key) 와해당키의값 (value) 을지칭할때 ' 캐시항목 (cache item)' 이라는용어를사용한다. 이때키는고유한값이다. 웹서비스아키텍처에서 Memcached 애플리케이션은그림 2에서보는바와같이프론트엔드 (Front-end) 웹서버 ( 또는계층 (tier)) 와백엔드 (Back-end) 데이터베이스사이에위치한다. 2 네이버 D2 - http://d2.naver.com/helloworld/151047
[ 그림 3] 프론트엔드웹계층및백엔드데이터베이스사이에위치하는 Memcached 서버 3 Redis 소개 Redis 캐시 3) Redis는 REmote DIctionary Server의약자이며, 웹로그분석시스템의성능을높이기위해서개발되었다. BSD 라이선스 (Three Clause BSD License) 오픈소스기반이다. DB-Engine 선호도랭킹에따르면선호도 1위를기록하고있다. Redis 홈페이지는심플한화면구성을가지고있다. 문서와다운로드링크, 명령어, 언어별클라이언트, 이슈트래킹화면, 지원정보, 라이선스등을포함하고있다. 3 < 웹진 123 호 : 공학트렌드 > 대용량서비스를지탱하는분산캐시시스템 Part 2- http://www.sweng.kr/member/customer/webzine/boardview.do?boardid=00000000000000022844
[ 그림 4] Redis Single Instance Architecture 4) 4 프로젝트개요 MySQL Redis Plugin MySQL 데이터베이스서버는세계에서제일널리사용되는오픈소스데이터베이스다. 매우효율적인아키텍처를채택하여빠른성능과쉬운사용자구성을가능하게해준다. 소프트웨어내적으로다량의코드재사용과풍부한기능생산에대한최소화기법은최고의속도와압축성 (compactness), 안정성과용이한 deployment를보장해주는데이터베이스관리시스템을탄생시켰다. 테이블핸들러 (table handler) 에서코어서버 (core server) 를분리하는독창적인방식은정교한트랜잭션제어 (transaction control) 또는트랜잭션이필요없는초고속의디스크액세스 (disk access) 를구현하도록해주었고, 이와같은기능은모든상황에제일적합한방식이다. 5) Redis 는오픈소스이며네트워크화 (network), 인메모리데이터베이스 (in-memory database), 선택적영구성 (durability) key-value 데이터저장소 (key-values data store) 이다. DB- Engines.com 의월간랭킹에따르면, 레디스는가장인기있는 key-value 저장소이다. 최근에는데이터증가로인한부하때문에 MySQL 샤딩 (sharding) 만으로는 transaction( 트랜 잭션 ) 을감당하기어려운경우가많다. 그래서 MySQL 을단독으로쓰기보다는어플리케이션 4 http://qnimate.com/overview-of-redis-architecture/ 5 MySQL 소개 - http://www.linux.co.kr/database/mysql/product/mysql/index.htm
(application) 또는프록시 (proxy) MySQL 사이에캐시서버 (cache server) 또는인메모리 key-value 저장 (in-memory key-values store) 방식을통해서 DBMS 부하를줄이고, 응답시간 (response time) 을높이는방식을많이채택하고있다. 그중에서도 Memcached와 Redis를 Google, Twitter, Facebook, LINE, Daum Kakao 등과같은글로벌서비스업체들이사용하고있다. Memcached 는예전부터 MySQL 유저들이많이사용했다. MySQL 5.5 버전까지는사용자정 의함수 (UDF) 혹은데몬플러그인 (daemon plug-in) 이제공되다가 MySQL 5.6 버전부터는 InnoDB 엔진에통합된 Plug-in 을제공하고있다. [ 그림 5] MySQL Memcached Plug-in Architecture 6) 최근 cluster architecture 보다는 shading architecture가더각광받고있는추세에부합하여 Redis는 Memcached 보다더많이쓰이고있다. 그런데그에반해서 MySQL Plug-in이존재하지않는다. 따라서 UDF 형태로사용하거나, 개별적으로구현하여사용하고있다. 이는 MySQL + Memcached 조합의초창기구성방식이다. 최근에각광받고있는 Redis의 Plug-in을개발함으로써이런단점을보완하고, 캐시아키텍 6 4Q14 OSSCON - http://www.slideshare.net/leehyeongchae/20141105-osscon-mysqlredisplugin- 41155534
처의유연함, 개발및관리의편의성을높이고자한다. 향후에는 MySQL, MariaDB 에소스를기여 (contribution) 하여 GA(General Availability) 버전에 포함되길바란다. 5 프로젝트현황프로젝트초기에예상했던것보다 MySQL Memcached Plug-in 소스분석과 InnoDB 통합형태의소스분석에시간을많이소비하였다. 이는 Memcached Plug-in 소스와 Membase s Memcached 7) 소스의차이, 불확실한 Plug-in 소스버전정보에서기인한다. 또한소스에도많은부분에서수정이가해졌다. 현재는 Daemon Plug-in 개발완료, InnoDB Plug-in 베타릴리즈완료후 QA와디버깅을진행중이다. [ 그림 6] MySQL Redis Plugin Architecture 8) 6 적용분야 Redis 와 MySQL/MariaDB 를사용하는분야에는대부분적용가능하고구글, 트위터, 링크드인, 페이스북, 라인, 카카오톡등과같이오픈소스데이터베이스를널리사용하고있는기업에서 7 Couchbase - http://en.wikipedia.org/wiki/couchbase_server 8 4Q14 OSSCON - http://www.slideshare.net/leehyeongchae/20141105-osscon-mysqlredisplugin- 41155534
많은활용이예상된다. 또한, Redis 는 DB-Engines Raking of Key-value Stores 9) 에서순위가 1 위이며 2 위인 Memcached 와대비해도 3 배이상높은점수인만큼인기있는 Key-value Stores 이다. Rank Dec 2014 DBMS Database Model Score Dec 2014 1 1 Oracle Relational DBMS 1497.55 +37.76 2 2 MySQL Relational DBMS 1298.54 +29.96 3 3 Microsoft SQL Server Relational DBMS 1123.16-76.891 4 5 MongoDB Document Store 301.09 +54.87 5 4 PostgreSQL Document Store 280.09 +26.09 23 27 MariaDB Relational DBMS 27.74 +10.41 96 82 Percona Relational DBMS 1.58 +0.38 [ 표 1] DB-Engines Ranking 10) 7 Open Source DBMS 기술동향최근몇년사이에글로벌웹서비스들이성공을거두면서많은오픈소스소프트웨어가개발되었고, 각광받고있다. 대부분의서비스들이관계형데이터베이스시스템 (Relational DBMS) 를기반으로데이터를저장및처리하고있다. 2015년가트너매직쿼드런트 (Gartner magic Quadrant) 에는 Percona(+TokuDB) 가추가되었고, Oracle(+MySQL), MariaDB, EnterpriseDB(+PostgreSQL) 를포함해서 Big4 Open Source Relational DBMS가리스트업되었다. 또한 Big4를지원하는 AWS(Amazon Web Service) 가신규 LEADERS로추가된점도주목할만하다. 9 DB-Engines Ranking of Key-value Stores - http://db-engines.com/en/ranking/key-value+store 10 DB-Engines Ranking (2015.12.07) - http://db-engines.com/en/ranking
[ 그림 7] 2015 Gartner s Magic Quadrant for Operational Database Management Systems 11) 2015 년 DB-Engines Ranking 은전년도에비해서크게변화한점은찾아보기어렵고, MongoDB 가 PostgreSQL 을앞질렀을정도로 NoSQL 사용이일반화되었다는점을주목할만 하다. - Oracle MySQL 현재최신버전은 MySQL 5.7이고, MySQL 5.7 GA 버전은 2015년 12월 5일에릴리즈된상태이다. MySQL 5.7 버전은 5.6 버전과대비해서성능 (performance) 과확장성 (scalability) 이개선되었다. 그러나 Read 성능이좋아졌을뿐이고, Write 성능개선은크지않다. 개선내용을살펴보면, 이중화개선 (Replication Enhancements), InnoDB 엔진개선 (InnoDB Enchancements), 트리거 (Triggers), 성능개선 (Performance Improvements), 최적화개선 (Optimizer Improvements), MySQL 테스트개선 (MySQL Test Suite Enhnacements), 보안개선 (Security Enhancements) 등을크게볼수있다. 그중에서주목할만한내용은 Multi-Source 11 https://www.gartner.com/doc/3147919/magic-quadrant-operational-database-management
Replication 지원, Transportable Tablespace 지원, Fusion-IO atomic-write 지원, Online DDL 개선등이있다. [ 그림 8] Multi-Source Replication - MariaDB MariaDB는오픈소스의관계형데이터베이스관리시스템 (RDBMS) 이다. MySQL과동일한소스코드를기반으로하며, GPL v2 라이선스를따른다. 오라클소유의현재불확실한 MySQL 라이선스상태에반발하여만들어졌으며, 배포자는몬티프로그램 AB(Monty Program AB) 와저작권을공유해야한다. 이것은 MySQL과높은호환성을유지함과동시에, MySQL APIs 명령에정확히매칭하여라이브러리바이너리와상응하게하여교체가능성을높이고자함이다. 마리아 DB는새로운저장엔진인아리아 (Aria) 뿐만아니라, InnoDB를교체할수있는 XtraDB 저장엔진을포함하고있다. 이것은트랜잭션과비트랜잭션엔진그리고미래에나올 MySQL 판에대응하고자함일것이다. 12) MariaDB는 5.5 버전과 10.x 버전으로나눈다. MariaDB 5.5 버전은 MySQL과의호환성을유지한버전이고, MariaDB 10.x는 MySQL과는차별성을두기위한버전이다. 결국 MariaDB 5.5 버전은 MySQL 5.5와대비해서큰변화는없다. 단지, 더많은스토리지엔진 (storage engines) 을제공하며, 일부분수정이반영되어서성능개선이이루어진점이다를뿐이다. 최근에는 MariaDB 5.5보다는 MariaDB 10.x를주력으로밀고있다. MariaDB 10.x도 MariaDB 5.5의 branch이기때문에 MySQL 5.5나 MySQL 5.6과대비해서큰변화는이루어지지않고있다. 추가적으로병렬이중화 (parallel replication), 멀티소스이중화 (multi-source replication), 롤 (roles), PCRE(Perl Compatible Regular Expressions), KILL QUERY ID, DELETE, RETURNING 등을지원한다. 12 MariaDB - http://en.wikipedia.org/wiki/mariadb
MariaDB 는 MySQL Cluster 대신에 MariaDB Galera Cluster 13) 를지원한다. 2015 AWS Re:Invent 에서 MariaDB Service 를발표하였다. 이로써 AWS RDS for MySQL 과도 경쟁할수있게되었다. [ 그림 9] AWS RDS for MariaDB 10.0.17 13 MariaDB Galera Cluster - https://downloads.mariadb.org/mariadb-galera
[ 그림 10] PostgreSQL 9.5 Parallel Sequential Scan - Percona Percona는 Peter Zaitsev과 Vadim Tkachenko이 2006년에설립하였으며 MySQL 전문컨설팅, 지원, 관리서비스업체이다. Percona Server는 XtraDB, InnoDB 엔진을주력으로하고있고올해 TokuTek을인수하여 TokuDB에대한주도권도가져가게되었다. Percona는 MySQL, MariaDB에비해서성능부분에반영을빠르게하고있다. Percona Toolkit은 MySQL, MariaDB와도호환되기때문에대부분의기업들과서비스들이사용하고있을정도로유명하다. - PostgreSQL PostgreSQL 은객체 - 관계형데이터베이스관리시스템 (ORDBMS) 의일종이다. BSD 허가권으 로배포되며오픈소스개발자및관련회사들이개발에참여하고있다. 14) 14 PostgreSQL - http://en.wikipedia.org/wiki/postgresql
PostgreSQL은캘리포니아대학교버클리분교에서시작된 Ingres 프로젝트로부터시작되었다. 프로젝트리더인 Michael Stonebraker는 1982년 Ingres의상용화를위해학교를떠났었다. 그후, 1985년에다시학교로돌아온그는 1980년대초반부터급증하게된당시의데이터베이스시스템의문제점들을해결하고자 "post-ingres( 후기-Ingres)" 프로젝트를시작했다. 상용화된 Ingres와는다르게 post-ingres에대한아이디어를공유하기위해 Ingres의코드일부를제외하고분리시켰다. 1986년부터개발팀은데이터베이스시스템의기본적인사항에대해몇가지논문을제출하고이어서 1988년까지실제로운영이가능한프로토타입을완성하게된다. 최신 GA 버전은 PostgreSQL 9.6 이다. PostgreSQL 은 8.x버전대에서 9.x 버전으로업그레이드되면서성능과기능이대폭개선되었다. 15) PostgreSQL은 MySQL보다더커뮤니티 (Community) 중심적인개발프로세스를가지고있으며성능및기능개선에필요한 TODO 리스트를중심으로개발하고있다. 16) PostgreSQL 9.6에서는 Parallel execution of sequential scans, joins and aggregates 와 postgres_fdw now supports remote joins, sorts, UPDATEs, and DELETEs 등을지원한다. PostgreSQL 10 로드맵에는성능개선에대한부분이많기때문에기대해볼만하다. 15 What's new in this release - https://wiki.postgresql.org/wiki/category:what%27s_new_in_this_release 16 PostgreSQL TODO - https://wiki.postgresql.org/wiki/todo