YCSB를 이용한 NoSQL BMT

Bigdata 2013. 10. 11. 22:11

보통 NoSQL을 처음 접하고 서비스에 사용될 오픈소스 NoSQL을 찾다보면 가장 먼저 하는 질문이 어느 제품을 써야하나? 이다. 간단히 말하면 빅데이터 개발자는 모든 schema-less Bigdata DB 제품을 통틀어서 NoSQL이라 부르지만 사실상 모든 NoSQL 제품마다 사용되는 용도와 적합한 환경이 제각기 다르다. 그렇기 때문에 각 NoSQL의 용도와 접근 패턴별 성능, 확장성, 안정성 등을 요구사항에 맞춰 선택해야 한다. 

상용 솔루션을 사용할 경우 각 제품 세일즈 대표나 컨설턴트가 각기 제품의 특성을 잘 설명해주겠지만, 오픈소스의 경우 그렇지 않다. 온라인 BMT 자료도 오래된 것이 많다. 그렇기에 본인이 직접 NoSQL 성능 테스트를 쿼리 유형 및 패턴별 성능 테스트를 할 수 있게하는 오픈소스 툴이 있는데 YCSB (Yahoo Cloud Service Benchmark: https://github.com/brianfrankcooper/YCSB)이라 한다. 

NoSQL 테스트 프레임은 이미 brianfrankcooper라는 사용자가 이미 3년전에 개발하였고 정말 다양한 사용자가 각기 시스템과 NoSQL에 맞춰 참여하고 있다. 별도의 코드리뷰 및 CI 없이 진행되는 오픈소스라서 테스트 프레임과 초기에 제공된 NoSQL 모듈 (HBase, Cassandra, MongoDB, Redis)를 제외하면 코드가 약간 중구난방이다. 코드 라인 수에 비해 포킹된 수는 300개 가량이다. 각 회사와 개발자의 특화된 시스템과 NoSQL에 맞추어 테스트 하다 보니 포킹 수가 많아진 듯하다. 여러분도 신규 버전이나 특화된 NoSQL을 테스트하려면 최소한의 코드 수정 또는 모듈 개발은 필수적으로 보인다.

YCSB 내부 아키텍처를 설명하기 전에 짚고 넘어가야 할점은 온라인 커뮤니티에 올라온 대부분의 NoSQL 성능 비교 자료를 믿으면 안된다. 자료가 사실적이지 못하다는 말이 아니고 그 자료에서 결론지은 성능이 여러분이 사용할 시스템에서도 똑같이 나올 확률은 비교적 적다. 비슷하게라도 나오면 다행이다. 한명의 시스템 디자이너가 로우레벨부터 사용자 인터페이스까지 모두 동일하게 구성하지 않는 이상 작은 설정차이 하나에도 시스템 성능은 매우 크게 급변할 수 있다. YCSB는 그런점에서 NoSQL 커뮤니티에 제공할 객관적인 성능비교 툴로 사용되기 보다 현재 손앞에 놓여진 시스템 클러스터와 사용자 엑세스 패턴에 가장 적합하고 빠른 성능을 내는 NoSQL을 주관적으로 선택하고자 사용되는 Decision-making 툴에 가깝다. 그러므로 야후에서 발표한 YCSB 성능비교 자료(http://www.brianfrankcooper.net/pubs/ycsb-v4.pdf)나 앞으로 본 블로그에 올라오는 성능비교 자료는 참고자료로만 사용하면 좋겠다.

각 시스템 별로 성능 변화에 영향을 줄 수 있는 영역은 다음과 같다.

  • 하드웨어 성능 - 동일 클러스터에 YCSB 테스트를 진행하여 하드웨어 성능 차를 최소화 할 수 있다. 

  • 네트워크 성능 및 구조 - 네트워크 의존도가 높은 NoSQL과 그렇지 않은 NoSQL을 비교할 경우 네트워크 성능은 큰 변화를 줄 수 있다.
  • NoSQL 아키텍쳐 또는 소프트웨어 버전 - NoSQL 코어와 아키텍쳐에 따라 사용되는 용도가 결정되는데 이 부분이 YCSB를 사용하여 확실한 성능을 확인하고자 하는 부분이다.
    • Consistency
    • Read 최적화 or Write 최적화
    • Availability (데이터 이중화 및 복제)
    • 캐쉬 기술 적용
    • B+tree, B-tree, Log-structured Merge Tree 등
  • NoSQL 설정 및 튜닝 노하우 - NoSQL 시스템 운영자의 숙련도 및 튜닝 노하우 깊이에 따라 결정되는 부분이라 YCSB 결과를 크게 결정하는 부분이며 NoSQL 성능 비교에 가장 큰 논점이 되는 부분이다. 
  • 데이터 스키마 및 키 디자인 - 스키마 디자인에 따라 NoSQL 성능 역시 크게 변할 수 있다. 흔히 Row Key 디자인과 Column Key 디자인을 일컫는데, 데이터 쿼리 요구사항에 맞추어 Workload Generator를 적당히 구성하면 된다.
  • 사용자 엑세스 패턴 - 스키마 디자인이랑은 다른 영역이다. 스키마 디자인은 어떻게 데이터를 DB상에 보관하느냐이고 엑세스 패턴은 데이터를 어떤 패턴으로 읽느냐는 것이다. 
    • Read와 Write 비중
    • 랜덤 및 시퀀셜 쓰기
    • 배치 및 실시간
    • 최신 데이터 및 아카이브 데이터 쿼리 
      등 다양한 패턴이 있지만 이도 스키마 디자인과 마찬가지로 요구사항에 지정되어 있으므로 비교 NoSQL 양측에 동일하게 Workload 를 구성하면 된다.

YCSB

Yahoo! 에서 사용되는 PNUTS와 최근 급격히 늘어나는 타 NoSQL 솔수션을 비교하기 위해 자체 오픈소스 NoSQL 벤치마크 테스트 툴을 개발하였다

YCSB는 크게 다음과 같이 두 부분으로 나누어진다

  • YCSB 클라이언트 – 워크로드를 생성하고 NoSQL DB Connector 역할을 한다
  • 워크로드 패키지 (Property file 포맷) – 워크로드를 생성하는데 필요한 설정 값 리스트

Cloud DB는 테스트 대상인 NoSQL을 말하는데 현재 다음과 같은 제품을 모듈 형태로 지원한다.

기본 제공되는 제품 버전은 최상위 pom 파일을 보면 알수 있는데, 대부분 조금씩 시대에 뒤떨어진 버전일 것이다. 최신 버전을 테스트 하는 경우면 pom 파일을 수정하여 버전을 바꾸고 컴파일 하면 되고 (다소의 코드 수정 필요), 신규 NoSQL 모듈을 추가하고 싶으면 https://github.com/brianfrankcooper/YCSB/wiki/Adding-a-Database 위키를 참조하면 된다. CREATE, READ, SCAN, UPDATE 등의 DB 인터페이스 레이어만 작성하면 간단히 추가할 수 있다. 다른 개발자에 의해 포킹된 버전을 찾는것도 한 방법이긴 하지만 메인프레임에 없는 코드면 새로 작성하는게 더 빠를듯 하다.

테스트

Workload

성능 테스트는 사용자 접근 패턴에 맞는 워크로드를 사용하여 YCSB 내부적으로 테스트를 진행한다. 워크로드는 다음과 같이 기본 제공되는 워크로드와 사용자 정의 워크로드를 사용할 수 있다.

(다음 워크로드는 YCSB 프로젝트 홈 아래 workloads 디렉토리에서 확인 가능)

Workload A: Update Heavy (read 50%, update 50%)
실무 예) 최근의 액션을 저장하는 세션 정보 어플리케이션

Workload B: Read Heavy (read 95%, update 5%)

실무 예) 포토 태그 – 태그는 한번만 작성하고 주로 읽기 작업이 실행된다

