대규모시스템설계기초 ch9
대규모 시스템 설계 기초 ch9. 웹 크롤러 설계¶
크롤러의 용도¶
- 검색 엔진 인덱싱: 웹 페이지를 모아 검색 엔진을 위한 로컬 인덱스 생성
- 웹 아카이빙: 나중에 사용할 목적으로 장기 보관. 국회 도서관 등
- 웹 마이닝: 인터넷에서 유용한 지식을 도출해내기
- 웹 모니터링: 해적판 저작물 찾아서 보고
1단계. 문제 이해 및 설계 범위 확정¶
- 기본 알고리즘
- URL 집합이 입력으로 이루어지면, 해당 URL들이 가리키는 모든 웹페이지 다운로드
- 다운받은 웹 페이지에서 URL 추출
- 추출된 URL들을 다운로드할 URL 목록에 추가, 위의 단계 반복
- 웹 크롤러가 만족시킬 속성
- 규모 확장성: 효과적인 웹 크롤링
- 안정성: 비정상적 입력이나 환경에 잘 대응할 것
- 예절: 수집대상 웹사이트에 많은 요청 한번에 X
- 확장성: 새로운 형태의 콘텐츠 지원할 수 있을 것
2단계. 개략적 설계안 제시 및 동의 구하기¶
- STEP BY STEP
- 시작 URL 집합
- 미수집 URL 저장소 탐색
- HTML 다운로더 w. DNS 변환기
- 컨텐츠 파서
- 중복 컨텐츠 검사 w. 컨텐츠 저장소
- URL 추출기
- URL 필터
- 이미 방문한 URL 인지? 아니라면 2번 부터 반복
- 시작 URL 집합
- 크롤러가 가능한 많은 링크를 탐색할 수 있도록 URL 고르기
- 나라별로 인기있는 웹사이트가 다르다는 점에서 착안
- 쇼핑, 스포츠, 건강 등 주제별 세분화 URL 사용
- 미수집 URL 저장소
- 다운로드할 URL / 다운로드된 URL 로 관리
- 중복 컨텐츠인가?
- 웹 페이지의 해시값을 비교
- 이미 방문한 URL?
- 블룸필터, 해시테이블을 사용하여 중복 제
3단계. 상세 설계¶
- DFS vs BFS
- BFS를 사용. DFS 사용했다가 그래프 못나올수도
- 위키피디아 하나 들어갔다가, 페이지 너무많아서 탐색하다보니 디도스공격 마냥 될 수 있음
- 따라서 페이지 랭크, 트래픽양, 업데이트 빈도 등으로 중요도를 달리하여 탐색해야 함
- 미수집 URL 저장소
- 예의를 갖춘 크롤러를 만들자
- 초당 수천건의 페이지 요청 웹사이트에 보내 마비하면 안돼. 따라서 순위 결정 장치 + 큐 라우터를 사용하여 탐색 순서를 조정하자
- 우선 순위 + 동일한 사이트 인지 여부
- 신선도
- 웹 페이지의 변경 이력 활용
- 우선순위 활용하여 중요한 페이지 자주 수집
- 성능 최적화
- 크롤링 작업을 여러 서버에 분산하는 방법. 여러 스레드를 돌려 다운로드 작업을 처리
- DNS 응답은 동기적. 캐시 둬서 빠릿빠릿하게 응답받게 하자
- 지역적으로 가까운 페이지는 근처로 크롤러 서버 배치
- 짧은 타임아웃줘서 안오면 다음거
- 안정성
- 안정 해시: 다운로더 서버들에 부하 분산하기 위해 적용. 다운로드 서버 쉽게 추가 가능
- 크롤링 상태 및 수집 데이터 저장: 크롤링 상태, 수집된 데이터 SSD에 기록
- 확장성
- 새로운 형태의 콘텐츠 쉽게 지원할 것
- 문제 있는 컨텐츠 감지 및 회피
- 중복 컨텐츠: 해시나 체크섬 사용하여 중복 컨텐츠 쉽게 탐지
- 거미 덫: URL 최대길이 제한, 무한 크롤링 알림오면 크롤러에서 수동 제거 등
- 데이터 노이즈
4단계. 마무리¶
- 서버 측 렌더링 대응은?
- 스팸 방지 어떻게?
- DB 다중화/샤딩?
- 수평적 규모 확장성?
스터디¶
- 중복 컨텐츠 해시값 비교
- 단순 해시값 비교로 중복 컨텐츠라고 보진 않음
- 광고, 타임스탬프, 카운터 등으로 인한 일부 차이로 인해 거의 중복된 페이지(near-duplicates)를 제거할 수 없기 때문에 SimHash, MinHash, LSH 등 확률적 방식을 활용하는 것으로 보임.