검색로그
시스템 with
Python
Pycon 2016
카카오 검색로그셀 김동문
소개
Daum + Kakao 에서 발생하는
검색에 대한 로그
취합 / 정제 / (배포) 하는 시스템
구현
대상
여러 대의 서버에서 로그를 취합하여,
하둡 or NoSQL에 Load 하시려는 분
목차
1. Overview
2. Problem
3. System Flow
4. System Implementation
5. Why Python
6. 그 외 사례
1.
Overview
Overview
From:
Overview
To :
“
Overview
검색 이력을 중개해주는 시스템
2.
Problem
문제점이 될 게 있나요?
1. 작업은 모두 1분 내
- 밀리기 시작하면, 다음 프로세스에
영향
Problem
이 날이었어요 ( 2014. 1. 27. )
Problem
이렇게 되었어요
Problem
<< 유닛장 >>
<< 팀장 >>
<< 개발자1 >>
<< 개발자2 >>
2. 이슈로 인한 트래픽 증가
- 단기 폭증
- 천재지변
- TV 프로그램
- 꾸준히 증가폭 유지
- 연예
- 정치
- 사회
Problem
Problem
Problem
3. 어뷰저 필터링
- 장 / 단기의 데이터를 분석
- 반복적인 행위를 보이는 유저를 제거
Problem
“
Problem
Time Attack : 1분
때때로 예상치 못한 트래픽
어뷰저 거르기
3.
System Flow
이렇게 할꺼에요
System Flow
User
Search Servers
Collect
Analyze
& Filter
Log Collector
Log Storage
Store
4.
System
Implementation
Step별로 구현해볼까요
System Implementation
Collect Analyze
FilterStore
● 할 일
○ 수십대의 서버에서
○ 수메가 바이트의 로그를
○ scp 를 통해 PULL
Collect
! scp 채택
- 제일 빠르고 안전.
- 솔루션의 결함을 의심할 필요 없음
- 장애 발생시 복원 작업이 수월
● 가정
○ 서버 : 30대
○ File Size : 300 MByte
○ File Row : 10만
○ 수집 서버 CPU Core : 24개
Collect
● Code
○ pull 은 생략
Collect
SERVERS = ["search-server-dn%d" % index for index in xrange(1, 31)]
[pull(server) for server in SERVERS]
● 수행 시간
○ 7초
Collect
“
조금 느린 것 같아요
● 속도 개선
○ 하드웨어
■ 세상에서 제일 싼 건 서버 비용
■ 세상에서 제일 비싼 건 당신 연봉
○ 소프트웨어
■ Pycon이니까 이 방법으로 해결해야 함
Collect
● 속도 개선
○ multiprocessing 도입
Collect
import multiprocessing
process_list = [multiprocessing.Process(target=pull, args=(server, )) for
server in SERVERS]
[process.start() for process in process_list]
[process.join() for process in process_list]
[pull(server) for server in SERVERS]
● Java로 했다면..
Collect
public static void main(String[]args){
ArrayList<Thread>threads=new ArrayList<Thread>();
for(int i=0;i<30;i++){
Thread t=new Thread(new Pull(i));
t.start();
threads.add(t);
}
for(int i=0;i<threads.size();i++){
Thread t=threads.get(i);
try{
t.join();
}catch(Exception e){
}
}
}
● 수행 시간
○ 7초 -> 1.6초
● 남은 시간
○ 58.4초
Collect
System Implemetation
Collect Analyze
FilterStore
● 할 일
○ 어뷰저 탐색
■ 상위에 Rating 되는 검색어를
극소수의 사용자가 검색
■ Bot에 의한 Crawling
Analyze
● 자세한 건
Analyze
● 수행 시간
○ 10초
● 남은 시간
○ 48.4초
Analyze
System Implemetation
Collect Analyze
FilterStore
● 할 일
○ 앞서 조사한 어뷰저를 제거
○ 정제된 로그는 압축 ( gzip )
■ Network Traffic 최소화
Filter
● Code
Filter
def purify(raw_file_name):
log_file = gzip.open(raw_file_name + ".gz", "w")
abuse_cnt = 0
success_cnt = 0
with open(raw_file_name, "r") as raw:
for line in raw.read().splitlines():
if line in abuse:
abuse_cnt += 1
else:
success_cnt += 1
log_file.write(line)
print "Success : %d, Abuse : %d" % (success_cnt, abuse_cnt)
● 수행 시간
○ 37초
Filter
Filter
● 속도 개선
○ multiprocessing 적용
■ 서버별로 받아서, 나뉘어져 있던 파일에
각각 Filtering 적용
■ gzip의 merge하기 쉬운 장점을 이용
■ 1 process -> 30 process
Filter
● Code
Filter
process_list =
[multiprocessing.Process(target=purify,
args=("/pycon/incoming/min_log.%s" % server, ))
for server in SERVERS]
[process.start() for process in process_list]
[process.join() for process in process_list]
● 수행 시간
○ 37초 -> 2초
● 남은 시간
○ 46.4초
Filter
System Implemetation
Collect Analyze
FilterStore
● 할 일
○ 압축한 파일을 모아서 Hadoop에 Upload
Analyze
● 수행 시간
○ 6초
● 남은 시간
○ 40.4초
Analyze
“
serial : 60 s
multiprocessing : 19.6 s
20초만에 끝
부하 테스트
트래픽이 급증하는 경우를 대비하여
부하량을 올려보겠습니다.
부하 테스트
소요시간
1 19.6
2 26.8
4 39
8 78.1
60초가 넘으면
● 로그 정제
○ 사용하지 않는 데이터 제거
○ 사용처에 따라 로그를 분할
● 서버 Upgrade
○ SSD 설치해달라고 조르기
○ 담당할 서버를 나눠서 병렬 처리
5.
Why Python
Why Python
● 빠른 구현
● 풍부한 라이브러리
● 시스템 커스터마이징
○ 자동 재시도 기능
○ 장애 알림 기능
○ 장애 복구 기능
Impala
1.0.1 (Prod) 출시 : 2013. 6
Impyla
0.7 출시 : 2013. 5
Why Python
● vs LogStash, Fluentd
○ 단점
■ Streaming 안함
■ Visualization 안함
■ PetaByte 처리 못함
Why Python
● vs LogStash, Fluentd
○ 장점
■ 안정성
● Tool의 bug 걱정 없음
● Pull 방식의 중앙 집중화된 시스템
■ 기능 확장
● RealTime 어뷰징 분석 / 적용
● 각종 Customizing 적용 용이
● 풍부한 Python의 Library를 사용 가능
Why Python
● 장애 감소
○ 이전 Version
■ Java로 구성
■ 월 1-2회 장애 발생 ( Traffic )
○ 이후 Version
■ Python 으로 구성
■ 연 2-4회 장애 발생 ( 개발자 실수 )
“
로그 시스템 소개를 마치고,
다른 사례도 소개해 드리려고 합니다.
6.
그 외 사례
팀에서 Python을 이용하여
개발한 다른 사례도 보여 드릴께요
( + 개발 기간 )
실시간 유입 현황
서버 로그 분석 / 타임 아웃 현황 조사
“+ 네트워크 현황 / 캐시율 / 블러킹
실시간 분석 툴 개발
2명 / 8주
시스템 모니터링
“
검색 유입 급증 / 급감 Alarm Plugin
1명 / 0.5일
검색 트렌드 분석
검색 트렌드 분석
“+ 보여 드릴 수 없는 데이터
검색 트렌드 분석
1명 / 4개월
(private) 예매 가능 확인
● 잔여석 조회 API가 노출된 일부 사이트
● API를 호출, 응답 내용을 파싱
● 잔여석이 1 이상일 때 메신저를 통해 알림
● 명절 때 요긴
“
예약 어뷰징 시스템
1명 / 0.5일
Project Prototyping
● 프로젝트 발주 전, 가치 판단을 위해 사용
● 아이디어 구상 -> 프로토타이핑
○ Under 1 week
● 하기 싫은 프로젝트 빠르게 포기 가능
“
이상 사례 발표를 마칩니다
“
Python은 사용하기 쉽고,
Reference가 많습니다
StackOverFlow 의 Tag 수
2016. 8. 4. 10:15
“다음, 카카오톡 검색 많이
사용해주세요
Naver나 Google 말고
트래픽 더 받을 수 있어요
감사합니다!
폭삭 속았수다
contact :
dm.k@kakaocorp.com

검색로그시스템 with Python