Workload C: Read Only (read 100%)

실무 예) 사용자 프로파일 캐시 – 외부 저장소에 저장되어 있는 사용자 정보를 조회

Workload D: Read Latest Record (read 95%, insert 5%)

레코드 선택 알고리즘: Zipfian

실무 예) SNS 사용자 상태 업데이트 – 가장 최근의 상태와 뉴스만이 중요함

Workload E: Short Range Scan (read 95%, insert 5%)

각 작업마다 100개 내외의 레코드 영역을 한번에 쿼리 한다

실무 예) 쓰레드 형식의 게시판 – 각 조회마다 포스트의 쓰레드를 스캔 한다

Workload F: read-modify-write

읽기, 수정, 쓰기의 단계를 순서대로 수행

실무 예) 사용자 데이터베이스 – 각 사용자 활동마다 사용자 레코드를 읽고 업데이트 한다

DB 접근 패턴은 매우 다양하므로 사용자 요구사항에 맞춰서 워크로드를 구성하면 된다.


아래부터는 YCSB에서 제공하는 프레임은 아니고 사용자가 위에서 설명한 YCSB 툴을 이용하여 직접 테스트 해볼 수 있는 항목이다.  

Tier1 - Performance

동일한 하드웨어 구성에서 데이터 로드에 변화를 주어 성능을 측정하는 테스트이다. 사용자가 목표 쓰루풋을 지정하고 위의 워크로드를 실행하면 평균 응답시간(latency)을 받을 수 있다. 쓰루풋을 높일 수록 응답시간은 길어지는데 특정 쓰루풋에서 응답시간이 매우 높아지거나 응답이 안오는 지수가 있다. 이 지수를 해당 시스템위에서의 NoSQL 최대 쓰루풋이라 보면 된다.

