얼마전에 아마존에 테스트 서버팜을 구성해야 될 일이 있어 아마존 서비스를 훓어보다 생각보다 광범위하고 꼼꼼한 서비스 종류에 놀란적이 있다.

그래서 현재 아마존 웹서비스(AWS: Amazon WebServices)에서 제공하고 있는 서비스들에 대해서 간단하게 정리해 보았다.


1. Compute
 
- EC2 (Elastic Compute Cloud)
클라우드 환경에서 서버를 할당 받아 사용할 수 있는 서비스, 서버 호스팅과 비슷한 개념이지만, 실제 물리적인 서버를 할당 받는 것이 아니라 클라우드 환경에서 가상 서버를 할당 받는 것이 다른 점.
 
- Auto Scaling
수요에 따라 EC2의 규모를 자동으로 조절 할 수 있는 서비스. 
예를 들어 web server의 cpu load가 50%가 넘어가면 새로운 web server를 추가하도록 세팅이 가능하다.
 
 
2. Networking
 
- DirectConnect
AWS와 직접 연결된 전용 네트워크 서비스 (AWS 네트워크와 직접 연결을 해주는 네트워크 사업자가 따로 있는듯)
 
- Route 53
DNS 서비스
 
- VPC (Virtual Private Cloud)
사설 네트워크 서비스
 
- Elastic Load Balancing
Load Balancing 서비스
 
 
3. Storage & Content Delivery
 
- Glacier
저비용 데이터 보관 및 백업 서비스. 자주 사용되지 않는 데이터를 보관 및 백업하는데 유용한 서비스 
 
- S3 (Simple Storage Service)
인터넷 스토리지 서비스. 웹에서 바로 접근 할 수도 있고, EC2에서 mount해서 사용할 수도 있다.
 
- EBS (Elastic Block Storage)
EC2 인스턴스에서 사용할 수 있는 블럭 레벨 스토리지. 용량, IOPS 설정등이 가능하다. 
* S3는 네트워크 스토리지, EBS는 서버에 추가할 수 있는 하드웨어 스토리지(SATA 하드 같은)로 이해하면 될듯.  
 
- CloudFront
콘텐츠 전송용 웹서비스. CDN과 비슷한 서비스로, 
EC2나 S3같은 서비스에서 사용시 가장 가까운 엣지로 자동 라우팅되서 콘텐츠 전송 속도를 향상할 수 있다.   
 
- Storage Gateway
aws의 스토리지와 로컬 스토리지를 연동해주는 서비스. 로컬에 있는 DAS, NAS, SAN 과 같은 장비와 S3를 연동해서 메인 데이터는 S3에 두고 접근빈도가 높은 데이터는 로컬 스토리지에 케싱하거나, 모든 데이터는 로컬 스토리지에 두고 일정 시간에 따라 주시적으로 데이터의 스냅샷을 S3에 저장하는 등의 서비스를 구축할 수 있다.
 
- Import / Export
대용량 데이터를 이동식 디바이스에 직접 import / export 해 주는 서비스. 외장 하드같은 디바이스를 Amazon에 우편으로 보낸 다음, 데이터를 Import 또는 Export 후 다시 돌려받는 방식. 
 
 
3. Database (BigData)
 
- RDS (Relational Database Service)
RDBMS 클라우드 서비스. MySQL, PostgreSQL, Oracle, SQL Server 지원. 
* EC2에 새로 Instance를 생성하고 직접 설치해서 사용할 수도 있지만 RDS를 사용할 경우 유지 보수 이슈를 획기적으로 줄일수 있다.(Amazon이 관리해주니까....) 하지만 서버에 직접 접근 권한이 없기 때문에 사용에 제한이 많기 때문에 서비스 종류나 기타 기업의 특성등을 잘 고려해서 선택해야 될 듯 하다. 
 
- DynamoDB
아마존에서 서비스하는 NoSQL 데이터 베이스 
 
-SDB (Simple Database )
비정규방식의 DB 서비스(??)
 
- Elastic Cache
Caching 서비스. Memcached, Redis 지원. 
 
- Redshift *Beta
빅데이터 분석 서비스 인듯. 
 
- EMR (Elastic MapReduce)
AWS상에서 서비스되고 있는 Hadoop 프레임워크 위에서 사용할 수 있는 MapReduce 서비스. 데이터의 종류나 양에 따라 Mapreduce에 필요한 리소스의 가변폭이 큰 경우 아주 유용할 듯.
하지만 사용하기 위해서는 반드시 Hadoop도 AWS상에 구축되어야 한다.
 
- Data Pipeline
서버 또는 스토리지간 주기적인 데이터 이동을 지원하는 서비스.
 
** MySQL, PostgreSQL, Oracle, SQL Server, Redis, Memcached를 제외한 다른 어플리케이션들은 직접 설치하거나 EC2에 새로운 인스턴스를 생성할때 Amazon Marketplace에서 패키징된 OS를 선택해야 함.
 
  
4. Deploy & Management
 
- CloudFormation:
클라우드 서비스를 생성 관리 할 수 있는 서비스. 
예를 들어 LAMP Formation 을 선택하고 생성하면 Linux + Apache + MySQL + PHP 환경에 맞는 클라우드 컴퓨팅 환경을 한번에 생성 할 수 있다.
 
- CloudWatch
클라우드 리소스 및 어플리케이션 모니터링 서비스 
 
- Elastic Beanstalk *Beta
웹 어플리케이션(php, Node.js, Python, Ruby, .Net등등)을 aws에 쉽게 배포할 수 있도록 도와주는 웹서비스
 
- OpsWorks
웹 어플리케이션을 Stack 구조 베이스로 생성 관리 할 수 있고, 어플리케이션을 배포할 수 있는 배포툴 서비스.
예를 들어, 웹서비스 Layer(PHP), HA Proxy Layer, DB Layer(MySQL) 등으로 Layer를 정의한 다음. 각 Layer에 서버를 몇대씩 할당할지 정할 수 있다.
OpsWorks를 사용하면 하나의 인스턴스를 셋팅하는데 들이는 노력으로 1,000대의 EC2 인스턴스에 한번에 어플리케이션 배포가 가능하다. 
 
- SWF (Simple Workflow Service) *Beta
서버단위의 Workflow를 설정 관리 할 수 있는 서비스(??)  
 
 
5. App Services
 
- CloudSearch *Beta
아마존의 서치엔진 서비스.
 
- Elastic Transcoder *Beta
동영상 트랜스코딩 서비스
 
- SES (Simple Email Server)
Email 서비스
 
- SNS (Simple Notification Service)
푸시 메세징 서비스
 
- SQS (Simple Queue Service)
메세지 큐 서비스 
 
 
6. 기타
 
- Mechanical Turk *Beta
무서운 서비스. 인간 지능(물리적인 지적 노동력) 사고 팔기 위한 마켓플레이스. 
쉽게 말해서 인력이 필요한 작업이 있을 경우(예를 들어 비디오 판독, 자막 제작 등등) 그에 대한 결과물의 형태, 보수, 자격 조건 등을 입력 후 마켓플레이스에 등록.
등록자가 제시한 자격 요건 테스트를 통과한 지원자들이 그 일을 해주고 보수를 받는 서비스 ..... 아마존이 노가다 인력 시장까지 진출하려고 한다. (투잡족에게는 좋은 알바소개소?)
 
- CloudHSM (Cloud Hardware Security Module)
보안키 보관 서비스 (??)
 
- Support
아마존의 기술 지원 서비스. 지원 범위가 커질 수록 가격도 올라간다.
 
- Product Advertising API
아마존 배너광고 관련 API


Posted by 알 수 없는 사용자
,

HBase의 특징

개인적으로 어떤것이든 도입 필요성에 대해서 경영진을 설득할 때 그것에 대한 특징이 잘 설명된다고 생각한다. 그렇다면 다음에 진행할 프로젝트에서 HBase를 사용해야 한다고 경영진을 설득하는 방법에 대해서 알아보도록 하자.



다음 프로젝트에서 HBase를 사용하고 싶다면 다음과 같이 경영진을 설득할 수 있다.

Hadoop과 강한 연관성을 가지고 있다!

HBase에서 분산 환경을 구축하기 위해서는 HDFS위에서 실행되어야 한다. 어찌보면 제한사항으로 느껴질 수도 있지만 이미 Hadoop을 사용하고 있는 환경에서는 오히려 그것이 큰 장점이 될 수 있다. 설득의 포인트는 "기존의 Hadoop 시스템을 활용해서 NoSQL Database까지 운영할 수 있다"로 하면 된다.

기존 시스템을 활용할 수 있다는 것은 매우 강한 설득력을 가질 수 있다. 구체적인 목적을 가지고 Hadoop 시스템을 필요한 규모만큼만 운영하는 경우라면 "꼭 Hadoop을 활용할 필요가 있느냐?"는 질문을 받을 수 있다. 하지만 다행히 Hadoop 시스템을 구체적인 목적을 가지고 운영하는 경우는 많지 않다.

