9장 웹 크롤러 설계
크롤러는 검색 엔진에서 널리 쓰이는 기술로, 몇 개의 웹 페이지에서 시작하여 그 링크를 계속 따라 나가면서 새로운 콘텐츠를 수집한다.
크롤러 활용 예시
- 검색 엔진 인덱싱 (Search Engine Indexing) : 크롤러는 웹 페이지를 모아 검색엔진을 위한 로컬 인덱스를 만든다. googlebot
- 웹 아카이빙 : 정보를 장기보관하기 위해서 정보를 모은다. 보통 국립 도서관에서 아카이빙한다.
- 웹 마이닝 : 인터넷에서 유용한 지식을 도출해내기 위해
- 웹 모니터링 : 저작권이나 상표권이 침해되는 사례를 모니터링
1단계 문제 이해 및 설계 범위 확정
규모 확장성 웹에는 수십억개의 페이지가 존재한다. 병행성을 활용하여 효과적으로 웹크롤링 해야한다.
안전 웹은 함정으로 가득하다. 잘못 작성된 HTML, 아무 반응 없는 서버, 악성 코드 붙어있는 링크 등, 이러한 함정에 대응할 수 있어야 한다.
예절 한 웹사이트에 짧은 시간 동안 너무 많은 요청을 보내면 안된다.
확장성 새로운 형태의 콘텐츠를 지원하기가 쉬워야 한다. (텍스트 뿐만 아니라 이미지 파일 크롤링)
계략적 규모 추정
매달 10억개의 웹 페이지를 다운로드한다고 할 대, 1초 당 400페이지를 조회할 수 있어야 한다.
최대 QPS = 2 * 400 = 800
2단계 개략적 설계안 제시 및 동의 구하기
웹 크롤러의 구성 요소
1. 시작 url 집합
웹 클로러가 크롤링을 시작하는 출발점
시작 url을 고를 때에는 가능한 많은 링크를 탐색할 수 있도록 다양한 주제별 url을 고른다.
2. 미수집 url 저장소
다운로드할 url, 다운로드된 url로 나눠어서 관리한다.
다운로드할 url을 저장하는 곳은 미수집 url 저장소라고 불리고, FIFO 큐의 형태이다.
3. HTML 다운로더 웹 페이지를 다운로드하는 컴포넌트
4. 도메인 이름 변환기 URL을 IP 주소로 변환
5. 콘텐츠 파서 파싱과 검증 절차를 거쳐야한다. 이상한 웹페이지는 저장 공간만 낭비한다.
6. 중복 콘텐츠인가? 자료 구조를 도입하여 데이터 중복을 줄인다. 웹 페이지의 해시 값을 비교하는 방식이다.
7. 콘텐츠 저장소 html 문서 보관 시스템, 데이터 양이 많으므로 대부분 디스크에 저장한다.
인기 있는 콘텐츠는 메모리에 두어 접근 지연시간을 줄인다.
8. URL 추출기 html 페이지 파싱하여 링크들을 골라낸다. 상대 경로들은 절대 경로로 변환한다.
URL 필터 특정 파일 확장자나 접근 제외 목록등을 배제한다.
9. 이미 방문한 URL인가? 자료구조를 사용하여, 무한 루프 방지하기 위해 검사한다. 블룸 필더나 해시 테이블을 사용한다.
10. URL 저장소 지금까지 방문한 URL 보관한다.
웹 크롤러 작업 흐름
- 시작 URL을 미수집 URL저장소에 저장한다.
- HTML 다운로더가 미수집 URL 저장소에서 URL 목록을 가져온다.
- HTML 다운로드는 도메인 이름 변환기 사용하여 URL의 IP 주소를 파악하고, 해당 IP 주소로 접속하여 웹 페이지를 다운로드 한다.
- 콘텐츠 파서가 HTML 페이지를 파싱한다.
- 중복 컨텐츠인지 확인한다.
- 이미 저장소에 있다면 중복 컨텐츠 이므로 처리하지 않고 버린다. 저장소에 없는 콘텐츠라면 저장소에 저장한다.
- URL 추출기가 HTML 페이지에서 링크를 골라낸다.
- URL 필터가 필터링하기 위해서 이미 저장소에 있는 URL인지 살펴본다.
- 미수집 URL 저장소로 전달한다.
3단계 상세 설계
사용 알고리즘
DFS를 사용하면 어느 정도 그래프가 될 지 가늠하기 어렵기 때문에 BFS를 사용하여 탐색하기로 하자.
예상 되는 문제점
- 보통 같은 페이지를 참조하게 되는 데 그러면 서버는 수많은 요청에 과부하가 걸린다.
- url간 우선순위를 따지지 않는다. 여러 가지 척도를 비추어 처리해야 하며, 우선순위 구별이 필요 하다.
문제점 해결
미수집 url 저장소를 활용한다.
예의를 지키기 위해서, 동일 웹 사이트에 대해서는 한 번에 한 페이지만 요청하도록 해야한다.
호스트와 다운로드 작업 스레드와의 관계를 유지한다.
매핑 테이블과 큐 라우터를 사용하여 같은 호스트의 url은 같은 큐로 가도록 보장한다.
우선순위를 나눌 때에는 페이지랭크, 트래픽 양, 갱신 빈도 등 다양한 척도를 사용한다.
순위결정장치가 url을 입력 받아 우선순위를 계산하고, 우선순위별로 큐가 할당된다.
큐 선택기는 순위가 높은 큐에서 더 자주꺼내도록 프로그램되어있다.
전면큐에서 우선순위 결정 과정을 처리하고, 후면 큐에서 크롤러가 예의바르게 동작하도록 보장한다.
웹페이지는 수시로 변경되므로, 데이터의 신선함 유지를 위해서 중요한 페이지는 좀 더 자주 재수집을 한다.
성능 최적화 방법
- 분산 크롤링, 여러 서버에 분산하고 여러 스레드를 사용하여 다운로드 작업을 처리한다.
- 도메인 이름 변환 결과를 캐시하고, 크론 잡을 돌려 주기적으로 갱신하도록 해 놓으면 성능을 효과적으로 높일 수 있다.
- 지역성, 크롤링 작업을 수행하는 서버를 지역별로 분산하는 방법
- 짧은 타임아웃, 어떤 웹 서버는 응답이 느릴 수 있는 데, 이런 경우를 대비하여 타임아웃 후에 다음 페이지로 넘어간다.
안정성
- 다운로더 서버들에 부하를 분산할 때 안정 해시를 사용한다.
- 장애가 발생한 경우에도 쉽게 복구할 수 있도록 크롤링 상태와 수집 데이터를 지속적 저장장치에 기록해 두는 것이 좋다.
- 에러가 발생하더라도 전체 시스템이 중단되지 않도록 예외 처리 한다.
- 시스템 오류를 방지하기 위해 데이터 검증 한다.
확장성
새로운 형태의 콘텐츠를 쉽게 지원할 수 있도록 설계한다.
PNG 다운로더와 같은 플러그인 모듈을 사용한다.
문제 있는 콘텐츠 감지 및 회피
- 해시나 체크섬을 사용하여 중복 콘텐츠를 탐색한다.
- 거미 덫 (spider web) : 크롤러를 무한 루프에 빠뜨리도록 설계한 웹 페이지
- 만능 해결책은 없다. 덫을 확인하면 제외하고 필터 목록에 걸어둔다.
- 데이터 노이즈 : 광고, 스팸 같은 것을 제외한다.
추가적으로 논의하면 좋을 것
server-side rendering: 크롤러는 동적으로 생성되는 링크에 대해서는 발견할 수 없다. 웹 페이지 정보를 잘 수집하기 위해서는 웹 페이지에 서버 측 렌더링이 되어있어야 한다.
원치 않는 페이지 필터링 : 스팸 방지 컴포넌트를 두어 품질이 조악하거나 스팸성인 페이지를 걸러내도록 한다.
데이터베이스 다중화 및 샤딩 : 데이터 계층의 가용성, 규모 확장성, 안정성 향상
수평적 규모 확장성 : 가장 중요한 것은 무상태 서버로 만드는 것
데이터 분석 솔루션 : 시스템의 세밀한 조정을 위해서 분석 결과를 수집한다.
* 가상 면접 사례로 배우는 대규모 시스템 설계 기초 9장을 요약한 내용입니다
'책정리 > 대규모 시스템 설계 기초' 카테고리의 다른 글
채팅 시스템 설계 (3) | 2023.12.08 |
---|---|
뉴스 피드 시스템 설계 (1) | 2023.12.06 |
URL 단축기 설계 (2) | 2023.12.03 |
분산 시스템을 위한 유일 ID 생성기 설계 (0) | 2023.12.02 |
키-값 저장소 설계 (1) | 2023.12.01 |