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. 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
13. 13
Filebeat
• 로그 파일 수집을 위한 에이전트
• 지정한 로그 파일이 업데이트될 때마다, 지정된 목적지로 추가된 메세지 전송
‒ Elasticsearch, Logstash, Kafka 등
• 간단한 설정만으로 Docker Container / Kubernetes 에서의 로그 수집도 가능
Game Server
app: cookierun
role: gameserver
env: dev
logging: enabled
Instance
Filebeat
Agent
{“timestamp”:..,”msg”:.}
{“timestamp”:..,”msg”:.}
{“timestamp”:..,”msg”:.}
{“timestamp”:..,”msg”:.}
{“timestamp”:..,”msg”:.}
{“timestamp”:..,”msg”:.}
{“timestamp”:..,”msg”:.}
/var/lib/docker/../.jsonDocker
json-file dirver
stdout/stderr
-> json files
Elasticsearch
OR
14. 14
filebeat.inputs:
- type: docker
containers.ids:
- "*"
processors:
- add_docker_metadata:
host: "unix:///var/run/docker.sock"
- drop_event:
when.not.equals:
docker.container.labels.logging: "enabled"
processors:
- add_cloud_metadata: ~
output.kafka:
hosts: ["..."]
version: "..."
topic: "beats"
...
Filebeat를 이용한 컨테이너 로그 수집
Filebeat
Agent
Host / Container
관련 필드 추가
Docker Input 설정
수집 대상
이외 로그 제외
Kafka Output 설정
16. 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. 19
그래서 좋나요?
• 성능적으로는 더할 나위 없는 수준 (Filebeat에서의 전처리를 최소화한다면)
• 처음 도입했을 때는 다양한 버그 및 이슈들 존재
‒ ex) 도커에서 16KB 가 넘는 로그 출력 시 로그를 두개로 나눠 출력하는 Breaking Change 발생
➔ 해당 기능 filebeat 구현에 버그
‒ Filebeat가 처리한 로그파일 offset과 실제 로그파일 offset 차이를 모니터링하여 대응
• 6개월 이상 프로덕션에서 이슈 없이 사용 중
• 꾸준히 개선되고 있으므로 가능한 최신 버전 사용을 권장
21. 21
ELK @ DEVSISTERS
• 2013년부터 도입하여 현재까지 사용 중
• 현재 OSS version을 사용, Elastic Platinum으로 전환 작업 중
• Kafka 에서 실시간으로 로그를 가져와서
• 최근 로그 (약 2주) 들을 Elasticsearch에 인덱싱해 두고
• 실시간 로그 조회, 검색, 분석에 이용
22. 22
ELK @ DEVSISTERS
Logstash Elasticsearch 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. 28
Use Case 1: 서버 모니터링과 운영
• Kibana를 통하여 모든 서버의 로그를 모아 볼 수 있음
• 각 서버에 일일이 들어가지 않아도 빠른 이슈 탐지와 대응 가능
• 서버 인프라 접근 권한이 제한적인 개발사 엔지니어도 Kibana 열람 가능
29. 29
Use Case 2: 실시간 게임 운영 대응 수단
• 게임 디자이너도 Kibana를 통하여 손쉽게 게임의 현황 모니터링 가능
• 어뷰저에 대한 신속한 대응, 패치 실수로 인한 인플레이션 등을 조기에 탐지
• 이슈에 대해 영향을 받은 유저나 분포도 몇 초 만에 쉽게 확인
• 필요한 경우, Elasticsearch에 직접 쿼리하여 로그 조회, 유저 데이터 롤백 등 대응도 가능
30. 30
Use Case 3: 실시간 지표 대시보드
• 동접자 수, 주요 서비스 현황 등을 로그 기반으로 실시간 분석 가능
32. 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 에 이슈 올리면 많은 경우 적극적으로 대응
– 기여를 위한 가이드라인이 잘 되어 있고, 개방적이며 친절하다는 인상