만약 Hadoop 시스템을 운영하고 있지 않은 경우라도 공략은 어렵지 않다. Hadoop 시스템을 도입하자고 경영진을 설득하는 것은 HBase에 비하면 너무나 쉽기 때문이다.

* 공략 키워드 : Big Data, Hadoop

Big Data 처리가 가능하고 MapReduce도 가능하다!

HBase는 Hadoop의 ecosystem으로 분류된다. 요즘같이 Big Data = Hadoop이라는 관계에 대해서 의문을 갖는 사람들이 많지 않다는 것을 이용하면 된다. 사실 Big Data + 대용량 데이터 처리는 HBase뿐만 아니라 다른 NoSQL Database들도 가능하다. 물론 기존에 많이 사용하던 RDBMS도 Sharding 등을 통해서 충분히 대용량 처리를 할 수 있다.



HBase는 대용량 데이터의 읽기, 쓰기 뿐만 아니라 MapReduce를 통한 처리도 가능하다. 이것을 교묘히 이용하면 성공할 수 있는 확률이 높아지게 된다. 공략의 방식은 다음과 같다.

  1. Big Data = Hadoop라는 관계를 강조한다.
  2. Hadoop의 MapReduce를 통해서 Big Data 처리를 한다는 것을 슬쩍이라도 얘기해야 한다. 이때 Hadoop이란 것을 강조해야 한다.
  3. HBase는 Hadoop의 ecosystem이라고 한다.
  4. 간단한 몇가지 정보를 흘려둔 후 경영진이 Big Data = Hadoop = HBase라는 공식을 머리속에 그려낼 수 있도록 시간을 준다.

데이터에 대한 MapReduce를 지원하는 Database가 HBase뿐만은 아니다. HBase와 비교되는 Cassandra도 MapReduce가 가능하다. 하지만 Hadoop의 ecosystem으로 분류되는 HBase에서 Hadoop의 MapReduce를 처리한다고 하면 다른 NoSQL Database보다 더 잘 할 수 있을 것 같은 기분이 든다.

* 공략 키워드 : HBase는 Hadoop의 ecosystem!

CAP이론에서 CP 모델을 가진다.

HBase는 데이터의 Consistency를 보장한다. 다시 말하면 HBase에 쓰기를 한 후 바로 다른 노드에서 읽기를 한 경우 가장 최근에 쓰여진 데이터를 읽는다는 것이 보장된다.



CAP이론을 들먹이면서 자주 비교되는 것이 Cassandra이다. HBase를 경영진에게 설득해야 하는 입장에서 Cassandra는 눈에 가시같은 존재이다. 만약 경영진이 Cassandra에 대해서 언급한다면 좀 치사한 방법이기는 하지만 Cassandra를 깎아내려서 HBase의 존재를 부각시키는 방법이 가장 좋다.

Cassandra는 CAP 이론에서 AP의 모델을 가진다. 극단적으로 말하면 Cassandra는 데이터의 Consistency를 보장하지 못한다. 그렇기 때문에 데이터의 Consistency가 필요한 경우라면 HBase를 사용하는 것이 더 유리하다고 주장한다.

데이터를 다루는 대부분의 경우에는 Consistency는 매우 중요한 속성 중 하나이다. 만약 Cassandra가 Consistency가 약하다는 말을 들으면 경영진도 쉽게 포기하게 될 것이다. 그렇기 때문에 HBase를 사용해야 한다고 경영진을 설득할 때에는 무조건 Consistency를 강조해야 한다. 

만약 경영진이 Cassandra에 대해서 좀 더 자세하게 물어보는 경우 대충 얼버무리면 된다. 만약 Cassandra가 읽기, 쓰기에 대해서 각각 Consistency Level을 설정하는 것이 가능하고 Consistency Level중 ALL은 클러스터 내의 모든 노드에 row를 저장한다는 것까지 경영진이 알게되면 문제가 복잡해지게 되니 조심해야 한다. 만약 경영진이 미리 Cassandra에 대해서 조사한 후 Consistency Level = ALL에 대해서 얘기하면 그럴 경우 하나의 노드가 반응하지 않을 경우 읽기/쓰기가 실패하게 되는 단점이 있다고 얘기해주면 된다.

그리고 Google의 BigTable도 CP 모델을 가진다고 얘기하면 HBase가 더 좋아보일 수도 있다.

* 공략 키워드 : Consistency 보장.

Automatic Failover를 제공한다.

HBase에서 데이터를 관리해주는 역할을 하는 것은 Region Server이다. 이 Region Server가 죽게되면 해당 Region Server의 역할을 다른 Region Server들로 재분배하여 처리할 수 있도록 한다. Failover기능은 다른 NoSQL들도 많이 가지고 있고 요즘에는 서비스를 운영하는데 필수이면서 당연한 기능으로 생각되기 때문에 Failover기능을 가지고 설득을 한다고 해서 큰 효과를 볼 수는 없다.

하지만 얼마나 잘 포장하느냐에 따라서 HBase데이터는 HDFS에 저장되고 Region Server는 데이터 관리만을 해주기 때문에 Region Server의 Automatic Failover 기능과 HDFS의 Replication에 의해서 데이터가 2중으로 보호되는것만 같은 착각을 하도록 할 수 있다. 하지만 사실은 HBase는 HBase의 시스템 뿐만 아니라 HDFS의 시스템 문제에도 영향을 받을 수 있기 때문에 너무 과대포장했다가 오히려 나중에 낭패를 볼 수도 있으니 주의해야 한다.

* 공략 키워드 : Region Server의 Automatic Failover를 제공.

테이블을 자동으로 Sharding할 수 있다.

데이터가 많아지면 테이블 관리도 신경써지게 된다. HBase는 테이블을 자동으로 Sharding하기 때문에 하나의 테이블에 많은 데이터가 들어가도 문제 없이 처리할 수 있다. 설득을 할 때 주요 공략 포인트는 다음과 같다.

  1. 서비스를 운영하면 점점 많은 데이터가 쌓이게 된다. (데이터 관리에 대한 불안감을 조성)
  2. MySQL등은 데이터가 많이 쌓이면 속도도 느려지고 테이블 관리도 어렵다. (단, 엔지니어 출신 경영진한테는 조심해야 한다. 그런 경영진은 RDBMS도 적절한 인덱스 관리와 Sharding을 하면 된다는 것을 알고있을 수 있다.)
  3. HBase는 자동으로 테이블의 데이터 크기를 관리할 수 있다. (꼭 HBase라고 해야 한다. 그래야 다른 NoSQL에 대해서 찾아보지 않는다. 경영진이 다른 NoSQL도 Sharding이 가능한지에 대해서 찾아보면 설득할 때 불리해질 수 있다.)
  4. Sharding이라는 단어는 가급적이면 사용하는 것이 좋다. 만약 경영진이 Sharding의 뜻을 물어보면 "데이터 분산 처리"라고 애매하게 답해줘야 한다.
그럴 일은 없지만 혹시라도 경영진이 어떤 방식으로 자동 Sharding을 하느냐에 대해서 물어본다면 절대 방심해서는 안된다. 자동 Sharding 방식에 대해서 물어보는 경우는 경영진이 어느정도 분산 관련 지식이 있다는 것을 의미한다. HBase는 rowkey 순서에 따른 Sharding을 하기 때문에 효율적인 분산을 위해서는 rowkey 디자인이 매우 중요하다는 사실은 경영진이 모르도록 하는 것이 더 좋을 수도 있다. 나중을 위한 보험 정도로 생각하면 된다.

* 공략 키워드 : 자동 Sharding, rowkey 순서에 따른 Sharding

자바 API를 사용해서 쉽게 개발이 가능하다. Thrift, Avro, Restful API도 제공한다.

자바 API는 다른 NoSQL들도 많이 제공하기 때문에 그쪽에 무게를 둬서 설득하면 안된다. Thrift에 무게를 두는 것이 설득을 더 쉽게 만들 수 있다. 다른 NoSQL들도 Thrift를 제공하지만 다음과 같이 설득해볼 수 있다.

  1. Thrift는 페이스북에서 개발해서 사용하고 있는 통신방식이라고 설명한다. 페이스북이라는 단어를 사용하면 경영진은 알 수 없는 신뢰감을 얻게된다.
  2. Thrift는 현재 Apache 프로젝트에 등록되어있다고 한다.
  3. HBase도 Apache 프로젝트라고 한다.
  4. 둘 다 Apache 프로젝트이기 때문에 둘 간에는 뭔가 더 특별한 것이 있을꺼라고 경영진이 착각할 시간을 준다.
주의할 점은 Cassandra도 Apache 프로젝트라는 얘기는 절대 해서는 안된다. 

* 공략 키워드 : 사용하기 쉬운 자바 API, Thrift, Avro, Restful API 제공


참고자료








Posted by 알 수 없는 사용자
,

2013.09.26

이주현 (lee@embian.com, leejuhyeon@gmail.com)



