Elastic Stack 을 이용한 게임 서비스 통합 로깅 플랫폼 - elastic{on} 2019 Seoul
elastic{on} 2019 Seoul 에서 발표한 데브시스터즈(Devsisters Corp.) 의 Elastic Stack 기반 게임 서비스 통합 로깅 플랫폼 소개 발표 자료입니다.
발표 영상은 https://www.elastic.co/kr/elasticon/tour/2019/seoul/devsisters-game-service-integration-logging-platform-using-elastic-stack 에서 보실 수 있습니다.
6
데브시스터즈 로깅 플랫폼에서
생산/수집하는다양한 유형의 로그들
• 액세스 로그
‒ 어떤 주체(ex. 유저, 다른 서버) 로부터의 접근/응답
기록
• 유저 CS 대응용 로그
‒ 결제, 재화 지급 등 유저로부터의 CS 요청에
대응하기 위한 로그
• 분석 로그
‒ 제품의 핵심 성과 지표 (KPI) 를 비롯해
제품의 분석을 위해 남기는 로그
• 어플리케이션 로그
‒ 서버 또는 클라이언트에서 디버깅, 운영 등의
목적으로 남기는 로그
(ex. "server is running..", "db conn timeout")
• 감사(audit) 로그
‒ 운영툴, 인프라 작업 등 다양한 행동에 대한
감사 로그
7.
7
예시: 액세스 로그{
"timestamp": "2017-03-16T18:25:53.342+09:00",
"logType": "access",
"level": "info",
"messageId": "E5620934-D1EF-4F5D-86EB-C8EB0F3CE6DE",
"userId": "ABCDE1234",
"requestMethod": "POST",
"requestAPI": "/game/play/save",
"request": {
"stageId": "1-1",
"character": { "id": 100100, "lv": 1 },
"score": 123456780,
"playTime": 1000
},
"responseCode": "200"
"response": {
"responseType": "OK",
"userInfo": { "coin": 52300, "exp": 20033 }
}
}
• 유저 또는 다른 서버로부터의
요청 이벤트와, 이에 대한 응답을 기록
• 요청 URL, 응답코드 뿐만 아니라,
필요에 따라 요청과 응답을 세세히 기록
8.
8
로깅 플랫폼으로 수집되는로그의 볼륨
일일 로그 건수 일일 로그
사이즈
로깅 플랫폼을 쓰는
프로덕션 서비스
3억 건+ 500GB+ 6
9.
9
로그를 어떻게 수집하고적재하여 활용하나요?
Web
Frontend
Game
Client
3rd Party
Services
VM &
Containers
Kubernetes
Cluster
Filebeat
Agent
Log
Collector
Server
Apache Kafka &
Kafka Streams
Logstash Elasticsearch
Kibana
Amazon S3
User Log
Query
Service
Apache Spark
준실시간(<10초)
~최근 2주간의 로그 저장
장기 로그 적재 저장소
(일 단위 로그)
로그 메세지 큐
약 3일간의 로그 저장
하루 단위 배치 작업
10.
10
Elastic Stack @DEVSISTERS
Web
Frontend
Game
Client
3rd Party
Services
VM &
Containers
Kubernetes
Cluster
Filebeat
Agent
Log
Collector
Server
Apache Kafka &
Kafka Streams
Logstash Elasticsearch
Kibana
Amazon S3
User Log
Query
Service
Apache Spark
16
하지만 Filebeat 에서의로그 전처리는 제한적
• 전처리 기능이 제한적이고,
전처리를 할 수 있다고 하더라도
호스트에 부하를 유발함
• Filebeat에서 Elasticsearch로
바로 로그를 보내는 경우
Elasticsearch Ingest Node Pipeline을
사용하여 Elasticsearch 노드에서
전처리 진행
https://www.elastic.co/blog/new-way-to-ingest-part-2
참고: Elasticsearch를 주 로그 저장소로 사용한다면
17.
17
하지만 Filebeat 에서의로그 전처리는 제한적
• 본 인프라에서는 Kafka로 로그를 보내므로,
다른 대안을 통하여 전처리
• Kafka Streams를 이용하여 전처리 진행
VM &
Containers
Kubernetes
Cluster
Filebeat
Agent
beats
cookierun-prod-
accesslog
Kafka
Streams
전처리된 로그를
적당한 토픽에 넣어줌
19
그래서 좋나요?
• 성능적으로는더할 나위 없는 수준 (Filebeat에서의 전처리를 최소화한다면)
• 처음 도입했을 때는 다양한 버그 및 이슈들 존재
‒ ex) 도커에서 16KB 가 넘는 로그 출력 시 로그를 두개로 나눠 출력하는 Breaking Change 발생
➔ 해당 기능 filebeat 구현에 버그
‒ Filebeat가 처리한 로그파일 offset과 실제 로그파일 offset 차이를 모니터링하여 대응
• 6개월 이상 프로덕션에서 이슈 없이 사용 중
• 꾸준히 개선되고 있으므로 가능한 최신 버전 사용을 권장
21
ELK @ DEVSISTERS
•2013년부터 도입하여 현재까지 사용 중
• 현재 OSS version을 사용, Elastic Platinum으로 전환 작업 중
• Kafka 에서 실시간으로 로그를 가져와서
• 최근 로그 (약 2주) 들을 Elasticsearch에 인덱싱해 두고
• 실시간 로그 조회, 검색, 분석에 이용
22.
22
ELK @ DEVSISTERS
LogstashElasticsearch Kibana
Logstash가
Kafka에서 로그를
가져와서
Logstash가
Elasticsearch로
로그를 보내주면
logstash-2019.02.22
Elasticsearch에
저장되고
Kibana에서 조회
(로그 생성 후 ~10초 이내)
Curator 2주 이상 지난
로그 인덱스 삭제
참 쉽죠?
23.
23
그러나 현실은..
• Kibana에서로그가 안보여요!
➔ 대부분 매핑 타입 충돌로 인덱싱 실패
• Schemaless Dynamic Typing
• 타입이 충돌하는 다양한 경우
‒ 같은 종류의 로그 (ex. 로그인 액세스 로그) 를 찍는데
서버를 패치하면서 일부 필드 타입이 바뀌었거나
‒ 다른 종류의 로그를 찍는데 같은 이름의 필드로 다른 내용의 로그가 들어가거나
‒ Date 포맷의 String 은 Date type으로 타입을 추정해서, 다른 형태의 String 타입 로그가 같은 필드에
설정되면
‒ ….
• 매핑을 통제하면 좋지만, 특히 플랫폼을 제공하는 입장에서 한계가 있음
로그의 형태가 제각각 – 스키마를 통제하기 어렵다
# 로그 1
{
"@timestamp": "2018-02-12T01:57:32.549Z",
"request": {
"item": {"id": 1},
"receivedAt": "2019-02-22T01:11:11"
}
}
# 로그 2
{
"@timestamp": "2018-02-12T01:57:32.549Z",
"request": {
"item": "1",
"receivedAt": ""
}
}
24.
24
그러나 현실은..
• 인덱스를가능한 잘게 쪼갬:
`{service_name}-{environment}-{logType}`
‒ 서비스별로 다른 로그 스키마 충돌 방지
‒ 개발 환경과 프로덕션 환경 서버 로그 충돌 방지
• 타입 추정이 불필요하거나,
검색 또는 aggregation이 불필요한 필드는
인덱스 템플릿을 적절히 설정
로그의 형태가 제각각 – 스키마를 통제하기 어렵다
{
"cookierun_tpl": {
"template": "cookierun-*",
"mappings": {
"_doc": {
"date_detection": false,
"properties": {
"@timestamp": { "type": "date" },
"statistics": {
"enabled": false
}
}
}
}
}
}
25.
25
그러나 현실은..
• 사내의다양한 직군, 사외(게임 개발사)에 Kibana 제공 필요
• 소속 회사별, 개인별로 특정 서비스에 대한 로그만 제공 필요
• Elastic Gold/Platinum 의 RBAC 기능을 쓰는 것이 바람직
Kibana 의 권한 관리
Elasticsearch
NGINX Proxy
(서비스 A 관련 요청만 프록시)
Kibana for Service A
OAuth2
Proxy
26.
26
그러나 현실은..
• 사내의다양한 직군, 사외(게임 개발사)에
Kibana 제공 필요
• 다양한 개인정보성 로그 필드에 대한
redact 처리 필요
• Elastic Platinum을 사용한다면
Field-level Security 기능을 통하여
보다 손쉬운 대응 가능
로그에 있는 수많은 개인정보들
# logstash.conf
input { ... }
filter {
mutate {
update => { "device_id" => "<redacted>" }
}
}
output { ... } }
28
Use Case 1:서버 모니터링과 운영
• Kibana를 통하여 모든 서버의 로그를 모아 볼 수 있음
• 각 서버에 일일이 들어가지 않아도 빠른 이슈 탐지와 대응 가능
• 서버 인프라 접근 권한이 제한적인 개발사 엔지니어도 Kibana 열람 가능
29.
29
Use Case 2:실시간 게임 운영 대응 수단
• 게임 디자이너도 Kibana를 통하여 손쉽게 게임의 현황 모니터링 가능
• 어뷰저에 대한 신속한 대응, 패치 실수로 인한 인플레이션 등을 조기에 탐지
• 이슈에 대해 영향을 받은 유저나 분포도 몇 초 만에 쉽게 확인
• 필요한 경우, Elasticsearch에 직접 쿼리하여 로그 조회, 유저 데이터 롤백 등 대응도 가능
30.
30
Use Case 3:실시간 지표 대시보드
• 동접자 수, 주요 서비스 현황 등을 로그 기반으로 실시간 분석 가능
32
수많은 컴포넌트..
• 다수의지역에 위치한, 다수의 서버들에서 돌아가는 다수의 컴포넌트
‒ Filebeat가 깔린 모든 서버들 n백 대
‒ 로그 수집 서버, Kafka Brokers, 로그 전처리 서버 (kafka streams), logstash, elasticsearch
‒ n개의 서비스 * (elasticsearch proxy + kibana + oauth2 proxy)
‒ 를 포함한 약 20개 상당의 컴포넌트들이 여러 대씩 존재
• 현재 2명이 로깅 플랫폼 전체의 구축과 운영을 담당 (각각 half-time)
‒ 2018년 기준 Elastic Stack 운영 및 개발에 투자한 시간 약 1 man-month
‒ 서비스 가용율 99.5% 이상, 유의미한 로그 유실 케이스 없음 (2015~)
그런데 운영자는 2명..?!
33.
33
자동화
• Terraform 을이용한 Infrastructure as a Code
‒ ELK 인프라를 비롯한 모든 로깅 플랫폼 인프라는 코드로 관리
‒ Custom Provider를 통해,
Role, Role Mapping, Index Template 등도
자동화된 스크립트를 통하여 상태 관리 및 업데이트
사람이 할 수 있지만 기계가 잘하는 것은 기계에게
34.
34
자동화
• Vault 를이용한 패스워드 및 인증서 관리
‒ Vault: 시크릿 저장소, 적절한 권한을 가진 유저/머신에만 시크릿 제공 기능
‒ Elasticsearch Built-In User 들의 패스워드를 모두 Vault 에서 관리
‒ Vault 의 자체 CA 및 인증서 발급 기능을 통하여,
Elasticsearch 노드나 Logstash와 같은 클라이언트들의 인증서를 Vault로 발급
사람이 할 수 있지만 기계가 잘하는 것은 기계에게
35.
35
고가용성 구조 /Fault-Tolerant
• Elasticsearch, Logstash, Kibana 모두 (준) 고가용성 구조로 설정이 가능
– 서버 한대가 죽더라도 특별한 지장이 없음
– Self-Healing 되어 사람이 건드리지 않아도 복구되는 경우도 있음
36.
36
기타 사소한 의견
•Elastic을 프로덕션에서 쓰려면 Training 강력 추천!
• 매니지드 솔루션도 좋은 옵션이 될 수 있다
• Elastic Stack 이 오픈소스 프로젝트임을 잘 활용하면 좋다
– GitHub 에 이슈 올리면 많은 경우 적극적으로 대응
– 기여를 위한 가이드라인이 잘 되어 있고, 개방적이며 친절하다는 인상
37.
37
기타 사소한 의견
•Elastic을 프로덕션에서 쓰려면 Training 강력 추천!
• 매니지드 솔루션도 좋은 옵션이 될 수 있다
• Elastic Stack 이 오픈소스 프로젝트임을 잘 활용하면 좋다
– GitHub 에 이슈 올리면 많은 경우 적극적으로 대응
– 기여를 위한 가이드라인이 잘 되어 있고, 개방적이며 친절하다는 인상