2016년 3월 28일 월요일

구글을 지탱하는 기술

<구글을 지탱하는 기술>을 읽고서

구글을 지탱하는 기술 첫 제목을 보고서 구글에 대하여 여러 가지를 떠올리는 제목이었습니다. 요즘 한창 구글이 성장을 하고 있으니까 구글에 대한 단순소개 서적이려니 했는데, 읽고 나니 구글이라는 업체에 대하여 성공하기 까지 큰 역할을 한 기술력과 회사의 개발체제에 대하여 엔지니어적 관점에서 기술한 책이라는 것을 알 수 있었습니다.

검색엔진에 대하여 잘 모르는 저로서는 처음 배우는 것들이라 다 신기하였습니다.
검색엔진의 뒤에 숨겨진 세부적인 이면들, 매일 네이버와 구글 포털을 통하여 궁금한 것들에 대하여 검색하면서 여러 가지 검색된 결과 웹 페이지들에 대하여 너무도 당연하게 생각했던 부분들, 그런 부분들을 구글이라는 이름을 통하여 검색엔진이라는 것에 대하여 조금이라도 내부적으로 접근할 수 있는 좋은 계기가 되었던 것 같습니다.

간단하게 이 책의 인덱스를 살펴 보면 
1장  구글의 탄생
2장  구글의 공룡화
3장  구글의 분산 스토리지
4장  구글의 분산 데이터 처리
5장  구글의 운용비용
6장  구글의 개발체제
이렇게 나뉘어져서 구글의 기술인 검색을 좀더 효과적으로 실행하기 위해서 구글이 만든 페이지랭크 알고리즘에 의한 검색기술, 데이터를 다루는 스토리지 관리(데이터 베이스 구조, 파일시스템, 데이터 처리기술, 데이터 센터운용), 전원을 효율적으로 사용하는 하드웨어 구성 에 대하여 논문과 예시를 통해서 설명하고 있습니다. 또한 '분산 파일 시스템' 'PC의 효율적인 전원 디자인'은 구글에 대하여 더욱 많은 부분을 알 수 있게 도와주고 있습니다.

1장에서는 검색엔진의 기본구조를 통한 페이지랭크 알고리즘에 의한 검색기술에 대하여 서술하고 있습니다. 페이지 랭크는 이용자가 검색을 하기 전에 결정되는 웹 페이지의 고유의 점수로서 웹 페이지의 보편적 가치와 검색된 단어 (앵커텍스트: 링크된 문자열)의 관련성이라는 복합적인 평가의 조합으로 결정되게 됩니다.

구글의 초창기 시대의 검색엔진 기술의 기본적인 구성요소들을 살펴보면
검색엔진은 크게 검색을 수행하는 검색서버, 인터넷정보를 수집하고 정리하는 검색 백엔드 서버, 마지막으로 이들 사이에서 이용되는 데이터 베이스인 인덱스가 존재합니다. 인덱스란 데이터베이스의 기본이 되는 기능의 하나로 그 본질적인 역할은 주어진 키에 대응하는 값을 반환하는 데 있습니다. 검색엔진에서는 검색에 적합한 인덱스를 생성하기 위하여 특정한 키에 연결되는 정보에도 구조를 가지게 함으로서 인덱스를 이용한 효율적인 검색과 간결한 데이터 표현이라는 목적을 이루고 있습니다.

초기 구글 검색엔진의 전체전인 기술적 흐름을 살펴보면
검색엔진 서버가 복수의 크롤러 (다양한 웹 페이지를 수집하는 기술)에게 다양한 웹 페이지를 다운로드 하도록 요구하면서 복수의 크롤러가 동시에 다운로드 하면서 고유의 웹 페이지ID (docID) 를 할당해서 저장소에 저장합니다. 저장소에서 웹 페이지를 가져오면서 인덱스 생성이 시작되는데 최초의 작업은 구조해석 단계에서는 DocIndex URLlist 인덱스가 생성됩니다. DocIndex는 웹 페이지의 기본정보를 기록하는 인덱스이며 docID를 키로 하여 웹 페이지의 정보를 기록합니다. URLlist는 반대로 URL 을 키로 하여 docID를 가져오기 위한 인덱스 입니다. 이처럼 구조해석을 통하여 웹 페이지 내의 검색을 위한 텍스트만을 추출함과 동시에 웹 페이지 타이틀 등이 DocIndex에 기록되고 URL URLlist에 각각 기록됩니다. 이어서 단어처리에 의해 모든 단어가 Lexicon (용어집)에 따라 wordID로 변환되고, 단어의 위치와 크기와 docID가 모두 인덱스로서 Barrels(저장소)에 기록됩니다. 하지만 검색에 적합한 단어가 포함되어 웹 페이지의 정보를 위하여 wordId를 기준으로 docID를 얻을 수 있도록 역 인덱스를 구성하게 된다. 또한 링크의 앵커 텍스트는 링크한 곳의 단어정보로서 Barrels에 기록됩니다.
마지막으로 랭킹을 위한 사전 처리를 해야 하는데 여기서는 새롭게 등장하는 Links 인덱스를 기초로 페이지랭크가 계산됩니다. 이렇게 검색서버는 이용자로부터 요청이 들어오면 Lexicon에 따라서 검색어를 wordId로 변환하고 이어서 Barrels 의 역 인덱스에서 docID 리스트를 가져온 후, 각각의 랭킹함수를 적용해 순위를 결정한다. 랭킹에 의해 상위로 올라온 docID DocIndex에서 웹 페이지의 정보를 가져와 보기 쉽게 정리해서 이용자에게 반환하게 됩니다.