I. 서설

 Java VisualVM(이하 VisualVM이라 한다)는 실행 중인 java 프로세스의 상태를 모니터링할 수 있는 좋은 도구이다. 이는 Oracle JDK에 포함되어 있으며, JDK 설치위치의 bin 디렉토리에 jvisualvm이라는 이름으로 존재한다.


 VisualVM은 로컬(VisualVM이 작동되는 머신과 동일한 머신)에서 실행 중인 java 프로세스 뿐만 아니라, 원격(VisualVM이 작동되는 머신과 상이한 머신)에서 실행 중인 java 프로세스 역시 모니터링할 수 있다.

 원격 모니터링의 경우, jstatd*[각주:1] 또는 JMX[각주:2]를 이용하는 두가지 방식을 제공하는데, JMX를 이용하는 것이 더 간단하고, 기능도 많다.


 이 글에서는 JMX를 활용하여 원격호스트의 java 프로세스를 모니터링하는 방법을 설명하고자 한다.




II. 환경설명

 다음과 같이 원격호스트와 로컬호스트가 존재하고, 원격호스트에서 실행 중인 Test라는 java 프로그램의 상태를 로컬호스트에서 VisualVM을 통하여 모니터링하기로 한다.






III. 방법


1. 원격호스트에서 실행될 Test.class 프로그램을 다음과 같은 환경변수와 함께 실행시킨다.




여기서 jvm 파라미터들은 다음과 같다.

-Djava.rmi.server.hostname=<원격호스트의 주소>

-Dcom.sun.management.jmxremote.port=<jmx프로토콜로 접속할 port번호>

-Dcom.sun.management.jmxremote.ssl=<ssl 사용여부>

-Dcom.sun.management.jmxremote.authenticate=<인증사용 여부>

* 여기서 인증사용 여부 등을 true로 하게 되면, jre 측에 별도의 보안 설정 등을 필요로 한다. 내부망이고 별도의 보안 정책이 없는 경우라면, 인증사용을 하지 않아도 충분하다.



2. 로컬호스트에서 VisualVM을 실행한다.



그러면 아래와 같이 VisualVM이 실행된다.





3. Visual VM에서 remote 접속을 수행한다.

 

 화면의 Applications 탭에서 Remote를 클릭하면, "Add Remote Host"라는 팝업이 뜬다. 이 팝업의 "Host name"에 원격호스트의 주소를 적어주고, OK 버튼을 누른다. (여기서는 원격호스트의 주소는 192.168.0.53이라고 가정한다)






그러면, 원격호스트가 Remote 항목 밑에 표시된다.



해당 원격호스트 항목에서 마우스 오른쪽 버튼을 클릭해서 "Add JMX Connection"을 선택한다.



 새로 열린 팝업 메뉴의 "Connection" 란에 원격호스트의 IP와 Port 번호를 적어준다. (본 예제의 원격호스트에서  java 프로세스를 실행할 때 지정한 JMX 포트 번호는 3333)



 그러면, Applications 탭에 원격호스트의 java 프로세스가 등록된 것이 보일 것이다.




 이제 해당 원격 프로세스 표시를 더블클릭하자. 그러면 다음과 같이 해당 java 프로세스의 상태가 표시될 것이다.




4. 이제 원격 java 프로세스의 상태를 모니터링한다.


아래와 같이 "Overview", "Monitor", "Thread", "Sampler" 등의 탭을 통하여 원격호스트 상의 java 프로세스의 상태를 모니터링할 수 있다.







IV. 결론

 원격호스트의 java 프로세스 상태를 모니터링함에 있어 jstatd를 사용하는 방법은, 별도의 rmiregistry를 기동하여야 하는 등 약간 귀찮은 면이 있다.

 이에 비하여 JMX를 활용하여 모니터링 대상의 JVM에 직접 접속하는 방법은 별도의 감시 데몬(jstatd)를 필요로 하지 않으면서도, 오히려 jstatd를 사용할 경우보다 다양한 기능(예를 들어 Heap Dump 등)을 제공하는 장점이 있다.



  1. java 프로세스의 상태를 감시하는 프로그램인 jstat의 데몬 버전 [본문으로]
  2. Java Management Extension [본문으로]
Posted by 쿨링팬
,

HBase에 대해서 간단히 알아보자!


HBase?

HBase에 대해서는 무엇보다도 HBase 홈페이지(http://hbase.apache.org)가 가장 정확하게 설명하고 있을 것 같다.

Apache HBase™ is the Hadoop database, a distributed, scalable, big data store.
(
Apache HBase™는 분산되고 확장 가능하면서 큰 데이터를 저장하기 위한 Hadoop Database이다.)

HBase 홈페이지에는 다음과 같은 좀 더 상세한 설명도 있다.

Apache HBase is an open-source, distributed, versioned, column-oriented store modeled after Google's Bigtable.
(Apache HBase는 구글의 Bigtable 모델을 따르는 오픈소스 분산되고 버전화 되어있는 컬럼 기반의 저장소이다.)

그렇다면 HBase를 이해하기 위해서는 구글의 BigTable에서 시작해야 할 것 같다.

구글의 Bigtable에 대해서 설명한 논문(http://research.google.com/archive/bigtable.html)에서 Data Model에 대한 설명을 보면 다음과 같다.

A Bigtable is a sparse, distributed, persistent multidimensional sorted map. The map is indexed by a row key, column key, and a timestamp.

Bigtable Data Model의 특징은 sparse, distributed, persistent multidimensional sorted map 이라고 할 수 있다. 

그렇다면 각 특징에 대해서 간단히 알아보면 다음과 같다.

sparse

sparse라는 영어 단어는 "밀도가 희박한"이라는 뜻을 가지고 있다. 뜻도 어려울 뿐만 아니라 발음할때도 r 발음에 주의해야 한다! 스파~ㄹ스라고 해야 하지만 영국식 발음은 스파스 해도 무난하다고 한다. (거꾸로 읽어도 스파스가 된다!)
아무튼.. 밀도가 희박하다는 특징이라고 하면 잘 떠오르지 않는다. 만약 "밀도가 희박하다"는 단어만으로 설명하려 하면 다음과 같은 사태가 발생할 수 있다.

개똥이 : 구글의 Bigtable의 특징은 sparse하다는 거야!
소똥이 : sparse가 무슨 뜻인데?
개똥이 : 밀도가 희박하다는 뜻이야!
소똥이 : ♨_♨ ㅅㅂ (  )(  )(  )(  )!!!

마지막 대사의 괄호 안을 채워넣으려 노력하지 말고 sparse하다는 말에 좀 더 집중해보도록 하자. sparse라는 단어와 관련된 것을 생각해보면 "sparse matrix(희소행렬)"라는 단어가 떠오를 것이다!

sparse matrix(희소 행렬)의 모습은 아래와 같다.

 

col #1 

col #2 

col #3 

col #4 

col #5 

col #6 

col #7 

... 

col #n 

 row #1

 

 

 

 

 

 

 

 

 13

 row #2

 

 

 8

 

 

 

 

 

 

 row #3

 

 

 

 

 

 

 

 

 row #4

 5

 

 

 

 

 

 

 

 

 row #5

 

 

 

 

 

 

 

 

 

 row #6

 1

 

 

 

 

 

 

 

 row #7

 

 

 

 

 

 

 

 

 

 ...

 

 

 

 

 

 

 

 

 

 row #m

 

 

 

 

 

 

 

 

이와 같이 대부분의 항목이 비어있거나 0의 값을 가지는 행렬을 sparse matrix(희소 행렬)이라 한다. Bigtable의 sparse하다는 특징은 정형화된 테이블에 대부분의 값이 들어가있는 모습이 아닌 sparse matrix의 데이터 구성과 유사하다는 것을 의미한다.


distributed

distributed라는 영어 단어는 "분산된"이라는 뜻을 가지고 있다. 흔히 사용되는 단어이고 말 그대로 데이터가 분산되어 관리된다는 것을 의미한다.


persistent multidimensional sorted map

각 단어의 의미를 알아보면 다음과 같다.

persistent = 지속적인
multidimensional = 다차원의
sorted = 정렬된
map = 지도

persistent라는 단어는 "지속적인"으로 해석되어 메모리 같은 휘발성 저장소가 아닌 하드 디스크와 같은 비휘발성 저장소에 저장된다고도 해석될 수 있다. 하지만 여기서 말하는 persistent라는 속성은 persistent data structure를 나타내는 것이다. persistent data structure는 데이터의 version이 관리되는 데이터 구조를 의미한다.

multidimensional은 말 그대로 다차원을 의미한다. Bigtable의 데이터 모델의 다차원은 row key, column key, timestamp를 의미한다.

sorted 또한 말 그대로 정렬되었다는 것을 의미한다. 

데이터에 대해서 얘기하면서 map을 "지도"라고 해석하는 사람은 없을 것으로 생각한다. 자료구조에서 말하는 map 형태의 데이터를 의미한다.

각 단어에 대한 이해를 했다면 이제 각 단어를 조합하는 응용을 해보면 다음과 같다. 

persistent    multidimensional    sorted    map
~~~~~~    ~~~~~~~~~~     ~~~~   ~~~
  형용사            형용사             형용사   형용사

※ 아래와 같은 순서로 해석한다.

1단계) sorted map = 정렬된 map
2단계) multidimensional sorted map = 다차원의 정렬된 map
3단계) persistent multidimensional sorted map = 데이터의 버전이 관리되는 다차원의 정렬된 map