Tier2 - Scaling

Scale Up - 클러스터의 워커 노드가 증가함에 따른 성능 차이 테스트이다. 테스트 방식은 데이터를 미리 클러스터에 로드 하고 10분정도 기다린다 (데이터가 클러스터에 분산되고 안정화되는 시간). 그 다음엔 원하는 워크로드와 쓰르풋 (Tier1에서 찾은 최대 쓰르)을 지정하여 성능을 테스트한다. 테스트를 종료하고 노드를 추가한다음 같은 테스트를 다시 진행하여 응답속도에 대한 변화를 찾아낸다. 노드를 증가하면서 테스트를 반복한다. 
테스트 중간중간에 쓰루풋 목표치를 변경하여 노드 증가에 대한 쓰루풋 변화도 테스트 해볼 수 있다.

Elastic Speedup - 작동중인 클러스터에 워커 노드를 추가했을 경우 성능 측정을 위한 테스트이다. 위 Scale Up 테스트와 혼돈 될 수 있는데 Elastic Speedup은 응답속도 성능을 측정한다기 보다, 노드가 추가되는 순간 클러스터에 가해지는 성능 임팩트와 클러스터가 안정화되는 시간을 측정해볼 수 있다. 예를 들어 카산드라의 경우 노드가 추가되는 경우 리전 별 키 영역을 다시 계산하고 데이터 발란싱 또는 이동이 집약적으로 발생한다. 이러한 노드 추가에 대한 클러스터 성능 영향도를 측정해 볼 수 있다. 

Tier3 - Availability

야후에서는 Availability라고 부르는데 사실은 Failure Test이다. 위의 Scale Up과 Elastic Speedup 과 비슷한 테스트이지만 노드를 증가 하는 대신 클러스터에 장애를 발생한 후 클러스터의 성능을 측정하는 테스트이다. 테스트 가능 장애 유형에는 호스트 셧다운, 디스크 장애, 네트워크 장애 등이 있다. 대부분의 NoSQL의 경우 CAP 정의 Partition Tolerance를 적용하므로 특정 노드 접근이 안되어도 클러스터는 정상 작동할 것이다. 대신 이러한 장애 발생시 성능에는 필시 변화가 발생하고 데이터 손실에 따른 안정성 변화가 있을 것인데 이를 측정하기 위한 테스트이다.

Tier4 - Replication

각 클러스터에 설정한 복제계수(Replication Factor) 변화에 따라 필시 성능 변화도 있을 것이다. 복제계수에 변화를 주며 테스트할 수 있는 영역은 Performance, Availability, Consistency, Locality (server, rack, cluster, datacenter..)이다. 눈으로만 외우지 말고 각 항목이 무엇을 의미하는지 생각해 보자.

야후에서 발표한 벤치마크 테스트의 경우 Tier3와 Tier4는 테스트에 따른 장애 유형과 테스트 방식이 복잡하여 향후과제로만 남겨뒀다. 내가 보기에도 왠만한 NoSQL 성능 측정은 Tier1과 Tier2로도 충분해 보인다.


참고자료

https://github.com/brianfrankcooper/YCSB
Yahoo! Cloud Serving Benchmark. Brian F. Cooper. Yahoo! Research
Benchmarking Cloud Serving Systems with YCSB
Brian F. Cooper. Yahoo! Research

설정

트랙백

댓글