2장에서는 구글이 어떻게 세계적 규모의 분산 시스템을 구축하고 빠른 검색시스템을 구현했는지 살펴 보고 있습니다

구글은 값싼 하드웨어를 대량으로 이용하여 그 성능을 충분히 끌어낼 소프트웨어를 만드는 길을 선택하였습니다. 하드웨어의 대량 사용으로 시스템의 기본구조인 랙(Rack)에서 더 나아가 클러스터(Cluster) 구조를 생성하게 됩니다. 그리고 다수의 하드웨어를 활용하는 소프트웨어 기술을 용이하게 하기 위해 GFS(Google File System) 클러스터 라는 대용량 데이터를 효율적으로 전송하고 안전하게 보관하도록 설계된 분산 파일시스템 과 Work Queue 클러스터 라는 OS의 작업관리를 복수의 하드웨어로 분산시켜 수행 하도록 만든 시스템을 소개함과 동시에 1장에서 언급한 3가지 요소의 대규모화에 대한 방안과 wordID가 아닌 docID에 의해 인덱스를 분활 함으로써 인덱스 당 웹 페이지의 수를 제한하되, 그 하나 하나에 대해서 모든 단어를 포함한 인덱스를 생성하고, 검색 요청을 한 곳에 모으는 요청을 하는 GWS(Google web server), 인덱스 서버, 도큐먼트 다수의 서버로 부하를 분산시키는 것에 대하여 서술하고 있습니다.
검색 클러스터의 구조에 대하여 간단히 언급하면 검색요청이 들어오면 먼저 로드밸런스가 이를 분배하여 복수의 GWS에 처리를 맡긴다. 그리고 GWS는 검색요청을 분석한 후 인덱스 서버에게 처리를 의뢰하고 인덱스 서버는 웹 페이지 목록을 돌려주고 이어서 도큐먼트 서버에게 인덱스 서버가 찾아낸 목록을 전달하고, 도큐먼트 서버는 각각의 웹 페이지 제목 및 요약 등의 정보를 만들어 낸다. 마지막으로 GWS는 이를 보기 편하게 HTML로 정리해서 이용자에게 제공한다. .

3장에서는 구글이 다양한 데이터를 어떻게 다루고 있는지 살펴 보고 있습니다.
"GFS(Google File System)는 많은 컴퓨터가 대량의 데이터를 기록하고 대량의 데이터를 읽어내기위한 목적으로 개발된 기술입니다. GFS는 크게 3가지 요소로 구성되는데 마스터라는 GFS 전체의 상태를 관리하고 통제하는 중앙서버가 있고, 마스터가 관리하는 다수의 청크서버가 존재하게 됩니다. 마지막으로 GFS를 이용하여 파일을 읽고 쓰는 애플리케이션으로서 클라이언트가 존재하게 됩니다. 이렇게 구성된 GFS는 다수의 클라이언트와 청크서버의 사용시의 문제점 해결과 GFS 시스템의 효율성에 대하여 서술하고 있습니다. Bigtable GFS 를 이용하면서 작은 데이터라도 효율적으로 읽고 쓸 수 있도록 설계된 분산 스토리지 시스템 입니다. Bigtable는 다차원 맵으로서 로우 키, 칼럼 키, 타임스탬프라는 3가지 항목을 지정해서 하나의 데이터를 얻을 수 있는데 모두 의미하는 바는 달라도 각각 독립적으로 늘이거나 줄일 수 있다는 개념으로서, 기본적으로 3가지요소 (전체를 통괄하는 마스터, Bigtable에서 복수의 로우를 하나의 단위로 분리한 태블릿을 관리하는 태블릿 서버, 데이터를 읽고 쓰는 클라이언트)로 구성됩니다. 이로 인해 Bigtable에서는 기존의 데이터베이스에서 다룰 수 없을 정도의 거대한 테이블을 만들 수 있습니다. 또한 Bigtable의 데이터 구조는 개발자가 직접 설계하여, 어떻게 데이터를 분산 시킬 것인지 통제할 수 있도록 되어있습니다. Chubby 는 이러한 분산 시스템의 기반이 되는 시스템으로서 배타제어(Lock)가 가능한 작은 파일 시스템을 제공합니다. Chubby 는 파일의 읽기, 쓰기뿐만 아니라 외부 리소스의 보호와 이벤트 통지 등에 다양하게 응용됩니다. Chubby 는 이벤트를 통지에도 이용할 수 있기 때문에 DNS를 대신한 이름 해석 방법으로도 널리 이용되고 있습니다.