그렇다면 이제 HBase의 데이터 모델에 대해서 알아보자. 그냥 알아보면 재미없으니 Perl을 사용해서 표현해보면 다음과 같다.

$bigtable = "A Bigtable is a sparse, distributed, persistent multidimensional sorted map. The map is indexed by a row key, column key, and a timestamp.";

$hbase = $bigtable =~ s/bigtable/HBase/gir;

요약하자면.. Bigtable에 대한 설명에서 "Bigtable"이라는 단어를 "HBase"로 변경하면 된다.

이제 HBase에 대해서 정의해보자.

HBase는 분산되고 확장 가능하면서 큰 데이터를 저장하기 위한 Hadoop Database이다.

HBase의 데이터 모델은 희소 행렬과 유사한 데이터 구성을 가지면서 분산되어있고 데이터의 버전이 관리되는 다차원(rowkey, column key, timestamp)의 정렬된 map이다. 


참고자료


Posted by 알 수 없는 사용자
,

CAP이론?

CAP

NoSQL 소개에는 빠지지 않고 등장하는 그림이다. 이 그림을 약 3~5초정도 보면 다음과 같은 의문이 생기게 된다.

"그럼 ACID는?"

ACID(원자성, 일관성, 고립성, 지속성)는 데이터베이스 트랜젝션이 안전하게 수행된다는 것을 보장하기 위한 성질을 가리키는 약어이다.

- 위키백과, (http://ko.wikipedia.org/wiki/ACID)

ACID는 RDBMS에서 매우 중요하게 생각하는 성질이라 할 수 있다. 그런데 NoSQL에서는 찾아보기 힘든 단어이다.

2000년 Eric Brewer가 "Towards Robust Distributed Systems"라는 제목으로 CAP 이론을 소개할 때 BASE에 대해서도 소개했었다.

성능과 가용성 등을 위해서 ACID의 C와 I의 속성을 포기하고 분산 시스템에 더 적합하다고 생각되는 성질을 정리한 것이 BASE이다.

BASE가 나타내는 성질은 다음과 같다.

Basically Available : 기본적으로 Available하고
Soft-state : 사용자가 관리(refresh, modify)하지 않으면 Data가 expire 될 수도 있으며
Eventually consistency : 지금 당장은 아니지만 언젠가는 Data가 일관성을 가진다

전달하고자 하는 의미는 알겠는데 찝찝한 부분이 있다!

1. Basically Available은 Basically라는 부사를 사용하지 않고 Availablility라고만 표현해도 되고
2. Eventually consistency도 마찬가지로 Eventually라는 부사를 사용하고 있다
3. 게다가 ACID처럼 명사들 만의 약자가 아닌 Basically Available = 부사 + 형용사, Soft-state = 명사, Eventually consistency = 형용사 + 명사 로 구성되어있다.

이렇게 억지로 짜맞춘 단어처럼 보이는 BASE는 ACID와의 관계를 고려하면 좀 더 간결하고 명확한 의미 전달을 할 수 있는 명사들의 약자를 쓰지 않은 이유를 알 수 있다.

Acid와 Base의 비교 #1
acid vs base

ACID와 BASE의 비교 #2
acid vs base 2

분산 시스템에서 관리되는 데이터의 특징을 나타내는 BASE라는 단어는 의미의 전달보다는 중학교때 배운 산(Acid)과 염기(Base)와 같아보이려는 노력에 의해서 탄생했다는 것을 알 수 있다;;


CAP이론!

BASE의 탄생에 대해서는 그냥 그러려니~ 하고 넘어가고 CAP이론에 대해서 알아보자. 제일 처음에 있던 CAP 세모는 영어로 써져있고 글자도 많으니 좀 더 간단한 그림을 그려보면 다음과 같다.

CAP circle

CAP이론은
"분산 시스템에서는 위 그림의 3개 속성을 모두 가지는 것이 불가능하다!"
이다.

CAP이론에서 보여주는 3개의 속성에 대해서 각각 알아보면 다음과 같다.

Consistency

  • 우선.. CAP이론에서 말하는 Consistency는 ACID의 'C'가 아니다! ACID의 'C'는 "데이터는 항상 일관성 있는 상태를 유지해야 하고 데이터의 조작 후에도 무결성을 해치지 말아야 한다"는 속성이다.
  • CAP의 'C'는 "Single request/response operation sequence"의 속성을 나타낸다. 그 말은 쓰기 동작이 완료된 후 발생하는 읽기 동작은 마지막으로 쓰여진 데이터를 리턴해야 한다는 것을 의미한다.
  • 모든 노드가 같은 시간에 같은 데이터를 보여줘야 한다. (저장된 데이터까지 모두 같을 필요는 없음)
  • 정리해보면 Consistency라는 단어보다는 Atomic이라는 단어가 더 정확하게 특징을 나타낸다고 할 수 있다. (Atomic Data Object, Atomic Consistency)
  • 그럼 "CAP가 아니라 AAP가 되어야 할텐데.." 라는 생각이 들 수도 있다. 어차피 ACID와 비교하기 위해서 BASE라는 단어도 억지로 만들어내는데 AAP보다는 CAP가 더 이뻐보이니 그렇게 했다고 생각하고 넘어가면 된다.

Availability

  • 가용성
  • 흔히 보는 단어이고 의미도 크게 혼동될 이유가 없어보인다. "특정 노드가 장애가 나도 서비스가 가능해야 한다"라는 의미를 가진다.
  • 데이터 저장소에 대한 모든 동작(read, write 등)은 항상 성공적으로 리턴되어야 한다.
  • 명확해 보이는 단어이기는 하지만 분산 시스템에서의 특징을 말하는 것이기 때문에 "서비스가 가능하다"와 "성공적으로 리턴"이라는 표현이 애매하다. 얼마동안 기다리는 것 까지를 성공적이라고 할 수 있느냐에 대한 문제가 남아있다. "20시간정도 기다렸더니 리턴이 왔어! Availability가 있는 시스템이야!"라고 할 수 없기 때문이다.
  • 다시한번 "성공적으로 리턴"에 대해서 보면 모든 동작에 대해서 시스템이 "Fail!!"이라는 리턴을 성공적으로 보내준다면 그것을 Availability가 있다고 해야 하느냐에 대해서도 애매하다. CAP를 설명하는 문서들 중 "Fail!!"이라고 리턴을 하는 경우도 "성공적인 리턴"이라고 설명하는 것을 보았다.

Tolerance to network Partitions

  • 원래는 Tolerance to network Partitions인데 보통은 Partition-tolerance라고도 한다.
  • 노드간에 통신 문제가 생겨서 메시지를 주고받지 못하는 상황이라도 동작해야 한다.
  • Availablity와의 차이점은 Availability는 특정 노드가 "장애"가 발생한 상황에 대한 것이고 Tolerance to network Partitions는 노드의 상태는 정상이지만 네트워크 등의 문제로 서로간의 연결이 끊어진 상황에 대한 것이다.


CAP 이론의 이해

CAP이론은 2002년 MIT의 Seth Gilbert와 Nancy Lynch에 의해서 증명되었다. CAP이론을 증명하는 논문에는 그림이 하나도 없어서 너무너무 재미 없다. 재미없는 논문 보다는 간단한 그림으로 CAP이론을 이해해볼 수 있다.

CAP이론을 이해해보기에 앞서.. 다음과 같은 상황을 가정해본다.
understanding_cap1
- 네트워크가 N1, N2로 구분된 분산환경이다.
- 각 DB 노드는 V=V0이라는 값을 가지고 있다.
- 각 네트워크에는 A, B라는 클라이언트가 존재한다.
- A는 V=V1이라고 쓰고 B가 그것을 읽는다.

이런 환경에서 메시지 전달 과정(M)에서 문제가 생겼을 때..
understanding_cap2

1. "C"가 꼭 필요한 상황인 경우
- A가 V1이라고 썼기 때문에 B는 V1이라고 읽을 수 있어야만 한다.
- A의 쓰기 동작은 M이 복구되기 전까지는 성공할 수 없다.
- M이 복구되기 전까지는 A의 Write는 block되거나 실패해야 한다. = Availability가 없음 = CP
- M이 문제가 생길 수 없도록 구성 = Partition-Tolerance가 필요 없음 = CA

2. "A"가 꼭 필요한 상황인 경우
- 어떤 경우에도 서비스가 Unavailable하면 안된다.
- A와 B가 꼭 동일한 데이터를 읽을 필요는 없음 = AP
- M이 문제가 생길 수 없도록 구성 = Partition-Tolerance가 필요 없음 = CA

3. "P"가 꼭 필요한 상황인 경우
- 메시지 전달 과정(M)에서 문제가 생기더라도 시스템에 영향이 가서는 안된다.
- A와 B가 꼭 동일한 데이터를 읽을 필요는 없음 = AP
- A의 쓰기 동작은 M이 복구되기를 기다린다. = 그동안 쓰기 서비스 불가능 = Availability가 없음 = CP


NoSQL??

NoSQL이라는 단어에 대해서 "적극적으로" 인터넷을 뒤져보았더니 다음과 같이 설명하고 있었다.

  1. No SQL : SQL이 없다는 의미이다.
  2. Not Only SQL : SQL뿐이 아니다.. SQL말고도 더 있다
  3. NOn-relational operation database SQL : 비관계형 DB SQL

종합해보면 NoSQL은 "SQL이 없으면서도 SQL뿐만 아니라 다른거도 있는 비관계형 DB이다"라고 할 수 있다. 이건 누가 들어도 "대단해!"라고 말할만 하다.

great_nosql

하지만 이미 "BASE"라는 단어에서 느낀것이 있기 때문에 "NoSQL"이라는 단어에서 "N은 이런 의미이고 O는 이런 의미이고.."와 같이 단어 자체에 의미를 부여하려는 쓸데없는 시도는 무시하고 다시 NoSQL에 대해서 정의를 내리면 NoSQL은 "관계형 데이터 모델을 사용하지 않는 모든 Database 또는 Data Store"라고 할 수 있다.

nosql


NoSQL의 종류

NoSQL에는 어떤 것들이 있는지 웹서핑을 해봤다. 결과는 다음과 같다.

various nosql

NoSQL의 종류에 대해서는 기본부터 알아보도록 하자.

  • NoSQL의 데이터 모델은 기본적으로 Key-Value Store 모델을 사용한다.

basic nosql model

기본 데이터 모델을 기준으로 각각의 Key-Value 관리 방법을 알아보면 다음과 같다.

  1. Key-Value Oriented
    - Value가 String, Integer, List, Hash 등의 기본 자료형인 경우이다key-value oriented
  2. - 이런 형식의 데이터 모델을 사용하는 경우를 Key-Value Oriented Database라고 한다.
    - 키에 대한 접근은 빠르지만 범위 검색에 대해서는 취약하다.
    - 이런 데이터 모델을 사용하는 DB로는 Redis, Memcached, Tokyo Cabinet  등이 있다.
  3. Ordered Key-Value Oriented
    - Key-Value Oriented 모델의 경우 범위 검색에 대해서 취약하다는 단점이 있다.
    - 만약 Key, Value를 정렬해놓는다면 범위 검색에 대한 단점을 어느정도 극복할 수 있다.
  4. Column Family Oriented
    - 하나의 Key에 하나의 Value만을 저장하는 단점을 극복했다.
    - 하나의 Key에 여러개의 Column을 저장한다.
    - Column-Value의 묶음을 Column Family라고 한다.column family oriented
  5. - 흔히 Column Oriented Database라고 하지만 Column Family Oriented Database라고 해야 한다. Column Oriented는 RDBMS에서 사용하는 데이터 모델 중 하나이다.
    - 보통은 Ordered Key-Value Oriented 모델을 사용한다. 다시 말하면 Key는 정렬되어 저장되고 Column도 Column Name별로 정렬되어 저장하는 모델을 사용한다.
    - 이런 데이터 모델을 사용하는 DB로는 HBase, Cassandra 등이 있다.
  6. Document Oriented
    - Value에 저장되는 값이 Document(JSON, XML 등)이다.
    document oriented
    - 이런 데이터 모델을 사용하는 DB로는 MongoDB, CouchDB 등이 있다.


NoSQL 데이터 모델링

RDBMS의 데이터 모델링과 NoSQL의 데이터 모델링을 비교하면 다음과 같다.

modeling

다음과 같은 기능을 구현한다고 가정한다.

modeling plan

NoSQL로 구현할 때의 모델링 절차를 살펴보면 다음과 같다.

  1. 데이터 분석
    - RDBMS도 모델링을 시작하기 위해서 데이터 분석을 해야 한다. 동일한 절차이지만 RDBMS와 NoSQL은 데이터에 대해서 서로 다른 시각으로 접근을 해야 한다.
    - RDBMS에서의 데이터 분석은 다음과 같다.
    modeling rdbms 1
    - 반면에 NoSQL의 데이터 분석은 다음과 같다.
    modeling nosql 1
    modeling nosql 2
    1) 게시판 내에서 게시글은 시간순으로 정렬되어야 함
    2) 게시글:내용 = 1:1
    3) 게시글:댓글 = 1:N
    4) 댓글은 게시글 내에서 시간순으로 정렬되어야 함
    5) "정렬"에 별표
    - RDBMS는 데이터의 관계에 집중해서 데이터 분석을 진행하는 반면에 NoSQL은 표현되는 데이터와 정렬되는 특징에 집중해서 분석을 진행한다.
  2. 쿼리 디자인
    - 데이터 분석을 마치면 NoSQL은 데이터의 특징을 고려해서 어떤 종류의 쿼리가 필요한지에 대해서 디자인한다.
    modeling nosql 3
  3. 테이블 디자인
    - 쿼리 디자인에서 2가지 방법을 디자인했다. 각각의 쿼리에 맞는 테이블을 디자인하면 다음과 같다.
    - 쿼리 1
    modeling nosql 4
    - 쿼리 2
    modeling nosql 5
    - 각 쿼리에 맞는 테이블을 디자인했을 때 적합한 NoSQL 모델은 Document Oriented, Column Family Oriented 라고 할 수 있다.


