티스토리 툴바

기술 지향적인 구글 사상과 그 아우라로 인한 엄청난 성공 때문에 많은 개발자들이 잘 알려지지 않은 구글 인프라에 대해 막연한 동경을 가지곤 한다. 하지만 상세한 정보가 없기 때문에 거대한 인프라를 어떤 생각을 가지고 만들었는지에 대해 살펴볼 기회가 거의 없었다. 구글 빅 테이블 논문 뒷편에 기재된 "교훈(Lesson)"장을 통해 구글 개발자들이 대단위 분산 시스템 개발 시에 어떤 자세로 만들었는지를 살짝 볼 수 있어 소개한다. 이 장에 의하면 성공한 구글 인프라로 알려진 빅 테이블 설계, 개발, 적용하면서 구글 개발자들은 다음과 같은 4가지 중요한 교훈을 얻었다고 한다.

1. 생각할 수 있는 모든 장애 포인트를 고려하라.

2. 쓸려고 하는 명확한 기능만 구현하라.

3. 시스템 곳곳을 모니터링 하라.

4. 구조가 단순해질 때까지 지속적으로 개선하라.

위 4가지 교훈은 언듯보면 천재들이 '교훈'이라고 말한 것 치고는 너무 단순해 보인다. 실제 빅 테이블 논문을 클릭해보라. 4번째 교훈의 '단순'이란 단어가 어울리지 않음을 쉽게 알 수 있다. 그럼 이런 구글러들의 교훈을 어떻게 해석해야 할까? 개인적으로는 복잡해질 수 있는 분산 시스템을 개발할 때에 "실용성을 염두에 두고 추적가능하고 명료하도록 지속적으로 개선하라"로 해석함이 맞을 듯 싶다.
 
덧 붙이자면 빅 테이블을 만든 구글러들도 빅 테이블을 "창조"한 것은 아니었다. 개인적 볼 때 구글러들은 "익히 알려진 기술들의 창조적 조합의 천재"인 것 같다. 빅 테이블에서도 마찬가지였다. 기존에 연구되던 복잡한 분산 B 트리나 광대역 분산 저장소, 그리고 컬럼 데이터베이스의 장점들 중에 빅 테이블을 사용할 구글 제품에 딱 필요한 것만을 조합해 설계, 구현한 것이 빅 테이블이기 때문이다. 여러분이 복잡한 분산 시스템을 설계하고 있고 성공한 인프라를 만들길 원한다면 위 4가지 교훈을 계속 되새겨 보라.

사용자 삽입 이미지

존 마에다 교수의 "단순함의 법칙"이 친근하게 느껴지는 이유는 뭘까?


@webJOY
 


사용자 삽입 이미지

최근 몇몇 블로그 글을 읽다 보면 구글 빅테이블(Google BigTable)을 관계형 데이터베이스의 대체 저장소로 오해하고 있는 듯한 글들이 눈에 띈다. 이런 오해의 근원은 빅 테이블이 몇몇 구글 서비스의 저장소로 사용되었음을 "Bigtable: A Distributed Storage System for Structured Data"란 논문에서 언급하였기 때문인 것 같다. 또, 구글 빅 테이블의 오픈소스 클론 프로젝트인 HyperTable 개발자인 더그 주드(Doug Judd)가 기업용 소프트웨어 개발 커뮤니티인 인포큐과의 인터뷰에서 현재 MySQL이 차지하고 있는 웹 콘텐트 저장소로 자리매김하고 싶다란 견해를 밝혔다. 이런 측면만 보면 구글 빅테이블과 관계형 데이터베이스를 직접 비교하는 우를 범할만도 하다.

모든 데이터베이스는 레코드 단위로 데이터를 저장하는 로우 기반 데이터베이스와 필드 단위로 데이터를 저장하는 컬럼 기반 데이터베이스로 구분할 수 있다. 제목, 작성일, 본문 필드를 가진 사용자가 작성한 글을 글 단위로 저장한다면 로우 기반 데이터베이스가 되고 제목, 작성일, 본문 필드 각각을 따로 저장하면 컬럼 기반 데이터베이스가 된다. 구글 빅테이블은 컬럼 기반 데이터베이스에 해당된다. 반면에 최신 관계형 데이터베이스는 이 두가지를 혼용하여 사용한다고 한다.

저장 구조가 다르기 때문에 이 두가지 형태의 데이터베이스는 사용처에 따라 각자의 성능을 최대로 발휘된다. 데이터를 레코드 단위로 저장, 인출하는 관계형 데이터베이스는 한 레코드 전체를 읽어 사용해야 하는 경우에 한번에 읽을 수 있어 더 유리하다. 반면에 컬럼 데이터베이스는 컬럼 단위로 쓰거나 읽어야 하는 경우에 더 유리하다. 구글의 빅테이블은 웹 크롤러가 저장하고 분산 인덱서가 인출하는 웹 저장소로 시작되었기 때문에 컬럼 기반 데이터베이스 형태로 설계되었다. 이런 선택은 특정 색인필드만을 대량 고속으로 인출해야 하는 분산 웹 색인기의 사용 패턴에 기인한다.

컬럼 기반 데이터베이스는 컬럼 데이터형이 동일하기 때문에 이질 데이터형을 가진 필드를 가진 로우 기반 데이터베이스에 비해 압축 효율이 더 좋기 때문에 저장공간 효율면에서 우월하다. 특히, 컬럼 값이 띄엄띄엄 있는 대용량 데이터를 다룰 경우에 더 좋아진다. 반대로 무작위 인출 연산이 필요한 경우에는 압축해제 시간과 여러 컬럼을 인출해 합쳐야 하는 부담으로 로우 기반 데이터베이스 비해 성능이 떨어진다.