4장에서는 효율적인 대용량 데이터 처리를 위해 MapReduce 라는 특히 GFS의 입력파일과 조합하면 뛰어난 성능을 발휘하는 분산 데이터처리 기술과 분산처리용 프로그래밍 언어(Sawzall)에 대하여 언급하고 있습니다.
MapReduce Map Reduce라는 2가지 방법을 조합해서 데이터를 처리하는 기술로서 Map 은 키와 값을 집합으로 받아들여 새로운 데이터를 생성하는 프로세스이고 Reduce Map 에 의해 만들어진 같은 키의 복수의 데이터를 모아서 최종적으로 원하는 결과로 만들어내는 프로세스 입니다. 다수의 하드웨어로 분산된 Map 처리는 가능한 한 해당 하드웨어에서 파일을 읽어 들이기 때문에 전체적인 읽기 속도가 매우 빠릅니다. 그 반면에 쓰기는 복수의 하드웨어로 복사되기 때문에 느려지지만 MapReduce로 가공된 데이터는 작아지는 경향이 있으므로, 기록해야 하는 양은 작은 데서 그칩니다.

Sawzall을 사용하면 분산처리를 더욱 쉽게 할 수 있습니다. Sawzall 은 실행 가능한 처리에 제약을둠으로서 한정된 특정 영역에서는 매우 간결한 프로그램으로 대규모 데이터 처리가 가능해 집니다. 이는 마치 데이터 베이스의 SQL과 비슷하여 SQL을 이용하여 데이터 베이스에서 정보를 꺼내는 것처럼, Sawzall 을 사용하면 GFS 상에 있는 대용량 데이터 속에서 정보를 찾아낼 수 있습니다. MapReduce Sawzall은 모두 부하 분산과 장애 대책을 마련하고 있으며, 하드웨어의 대수를 증가시킬수록 성능은 향상됩니다.

5장에서는 대규모 시스템의 비용을 절감하기 위해서 구글이 대처해온 노력을 주로 하드웨어와 전력이라는 측면에서 살펴보았습니다. 또한 구글이 건설중인 거대한 데이터 센터도 다루었습니다.
구글 정도의 거대한 시스템에서는 비용전체에서 설비 비용이 차지하는 비율이 커지고, 그것을 얼마만큼 줄일 수 있는가가 비용경쟁력과 직결됩니다. 그러므로 이러한 하드웨어적 측면에서의 비용 우위성이 구글의 큰 강점이라고 할 수 있습니다.
세상에 컴퓨터는5대로 충분하다 라고 할 정도로 지금 세계에는 대규모 컴퓨터 시스템이 계속 만들어지고 있습니다. 단순히 정보처리의 비용적인 측면만 생각한다면, 이미 구글과 같은 거대 시스템에 데이터를 맡겨 두는 편이 좋은 시대가 되었는지도 모릅니다.

6장에서는 구글이 어떤 개발 환경과 체제 속에서 소프트웨어를 개발하고 있는지 살펴보았습니다.
구글은 개발에 필요한 정보공유를 중시하며, 그에 따라 개발자는 자주적으로 생각하고, 보다 좋은 소프트웨어를 만들 수 있는 환경이 마련되어있습니다. 한편 도큐먼트와 테스트, 언어의 선택 등에는 일정한 규칙이 있기 때문에 이에 따라 조직으로서 일관된 소프트웨어를 구축하고 유지할 수 있습니다. 구글은 많은 소프트웨어를 자신들이 직접개발하고 있지만, 동시에 Linux를 비롯한 오픈 소스 소프트웨어도 적극적으로 활용하고 있습니다. 다만 자신들의 용도에 맞도록 소스 코드를 수정하고 일부는 패치라는 형태로 오픈 소스진영으로 환원하고 있습니다. 구글은 테스트의 자동화에 힘을 쏟고 있는데, 테스트의 자동화를 위한 전문 엔지니어 팀이 구성되어있습니다. 구글에서는 보다 좋은 소프트웨어를 만들기 위해서 엔지니어 스스로가 적극적으로 시스템 개선을 위한 제안을 하도록 권장합니다. 매니지먼트의 역활은 엔지니어의 제안을 한데 모으는 형태가 되는 것 같습니다. 고도의 분산 시스템이든 전력 코스트 절감을 위한 아이디어든 시스템을 보다 우수한 것으로 개선해 가려는 엔지니어의 끊임없는 노력에 의해 구글이라는 거대한 시스템이 계속해서 유지 발전하고 있습니다.

1 장에서 6장까지 책을 읽으면서 요약을 하여보면서 구글 시스템의 개발환경과 체제 속에서 창의적으로 생각할 수 있는 분위기 조성과 회사 개개인의 역량을 극대화 시키기 위한 방안들을 회사의 이미지로 가져감으로써, 왜 구글이 성공할 수밖에 없고, 앞으로 모바일 쪽에서도 큰 성장을 이룰 것이라고 생각이 듭니다.


댓글 없음:

댓글 쓰기