NoSQL 언제 사용하면 좋을까?

NoSQL에 대해서 조사해봤더니 다음과 같은 정보를 얻을 수 있었다.

nosql how1

역시나 다들 "빅데이터 처리는 NoSQL이야!"라고 하는 것 같다. 그러면 다른 유명한 업체의 사용 경험을 들어보도록 하자!

1. Twitter twitter logotwitter use case

2. Tumblr tumblr logo
tumblr use case

3. EVERNOTEevernote logo
evernote use case

4. 결론
use case 1818

기대하는 결과가 나오지 않을 경우 질문을 바꿔보는 것도 좋은 방법이라 생각한다.


언제 NoSQL을 사용하면 안되나?

nosql when


(바쁜 사람들을 위한 친절한)요약

  1. RDBMS가 ACID라면 NoSQL는 BASE이다
  2. 분산 시스템에서는 Consistency, Availability, Partition Tolerance의 특징을 모두 가지는 것이 불가능하다
  3. NoSQL은 관계형 데이터 모델을 사용하지 않는 모든 Database 또는 Data Store를 말한다.
  4. NoSQL의 기본 데이터 모델은 Key-Value이다. Value의 형식에 따라서 Key-Value, Column Family Oriented, Document Oriented로 구분되기도 한다.
  5. 데이터 모델링에서 RDBMS는 테이블 디자인이 중요하지만 NoSQL은 쿼리 디자인이 중요하다.
  6. RDBMS는 테이블 디자인에 정규화를 하지만 NoSQL은 데이터 비정규화를 한다.
  7. 빅데이터 처리에 NoSQL이 꼭 필요한 것은 아니다.
  8. 유행을 무조건 따르지 말고 SQL, NoSQL이 무엇인지 알아보고 내가 다루려는 Data에 대해서 파악을 한 후에 사용해야 한다!


참고자료


Posted by 알 수 없는 사용자
,

이번에 소개할 MySQL 클론은 TokuDB인데, 엄밀히 말해서 TokuDB는 MySQL의 클론이라고는 할 수가 없다.

TokuDB는 MySQL이나 MariaDB에서 사용할 수 있는 새로운 Storage Engine인데, 이게 또 상당히 특이하고 흥미로운 Storage Engine이다.


4. TokuDB

TokuDB는 TokuTek사에서 개발한 Database Storage Engine으로 MySQL, MariaDB에서 사용할 수 있다.

TokuDB는 처음에는 Open source가 아닌 쉐어웨어로 시작했다. 40G까지는 무료로 사용할 수 있고, 그 이상은 년 400달러 정도의 금액을 지불하는 라이센스 정책을 쓰다가 얼마지나지 않아 30일까지만 무료로 사용할 수 있도록 라이센스 정책이 바뀌었다. 그러다가 최근 다시 Open source로 라이센스가 바뀌었는데, 1년사이에 라이센스 정책이 두번이나 바뀌어서 살짝 불안한 감이 있다.

그래서 현재 라이센스 정책은 MySQL처럼 Community Version은 open source로 Enterprise Version은 커머셜로 두가지 라이센스 정책을 가지고 있다.

Community와 Enterprise의 차이점도 MySQL가 흡사한데, 프로그램 자체에는 없는 듯 하고 다만 Enterprise는 테크니컬 서포트가 추가되는 형태인듯 하다.

 

1. 특징

- 데이터 Insert 속도