이와 같은 구조적인 차이로 인해 구글 빅테이블은 MySQL과 같이 주 저장구조로 로우 기반 데이터베이스인 관계형 데이터베이스와는 다른 목적으로 설계되어 대치물로 비교되어서는 절대 안된다. 컬럼 기반 데이터베이스가 컬럼의 합인 레코드를 모두 읽어야 하는 경우에 성능이 떨어짐에도 불구하고 저장 효율이 높고 컬럼 단위 인출 속도가 높다는 특징으로 단순한 구조의 대용량 웹 콘텐트의 저장소와 같은 특수한 경우에만 적합하기 때문이다. 한 개의 큰 테이블만을 사용자에게 제공하는 구글 베이스가 이와 같은 특수 사용예다. 논문에 언급한 구글 서비스들도 단순한 구조의 데이터만을 구글 빅테이블에 올리고 있다.

구글 서비스에서 구글 빅테이블을 웹 콘텐트 저장소로 일부 채택했다고 해서 모든 웹 서비스의 데이터 저장소로 구글 빅테이블을 사용할 수 있을 것이라고 오해하면 안된다. 잘 알려진 구글 인프라들은 대용량 검색인프라에 뿌리를 두고 설계되었기 때문에 설계 중심에는 오프라인 처리가 기본 사상이다. 비록 구글 빅테이블과 같이 온라인 처리를 지원하는 인프라라도 오프라인 대용량 처리가 기본 사상이기 때문에 온라인 처리는 특수한 경우에만 효율적이게 된다. 따라서 관계형데이터베이스가 충분히 처리 가능한 수 백만개의 데이터를 다루는 곳에서는 부적합한 경우 또는 사용할 수 없는 경우가 더 많다. 사용자 계정정보, 구매 기록과 같이 트랜잭션과 완벽한 관계성 준수가 필요한 경우는 부적합하고 문자열이 위주인 게시판 또는 정적 웹 페이지를 많이 저장하고 인출할 때 유용하다. 특히, 수억개로 누적될 수 있는 있는 웹 로그, UCC, 크롤된 텍스트를 저장하고 인출하는데 적합하다.

[1] 구글 빅테이블 논문: http://labs.google.com/papers/bigtable.html
[2] 인포큐 인터뷰: http://www.infoq.com/news/2008/04/hypertable-interview
[3] 하이퍼테이블: http://hypertable.org/
[4] 컬럼 기반 데이터베이스: http://en.wikipedia.org/wiki/Column-oriented_DBMS

@webJOY



사용자 삽입 이미지

검색엔진을 만들다 보면 참고할 책이 별로 없어 도제식으로 선배가 만든 엔진에 대해 배우거나 루씬 같은 오픈소스 검색엔진 코드를 보면서 배우게 된다. 핵심구조가 고정된 엔진만을 보고 배웠을 때 서비스 기획의도에 적합하도록 색인구조와 같은 핵심구조를 변경하기란 매우 어려워 질의를 처리할 때 기교를 부리는 편법을 쓰곤 한다. "루씬 인 액션(에이콘)"이나 대학 교재로 많이 사용되는 "최신정보검색론(홍릉과학출판사)" 같은 책들은 루씬 색인의 활용법 또는 이론적 배경 설명에 머물러 색인구조 설계와 같은 핵심구조 설계에는 큰 도움이 되지 못 한다. 검색엔진 핵심구조 설계에 필요한 요소들을 그나마 가장 잘 설명하고 있는 "Managing Gigabytes"가 있지만, 이 책은 1994년에 초판을 거쳐 1999년에 개정판이 출간되었기 때문에 최신 기술들에 대한 소개가 부족하고, 적용이 힘든 이미지 검색에 상당히 많은 장이 할애되어 있어 비록 바이블 격이지만 아쉬운 점이 많은 책이다.

원제가 "An Introduction to Information Retrieval"인 이 책은 3명의 저자가 2002년 가을학기와 2003년 겨울학기에 스탠포드에서 "정보검색과 정보추출" 강의를 하면서 정리한 내용을 캠브리지 대학 출판사와 출판한 것으로 PDF 버전으로 공개되어 무료로 다운받을 수 있다. 2008년에 책으로 출간될 예정이지만 다운로드 페이지에는 출간 후에도 이 PDF 파일들을 유지하겠다고 되어 있어 특히나 매력적이다. 검색엔진과 맞물려 많이 사용되는 분류기술들에 대한 소개와 웹 크롤링과 인덱싱에 대한 기술도 소개하고 있어 전체를 바라보는데는 큰 도움이 되는 책이다. 반면에 대학 교재라는 한계로 구현에 이르는 상세한 내용이 부족하고 확률모델과 같은 실용적이지 않은 기술들에 일부 장이 할애된 점에서는 아쉽다.

크리스토퍼와 하인리히는 NLP 교재로 많이 사용되는 "Foundations of Statistical Natural Language Processing" 을 쓴 NLP 배경을 가진 교수들이고, 프랍하카은 "Randomized Algorithm"이란 알고리즘 책을 쓴 야후 사람이다. 백그라운드로만 보면 "정보검색"에 분야와 거리있는 사람들이 모여 쓴 책이지만 1장 ~ 7장까지 정리된 정보검색 관련 알고리즘들은 오히려 MG 검색엔진을 만들며 쓴 "Managing Gigabytes"보다 더 깔끔히 정리되어 있다.

흔하지 않은 검색 관련된 신간이고 또 무료 버전이 있어 더욱 매력적인 책이다. 현재 검색엔진을 만들고 있거나 새로 입문하려는 분들에게는 옆에 놓고 틈틈히 공부하기에 좋은 책인 것 같다.

@webJOY
10BEA3HbFfX2jwrZKQhsNR2EOoJ