InnoDB는 Primary key를 데이터의 물리적인 저장 주소로 사용한다. 그래서 auto increment 값을 primary key로 설정하면 굉장히 빠른 데이터 insert 속도를 낼 수 있다. 하지만 auto increment 값이 아닌 다른 값(예를 들어 varchar나 순서가 뒤죽박죽인 int 데이터)을 pk로 잡을 경우 데이터 insert 속도는 곤두박질 칠수 밖에 없는 구조를 가지고 있다. 반면 TokuDB는 pk의 데이터 유형에 상관 없이 빠르고 일정한 insert 속도를 낼 수 있다.


- 데이터 indexing

TokuDB는 index 구조로 B-Tree가 아닌 TokuTec사에서 특허를 낸 Fractal-Tree 구조를 사용하고 있는데, 이 Fractal-Tree의 알고리즘이 MySQL이나 기타 DB에서 흔히 사용되는 B-Tree보다 성능이 뛰어나고 단편화가 일어나지 않는 구조라고 한다.

그래서 index 기반의 query들(select, update, delete)에서 특히 더 좋은 성능을 볼 수 있다.

뿐만 아니라 단편화(Fragmentation)가 일어나지 않는 특징 때문에 장시간이 지나도 성능 하락이 발생하지 않는다.

B-Tree는 처음 Tree가 구성되어 있을 때에는 양쪽 Balance가 잘 맞기 때문에 빠르게 이진탐색이 가능하지만, 중간 중간 index가 추가, 삭제, 변경이 됨에 따라 양쪽 Balance가 조금씩 무너지는 단편화가 발생하게 되는데, 단편화가 심해질 경우, DB의 성능도 급격하게 떨어지기 때문에 주기적으로 몇시간 또는 몇일에 걸친 index rebuild나 optimize가 필요하다.

하지만, Fractal-Tree는 단편화가 일어나지 않기 때문에 성능 저하도 발생하지 않고, 주기적인 optimize도 필요가 없다. (이 부분은 테스트를 해보지 않아서 전적으로 TokuTec사의 주장을 바탕으로 작성함)


- 데이터 압축

사실 이 특징이 TokuDB의 가장 큰 장점이라고 할 수 있다. TokuDB는 두가지 압축 레벨을 제공하고 있는데, 아무런 설정 없이 데이블을 생성하면 기본 압축 레벨이 적용 된다. 기본 압축일 경우 데이터의 용량은 InnoDB에 비해 3~6배까지 데이터의 용량을 줄어든다. 또한 최대 압축일 경우 약 10배의 압축결과를 보여주는데, 이건 눈으로 보지 않으면 믿기지 않은 결과 일것이다. (실제로 테스트 해본 결과 정말 믿기 힘들정도로 용량이 들어든다.)

데이터는 압축 할 수 있다고 치고, 그럼 압축된 데이터 때문에 query 성능이 떨어지지 않을까 생각했는데 그렇지도 않다. 앞에서도 언급했지만, InnoDB보다 전반적으로 빠른 query 성능을 보여준다. 심지어 최대 압축일때도 InnoDB보다 빠르다. 물론 cpu를 조금 더 쓰기는 하지만, 생각만큼 cpu load가 올라가지 않아서 테스트 내내 놀라움을 금치 못했다.


- Flash Drive(SSD) 최적화

B-Tree는 작은 블럭단위로 write가 발생하지만, Fractal-Tree는 큰 블럭단위로 write가 발생하는데, 이는 SSD의 수명이나 성능에 많은 영향을 미친다. (TokuDB가 SSD에 보다 더 적합하다고 볼 수 있다.)


- Hot Schema, Hot Index 기능

"Hot"이라는 말은 여기서는 실시간이라는 뜻으로 이해하는 것이 좋을 듯 하다.

InnoDB는 새로운 컬럼이나 인덱스를 추가하기 위해 서비스를 중단(Table Lock이 걸리기 때문)해야 하지만, TokuDB는 서비스중에 Table Lock 없이 새로운 컬럼이나 인덱스를 추가 할 수 있다.


- 빠른 복구 기능

InnoDB는 table 이 깨졌을 경우 이를 복구하는데 수분에서 몇시간까지의 시간이 필요한다. TokuDB는 몇초만에 데이터 복구가 가능하다.


- 개발 편의성

TokuDB는 MySQL과 MariaDB에서 사용할 수 있는 Storage Engine으로 사용법은 MySQL이나 MariaDB와 똑같으며, 기존 DBMS가 제공하는 함수기능들을 모두 사용할 수 있다. 

TokuDB를 사용하기 위해 따로 학습이 거의 필요 없고 다만, tokuDB Engine tunning을 위해 my.cnf에 사용할 수 있는 configuration 몇가지만 알면 된다.


2. 테스트 결과

약 3억건의 Record를 가지는 데이터를 CSV 파일로 준비해서 InnoDB와 TokuDB에 각각 Bulk insert, select query를 날리는 테스트를 진행했다. (CSV파일의 총 용량은 22G)


- InnoDB

a. Bulk insert에 걸린 총 시간: 49분 22초

b. insert 후 DB size: 15G

c. select count query에 걸린 시간: 53초

d. index key add에 걸린 시간: 18분 26초

e. 부하테스트 툴을 이용한 query test: 초당 약 500건 처리


- TokuDB (기본 압축 레벨)

a. Bulk insert에 걸린 총 시간: 106분 14초 (primary key가 auto_increment값이라서 그런지 InnoDB가 훨씬 빨랐음)

b. insert 후 DB size: 3.7G (용량이 약 1/4로 줄어듬)

c. select count query에 걸린 시간: 44초 (약간 성능 향상)

d. index key add 에 걸린 시간: 4분 49초 (상당히 빨라졌음)

e. 부하테스트 툴을 이용한 query test: 초당 약 700건 처리 (약 1.4배 향상)


- TokuDB (최대 압축 레벨)

a. Bulk insert에 걸린 총 시간: 105분 52초

b. insert 후 DB size: 1.9G (InnoDB대비 8배 이상)

c. select count query에 걸린 시간: 44초

d. index key add 에 걸린 시간: 5분 27초

e. 부하테스트 툴을 이용한 query test: 초당 약 700건 처리

** 특이사항: 기본 압축 레벨에 비해 성능 하락은 거의 없지만, cpu load가 조금 더 올라갔고, Bulk insert 중 알 수 없는 이유로 2차례 Connection이 끊어짐, 그리고 약 1천건 정도의 데이터가 들어가지 않음 (최대 압축 레벨은 서비스에 쓰기에는 좀 불안 할지도.....)


- 테스트 결과에 대한 추가 설명

InnoDB와 TokuDB의 Insert 시간을 비교해 보면 2배 이상의 차이가 나는데, 이는 auto_increment 값을 primary key로 사용하고 있는 상태이기 때문으로 보이며, 순차적인 insert가 일어나는 경우에는 InnoDB가 배 이상의 속도를 내는 것으로 보인다.

하지만 auto_increment 데이터가 없는 상태에서 1천만건의 데이터 insert 속도를 비교했을 때는 InnoDB는 약 3분, TokuDB는 약 48초 정도가 걸렸는데, 데이터의 건수가 많아질수록 그 차이는 벌어질 것이다.

DB의 용량을 살펴 보면 TokuDB가 InnoDB에 비해 4배 이상 작으며, 최대 압축일 경우 8배까지 그 차이가 벌어지는 것을 볼수 있다.

부하테스트 툴을 이용한 query 테스트는 전반적으로 TokuDB가 우수한 것을 볼 수 있는데, 부하테스트의 경우 텟그트 환경중 네트워크 속도가 받혀 주지 않아 TokuDB의 경우는 실제로 위의 값보다 충분히 더 많은 초당 처리 갯수를 보일 수 있을 것으로 예상된다.

최대 압축 테스트중 2회 정도 Connection이 끊기는 현상이 발생했고, insert 후 record 갯수가 1천개 정도 적었는데, 이것이 최대 압축 라이브러리의 문제인지, 아니면 다른 외부요인이 있었는지는 확인하지 못했다.


'RDBMS' 카테고리의 다른 글

MySQL 클론의 역습 - 3 (Drizzle 편)  (0) 2013.07.01
MySQL 클론의 역습 - 2 (Percona Server편)  (0) 2013.07.01
MySQL 클론의 역습 - 1 (MariaDB 편)  (0) 2013.07.01
Posted by 알 수 없는 사용자
,

이번에는 MySQL 클론들 중에 맏형격인 Drizzle에 대해서 적어 볼까 한다.



3. Drizzle


Drizzle은 Cloud 환경 기반 Database이다. 

Drizzle은 Cloud 환경에 최적화 되었으며, 경량이고(하지만 고성능), 어떤 특정 회사가 개발하고 소유하는 것이 아니라 개발자 커뮤니티를 통해 개발되고 공유되고 있다. 

Drizzle(이슬비)라는 네이밍이 참으로 적절한것 같다.


처음 Drizzle에 대해서 조사할 때 "Cloud 환경 기반"이라는 것이 어떤 특징을 가져야 하는 가에 대해서 이해하지를 못했었다. 

Google신을 닥달해 본 결과 본인은 Cloud 환경이란 "한정된 하드웨어 리소스를 서로 공유해서 사용해야 하는 환경"으로 이해했다. 


하드웨어 리소스를 효과적으로 사용하기 위해 Drizzle은 MySQL을 대체하는 것이 목적이 아니라 MySQL을 최대한 다이어트 시키는 것을 선택했다.

그래서 MySQL과 개발 환경이 비슷하지만 완벽하게 호환이 되지는 않는다.


사실 Drizzle은 MySQL이 Oracle에 인수되기 훨씬 전에 이미 프로젝트가 시작되었기 때문에 앞서 소개된 두개의 DBMS가 MySQL처럼 MySQL의 대체제가 목적은 아니었다.

Drizzle은 초심을 잃어버린 MySQL에 반기를 들고, 초심으로 돌아가고자 튀어나온 DBMS로 개발도 개발자 커뮤니티를 중심으로 진행되고 있는 진정한 의미의 Open source Project라고 할 수 있다.


그럼 Drizzle은 어떤 군더더기들을 뺏을까?


  • Drizzle에는 trigger나 stored procedures가 없는데, Drizzle의 개발자들은 이 두가지의 기능 때문에 MySQL이 필요 이상으로 비대해 졌다고 생각했고, 이 기능들의 필요성에 대해서는 다른 방식으로 풀 수 있을거라고 생각했다.
  • Drizzle에서는 오직 utf-8만 지원한다. 
  • MySQL의 100만 줄이 넘는 소스 코드를 1/3 미만으로 줄였다.
  • 기본 storage engine으로 InnoDB를 채택했으며, MyISAM은 아에 빼버렸다.


Drizzle이 추구하는것이 무엇인지 느낌이 오는가?


그 외 replication을 굉장히 쉽게 구축할 수 있도록 수정하는 등, 관리 포인트를 최소화 함으로써 개발자나 관리자의 수고를 덜어주는데 집중했다.


전체적인 인상은 Cloud 환경이나, 간단한 웹프로그램을 위해 최소, 최적화된 경량 DBMS라는 느낌이 강하다.


Drizzle에 대해서는 조사만 하고 실제로 설치하고 돌려보지 않아서 뭐라 쓸만한 내용이 별로 없는데, 시간이 되는데로 테스트해보고 결과를 따로 포스팅 하도록 하겠다.



'RDBMS' 카테고리의 다른 글

MySQL 클론의 역습 - 4 (TokuDB 편)  (2) 2013.07.01
MySQL 클론의 역습 - 2 (Percona Server편)  (0) 2013.07.01
MySQL 클론의 역습 - 1 (MariaDB 편)  (0) 2013.07.01
Posted by 알 수 없는 사용자
,

오늘은 "MySQL 클론의 역습" 두번째 글로 또다른 fork DBMS인 Percona Server에 대해서 적어볼까 한다.


2. Percona Server


Percona라는 회사는 MySQL에서 근무하던 엔지니어들을 주축으로 2006년도에 설립된 MySQL관련 컨설팅 전문 회사이다. 

주로 MySQL 테크니컬 서포팅을 해오다가 MySQL이 Oracle로 인수 되던 해(2010)에 그동안의 노하우를 바탕으로 MySQL fork 프로그램인 Percona Server를 내놓았다. 

Percona Server 역시 MariaDB처럼 MySQL의 완벽한 대체품을 가장 큰 목표로 삼고 개발 되었지만, 세부적인 컨셉은 MariaDB와는 약간 차이가 있다.

MariaDB가 MySQL의 완벽한 대체품 + 자신만의 다양한 기능 추가가 컨셉이라면, Percona Server는 MySQL의 성능 및 안정성, 편의성을 극대화 하는 것이 목표이다.

이런 컨셉이 이해가 되는 것이 Percona라는 회사 자체가 MySQL 테크니컬 서포트, 컨설팅이 주요 업무이 회사이다 보니, 이런 접근 방식이 그들에게는 그동안의 노하우를 자연스럽게 표출할 수 있는 방법이었지 않았을까 라는 생각이 든다.

하여튼 이러한 컨셉 때문인지 실제로 인터넷 상의 MySQL vs MariaDB vs Percona 성능 비교 테스트 결과를 보면 Percona의 성능이 가장 좋은 것으로 나타난다.


이제 Percona Server의 기술적인 특징들을 짚고 넘어가 보자.

Percona 사이트에 기술되어 있는 특징은 다음과 같다.

  • Query가 보다 더 일관되고 빠르게 실행된다.
  • 최신의 고사양 하드웨어를 보다 더 효율적으로 사용한다.
  • 데이터를 샤딩해야 될 시점이 늦춰지거나, 아에 필요 없을 수도 있다.
  • 호스팅이나 전력 비용을 절약할 수 있다.
  • 관리나 성능 튜닝에 드는 시간을 절약할 수 있다.
  • 높은 가동시간을 달성할 수 있다.
  • 문제를 해결하는데 원인을 추측할 필요가 없다.

Query 성능 말고는 딱히 확인해 본바가 없어서 뭐라고 말할 수는 없지만, 하여튼 MySQL에 비해서 성능, 안정성, 관리의 편의성 등이 향상된것은 확실해 보인다.

실제 성능 테스트를 해본 결과로는 대체적으로 Query time이 MySQL보다 더 짧게, 그리고 일관되게 나오는 것을 확인 할 수 있었다. 다만 내가 테스트 했던 버전의 문제인지는 모르겠지만, Partitioning table에는 문제가 있어 보였는데, 이 부분은 추후 성능테스트 편에서 다시 자세히 이야기 하도록 하겠다.


위에 언급된 특징들중에 가장 큰 특징이자 장점이 하나 빠져 있는데, Percona는 XtraDB라는 InnoDB를 대체할 수 있는 Engine을 자체 개발해서 사용하고 있다.

XtraDB Engine은 InnoDB의 강화버전이라고 볼 수 있는데, 위에서 설명한 대부분의 특징이 XtraDB Engine에서 나온거라고 볼 수 있다.

XtraDB Engine은 현재 Percona에 기본 탑제되어 있고, MySQL에 추가할 수 있도록 Engine만 따로 제공하기도 한다.

그리고 MariaDB도 InnoDB를 대체할 목적으로 Percona가 개발한 XtraDB Engine을 기본 탑재하고 있다.


한편, Percona는 다년간의 MySQL 서포트, 컨설팅을 통해 축적된 노하우를 바탕으로 Percona Server 이외에 MySQL을 지원하는 다양한 소프트웨어들을 함께 개발하고 제공하고 있는데, 그 중 대표적인 소프트웨어인 Percona XtraBackup에 대해서 간단히 설명하도록 하겠다.


Percona XtraBackup은 실시간 백업을 지원하는 툴이다.

MySQL의 mysqldump는 백업시 해당 테이블이 Locking(MyISAM의 경우)되는데 비해 Percona XtraBackup은 테이블 Locking없이 백업(Hot backup)이 가능한 툴이다.

Percona의 문서를 보면, Parallel backups, Parallel compression,Streaming backups 등의 특징을 가지고 있으며, 무엇보다 Open Source이기 때문에 필요에 따라 수정도 가능하다.

Percona의 다양한 기능 및 추가 툴에 대한 내용은 여기에서 확인 할 수 있다.



'RDBMS' 카테고리의 다른 글

MySQL 클론의 역습 - 4 (TokuDB 편)  (2) 2013.07.01
MySQL 클론의 역습 - 3 (Drizzle 편)  (0) 2013.07.01
MySQL 클론의 역습 - 1 (MariaDB 편)  (0) 2013.07.01
Posted by 알 수 없는 사용자
,

사실 이 글의 제목을 처음에는 “MySQL의 형제들” 이었다.

source가 fork된것이니 형제보다는 부모 자식 관계가 더 맞지 않을까 생각되서, “MySQL의 자식들”이라고 제목을 바꾸었다가 어감이 좋지 않아서 MySQL의 창시자가 자신의 첫째딸 이름을 따서 MySQL이라고 작명한 것에 착안해 “MySQL의 딸들”이라고 바꾸었다.

그런데, 그만 코드가 복제되서 다시 분화된 것인데 이것을 부모 자식간이라고 해야 하나 형제간이라고 해야 하나 쓸데없는 고민에 빠져버렸다.

결국, 장고 끝에 제목은 “MySQL 클론의 역습”이라고 결정했다. (그런데 실제로 MySQL과 클론들끼리 정말 싸우지는 않는다. 심지어 그들 간은 사이가 좋아 보이기 까지 한다.)

헛소리는 여기까지 하고 본문으로 들어가 보자. ^^;

우리나라에서 DB라고 하면 Oracle 아니면, MySQL이다. 특히 웹서비스 환경은 MySQL이 현재까지도 대세라고 할 수 있다.

최근들어 NoSQL이니 BigData니 하는 새로운 페러다임과 프로그램들이 등장하면서 광풍의 조짐이 보이고는 있지만, 여전히 사용함에 있어서는 제한적이고 진입장벽이 만만치가 않다.

아직까지 DB의 메인스트림은 RDBMS이고, 새로운 웹 프로젝트가 진행되면, 당연하듯 DBMS로는 MySQL이 거론되곤 한다.

사실 좀 지루했었다.

뭔가 MySQL이 아닌 새로운 것을 만지고 싶었을 뿐이었다.

그래서 어떤 프로젝트에서 Postfix를 도입해 볼까 하다가 MySQL에 익숙한 엔지니어들과 개발자들의 반대에 부딛혀야 했고,  본인 스스로도 딱히 그 프로젝트에서 Postfix를 써야 할 당위성을 찾기도 힘들어서 포기한적이 있다.

최근 모바일 게임 관련 프로젝트를 진행하면서 MySQL에서 fork된 몇가지 DBMS들을 만져볼 수 있게 되었다. 이해 당사자도 적고, 약간 도전적인 프로젝트이다 보니 아무런 태클 없이 혼자서 자유롭게 DBMS를 선택할 수 있는 기회였다.

이 글은 그 때 research 했던 MySQL fork program 들에 대한 간단한 소개 글이다.

MySQL이 Oracle에 편입된 후, MySQL의 향후 운명에 대한 우려의 목소리가 많아졌다.

이러한 우려 속에서 MySQL의 대안을 찾으려는 움직임이 많아지고 있는데, 그것들 중 대표적인 것으로 MySQL에서 fork된 프로젝트들을 꼽고 싶다.

이 글에서는 MySQL fork 프로젝트들 중 가장 많이 알려진 세가지 프로젝트에 대해서 정리 하려고 한다.

1. MariaDB

MariaDB 의 주요 개발자는 Michael Monty Widenius라는 사람으로 MySQL을 개발했던 사람이고, 그 MySQL을 Sun에 10억 달러(약 1조원)에 매각하면서 핀란드 10대 부자중 한 명이 된 사람이기도 하다.

하지만 MySQL을 인수했던 Sun이 다시 Oracle로 인수되자, Monty Program AB이라는 회사를 설립하고 MySQL의 소스를 기반으로 MySQL과 완벽하게 호환이 되는 DBMS를 개발 하는데, 이것이 MariaDB이다.

MySQL, MariaDB 둘 다 Monty의 딸 이름을 따서 만들었는데 MySQL은 첫째 딸, MariaDB는 둘째딸의 이름에서 따론 것이라고 한다.(딸바보인가보다)

MariaDB는 MySQL의 소스를 가져다 만들기도 했지만, 목표자체가 MySQL을 완벽하게 대체하는 것이다 보니, 기존 MySQL과 완벽하게 호환이 된다.

프로그램의 룩앤필도 거의 똑같고 지원하는 함수들도 모두 일치하며 심지어 파일 이름들도 그대로 MySQL의 것을 가져다 쓰고 있다.

개발자들이 그냥 보기에는 이게 MariaDB인지 MySQL인지 모를 정도이다. (Client의 프롬프트가 “MariaDB” 로 뜨는 것 말고는 정말 똑같다.)

당연히 php-mysql 이라던지, jdbc-mysql-connector같은 기존 db connection library도 그대로 사용할 수 있기 때문에 실제로 개발자들은 MySQL에서 MariaDB로 DB 서버가 바뀐다고 해도 전혀 소스코드 수정이 필요없으며, 추가적인 DBMS에 대한 학습도 거의 필요가 없다.

즉, MySQL을 다룰줄 아는 개발자라면 MariaDB의 진입장벽은 거의 없는 수준이라고 할 수 있다.

하지만, MySQL을 완벽하게 대체한다는 사실만으로 기존에 MySQL을 잘 사용하던 사람들이 막연한 불안감이나 새로운 프로그램에 대한 단순한 호기심만으로 MariaDB로 갈아타지는 않을 것이다.

그럼 MySQL 대신 MariaDB를 썼을 때 얻을 수 있는 잇점들은 어떤 것이 있을까?

첫번째 장점은 월등히(?) 빠른 쿼리 타임을 들 수 있다.

인터넷이 돌아다니는 다양한 퍼포먼스 테스트 결과를 보면 전반적인 쿼리 성능이 MySQL에 비해 좋은 것을 알 수 있다.

특히, sub query나 join query 같은 경우 따로 MariaDB의 특징으로 소개할 만큼 성능 향상이 있다.

그리고 본인이 직접 테스트한 결과에서는 Partitioning table에 대한 select 쿼리 결과가 특히 눈길을 끌었는데, 자세한 테스트한 결과는 따로 추가 글을 작성할 예정이다.


두번째 장점은 다양한 추가 기능들이다.

이 글에서는 다양한 추가 기능들중 몇가지만 소개하고자 한다.

  • Microseconds in MariaDB

테이블을 생성할 때 시간관련 자료형에 정밀도를 설정 할 수 있다.

CREATE TABLE example(

col_microsec DATETIME(6),

col_millisec TIME(3)

);

정밀도는 0부터 6까지 설정할 수 있으며, 설정된 값만큼의 microseconds가 출력된다.

SELECT CURTIME(4);

–>10:11:12.3456


  • Microseconds Precision Processlist

INFORMATION_SCHEMA.PROCESSLIST 테이블에 TIME_MS 컬럼이 추가 되었다.

processlist를 볼때 MySQL에서는 실행타임이 초단위까지 밖에 나오지 않았다면 MariaDB에서는 microseconds 단위까지 확인 할 수 있다.

  • Table Elimination

여러개의 table 조인으로 구성된 쿼리의 경우, 사용하기 편하기 view table을 따로 구성하기도 하는데, view table에서 특정 컬럼을 select할 경우 실제로 조인된 table들중 쿼리에 필요 없는 테이블이 발생할 수 있다.

MariaDB는 이런 경우 자동으로 쿼리에 필요 없는 테이블을 조인쿼리에서 제거해주는 기능을 가지고 있다. (이 특징은 성능 향상쪽에 가까운것 같기도 하다.)

  • Virtual Column

다음의 테이블 스키마를 보자.

create table table1 (

a int not null,

b varchar(32),

c int as (a mod 10) virtual,

d varchar(5) as (left(b,5)) persistent

);


table1의 c 컬럼은 가상컬럼이다. 실제로 storage에 저장되지 않고 query 실행시간에 계산되어 출력된다.

table1의 d 컬럼은 실제로 storage에 저장이 되는 가상컬럼으로, insert나 update 때 계산되어 저장 되는 컬럼이다.

더 많은 추가 기능들이 있는데, 추가기능에 대한 설명은 여기에서 확인 할 수 있다.

한가지 주의할 점은 MariaDB의 추가 기능들을 사용할 경우 혹시라도 부득이하게 MySQL로 돌아가야 될 경우 호환이 안될 수도 있다는 점을 유의해야 한다.


마지막으로 MariaDB는 다양한 Storage Engine을 지원한다.

  • 1. Aria

    Aria 엔진은 MyISAM과 호환되면서 추가적으로 Transactional기능이 추가된 Engine이다.

  • 2. XtraDB

    InnoDB의 대체 Engine으로 다음에 설명할 Percona사에서 개발한 Storage Engine이다.

  • 3. PBXT

    일반적인 목적의 transactional storage engine으로 현재 더이상 maintaine 되지 않고 있어서 MariaDB에 기본 탑제되어 있지 않지만, 필요한 경우 재컴파일을 통해 사용할 수 있다.

  • 4. FederatedX

    Federated Storage Engine의 fork engine으로 Federated engine은 원격 서버의 table에 접근해서 Insert, Update, Delete, Select 를 할 수 있도록 해주는 engine이다.

  • 5. OQGRAPH

    Open Query Graph storage engine의 약자로 트리나 그래프 형태로 출력될 수 있도록 데이터를 저장하는 engine이다.

  • 6. IBMDB2I

    MySQL 5.1.55에서 빠졌던 엔진인데, MariaDB에서는 아직까지 지원하고 있다.

  • 7. SphinxSE

    Full Text Search Engine 으로 Full Text Search가 필요한 경우 사용할 수 있을 듯 하다.

  • 8. Cassandra in MariaDB-10.0

    NoSQL DBMS인 Cassandra cluster에 MariaDB를 통해 접근 할 수 있도록 10.0 버전에 추가되었다.


3가지 측면에서 MariaDB의 장점에 대해서 설명했는데, 개인적으로는 첫번째 장점인 성능 향상 만으로도 MariaDB를 쓰는 이유는 충분한 것 같다.

본인 입장에서는 추가 기능의 필요성은 아직까지 피부로 와닿지 않았고, 추후 MySQL이나 Percona로 전환해야 될지도 모르는 이슈 때문에 전혀 고려대상이 되지는 못했다.

MariaDB에 대한 소개는 여기까지 하고 다음 글에서는 Percona Server에 대해 이야기 하도록 하겠다. 


'RDBMS' 카테고리의 다른 글

MySQL 클론의 역습 - 4 (TokuDB 편)  (2) 2013.07.01
MySQL 클론의 역습 - 3 (Drizzle 편)  (0) 2013.07.01
MySQL 클론의 역습 - 2 (Percona Server편)  (0) 2013.07.01
Posted by 알 수 없는 사용자
,