69
서비스 캐시 적용 A to Z 오픈소스를 활용한 마이크로 서비스의 캐시 전략 아프리카TV | 플랫폼개발팀 | 정경석 2017.10.25

Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략

Embed Size (px)

Citation preview

Page 1: Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략

서비스 캐시적용 A to Z

오픈소스를 활용한마이크로 서비스의 캐시 전략

아프리카TV | 플랫폼개발팀 | 정경석

2017.10.25

Page 2: Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략

캐시의 종류

캐시 데이터선택

모노리틱서비스와캐시

모놀리틱에서마이크로 서비스로

마이크로서비스와캐시

캐시적용사례

목차

Page 3: Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략

정경석(kris_jeong@facebook)

발표자 소개

백엔드 개발을 주 업으로 하는 개발자. 소수의 장비로 대량 트래픽 처리.

현재 아프리카TV의 검색 시스템과 캐시클러스터를 개발하고 운영.

취미로 책도 씁니다.

2013 2015 2018

Page 4: Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략

발표의 흐름

마덜 컴퍼니에서 근무하는

김개발 대리의 서비스 개발 성장기

Page 5: Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략

김대리 소개

예제코드

일정

복부비만탈출

신기술

구글검색

칼퇴하자

기계식키보드

디버깅은 생명

누구세요?

안녕하세요.저는 스타트업“마덜 컴퍼니”의개발자 입니다.

Page 6: Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략

마덜 컴퍼니의 역작 엄친아.com 을 만들 예정입니다

서비스 오픈준비 step 1

기획에서 나온 내용들

• 엄친아.com은 엄마 친구 아들의 일상을 담은 영상을 서비스 한다

• 첫 페이지에는 엄친아와 관련된 영상 20개를 조회수 순서로 보여주자

• 엄친아 자랑코너(사진 게시판)

• 기타 이것 저것 좋은 기능

Page 7: Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략

웹 서비스를 위한 서버는 어디에?

서비스 오픈준비 step 2

Page 8: Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략

서비스 오픈준비 step 3

Page 9: Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략

개발이 완료된후 1

아뿔싸!!

Page 10: Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략

개발이 완료된후 2

요구분석프로젝트제안

개발결과 설치완료 고객이원한것!

프로젝트요청

Page 11: Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략

서비스 아키텍처 V1.0

MySQL

WAS inst.

Service

UI

Page 12: Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략

서비스가 흥하고있어!

MySQL

WAS inst.

Service

UI

Page 13: Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략

아직은 매출이…돈은없고트래픽은처리해야겠고…

Page 14: Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략

캐시를 적용하자

캐시 종류가 너무 많아!!

Page 15: Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략

캐시의 분류

WAS inst.

Service

UI

Cache

Private cache Shared cache

Cache

WAS inst.

Service

UI

Cache Client

Page 16: Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략

우리 서비스에 적절한 캐시는?

캐시 선택

• 지원 기능

• 사용자 그룹

• 업데이트

• 적용성

• 트러블 슈팅

• 지원 라이브러리

Page 17: Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략

서비스 트래픽 분석

캐시 대상 선정

Page 18: Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략

데이터? 페이지?

어떻게?

메인 페이지의 엄친아 관련 영상정보 20개를 캐시에 저장

{

"contents": [

{

"video": {

"title": {

"simpleText": "연구소장님 아들 엄친아 각별 등장?! [마인크래프트모드어드벤쳐: 초능력 연구소] - Mod Adventure - [잠뜰]"

},

...

},

{

"video": {

"title": {

"simpleText": "금수저, 엄친아, 엄친딸 코스프레...

Page 19: Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략

Private cache - Google:guava

LoadingCache<String, JsonObject> cache = CacheBuilder.newBuilder()

.maximumSize(100)

.expireAfterWrite(10, TimeUnit.MINUTES)

.build(

new CacheLoader<Integer, JsonObject>() {

@Override

public JsonObject load(String pageId) throws Exception {

return getVideoList(pageId);

}

}

);

...

JsonObject mainPageVideoList = cache.get(“mainPage”);

캐시 데이터 조회

캐시 생성

Page 20: Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략

아키텍처 V1.5

MySQL

WAS inst.

Service

UI

Guava

Page 21: Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략

해결 완료!!

예제코드

일정

복부비만탈출

신기술

구글검색

칼퇴하자

기계식키보드

디버깅은 생명

캐시 적용 됐다!!잘 되네~퇴근이닷!!

Page 22: Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략

서비스가 흥하고있어 V2.0

MySQL

WAS inst.

Service

UI

Guava

Page 23: Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략

WAS inst.

Service

UI

Guava

아키텍처 V1.8

MySQL

WAS inst.

Service

UI

Guava

WAS inst.

Service

UI

Guava

Load balancer

Page 24: Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략

기능은 점점 많아지고..김대리에겐고통이찾아온다….

Page 25: Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략

그래 결정했어!!모놀리틱 to 마이크로

Page 26: Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략

빅뱅?

WAS inst.

Service

UI

Guava

WAS inst.

Service

UI

Guava

검색 API

Service

Guava

회원 API

Service

Guava

메시징 API

Service

Guava

방송 API

Service

Guava

신규작업 Holding하고

아키텍처 변경작업 올인

하지만!!

현실은녹록치않다!

feat. 사장님

Page 27: Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략

그래서 점진적적용

WAS inst.

Service

UI

Guava

검색 API

Service

Guava

회원 API

Service

Guava

메시징 API

Service

Guava

채팅 API

Service

Guava

Reverse Proxy

ACL

WAS inst.

Service

UI

Guava

안된다더니했네!!

feat. 사장님

Page 28: Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략

적용 결과

WAS inst.

Service

UI

Guava

검색 API

Service

Guava

회원 API

Service

Guava

메시징 API

Service

Guava

채팅 API

Service

Guava

Reverse Proxy

ACL

Page 29: Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략

Reverse Proxy(HA Proxy) 적용 – ACL

frontend api-server-http

bind *:80

log global

option httplog

option http-keep-alive

acl impl_done url_beg /search /member

use_backend micro_group if impl_done

default_backend legacy_group

backend legacy_group

server legacy_01 127.0.0.1:9081 check inter 5000 maxconn 10000

backend micro_group

server micro_api_01 127.0.0.1:8081 check inter 5000 maxconn 10000

ACL

레거시

마이크로 서비스(구현 완료)

Page 30: Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략

Proxy 설정

WAS inst.

Service

UI

Guava

검색 API

Service

Guava

회원 API

Service

Guava

메시징 API

Service

Guava

채팅 API

Service

Guava

Reverse Proxy

ACL

WAS inst.

Service

UI

Guava

Legacy

Micro Service

Page 31: Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략

그 시각 고객센터에서는…

Page 32: Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략

Issue 발생

고객센터 불만

영상의 제목을 바꿨는데 모바일에서는 안 바뀌네요!

영상의 조회수가 늘었다가 줄었다가 해요!

새로 올린 동영상이 보였다 안보였다 해요!

서비스가 좋아지게 바꾼거라며!! 이럴꺼면 왜 바꿨냐?

Page 33: Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략

WAS inst.

Service

UI

Guava

원인

MySQL

WAS inst.

Service

UI

Guava

WAS inst.

Service

UI

Guava

1분전캐시 데이터

5분전캐시 데이터

9분전캐시 데이터

LoadingCache<String, JsonObject> cache = CacheBuilder.newBuilder()

.maximumSize(100)

.expireAfterWrite(10, TimeUnit.MINUTES)

LoadingCache<String, JsonObject> cache = CacheBuilder.newBuilder()

.maximumSize(100)

.expireAfterWrite(30, TimeUnit.SECONDS) ????

Page 34: Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략

아키텍처 변화 V2.0

Private cache에서 Shared cache로

MySQL

Redis

WAS inst.

Service

UI

Jedis

WAS inst.

Service

UI

Jedis

WAS inst.

Service

UI

Jedis

Load balancer

Page 35: Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략

Shared cache – Jedis + Redis 적용

GenericObjectPoolConfig config = new GenericObjectPoolConfig();

config.setMaxTotal(30);

config.setBlockWhenExhausted(true);

JedisPool pool = new JedisPool(config, “192.168.0.101 ...

...

Jedis jedis = pool.getResource();

KeyManager key = new KeyManager...

String mainPageVideoList = jedis.get(key.get(“mainPage”));

JsonParser jsonParser = new JsonParser();

JsonObject mainPageVideoListJson = (JsonObject)jsonParser.parse(mainPageVideoList

);

String to JsonObject

Connection Pool

키 생성 로직

Page 36: Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략

해결 완료!!

예제코드

일정

복부비만탈출

신기술

구글검색

칼퇴하자

기계식키보드

디버깅은 생명

캐시 잘 되네!퇴근이닷!!

Page 37: Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략

개별 서비스에서 생성한 캐시 키가 충돌하면 장애

Issue

캐시에 저장된 데이터의 키 충돌

Redis

WAS inst.

like 검색

Jedis

WAS inst.

전문검색

Jedis

search:먹방{hit:{}…}

search:먹방<html>…

Page 38: Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략

공통 라이브러리배포 – Jedis + 키 생성

public class CacheManager {

private void initializePool() {

public class CacheKeyMaker implements KeyMaker {

public String makeKey(String serviceName, String key) {

return serviceName + “:” + key;

String serviceName = “fullTextSearch”;

String searchKeyword = “먹방”;

CacheManager cacheMnager = CacheManager.getInstance();

JsonObject mainPageVideoListJson = cacheMnager.get(serviceName, searchKeyword);

키 생성 규칙

Page 39: Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략

아키텍처 변화 V2.1

Cache-lib.jar 배포

MySQL

Redis

WAS inst.

Service

UI

Cache-lib

WAS inst.

Service

UI

Cache-lib

WAS inst.

Service

UI

Cache-lib, Jedis

Load balancer

Page 40: Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략

해결 완료!!

예제코드

일정

복부비만탈출

신기술

구글검색

칼퇴하자

기계식키보드

디버깅은 생명

다 됐다!! 퇴근길 치맥?

Page 41: Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략

어느날 갑자기

Page 42: Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략

서비스 장애

MySQL

Redis

캐시 서버가 죽었다!!!

WAS inst.

Service

UI

Jedis

WAS inst.

Service

UI

Jedis

WAS inst.

Service

UI

Jedis

Load balancerSPOF

Page 43: Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략

WAS inst.

Service

UI

Guava

Private cache 사용

MySQL

WAS inst.

Service

UI

Guava

WAS inst.

Service

UI

Guava

Load balancer

Page 44: Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략

MS

아키텍처 변화 V2.5

MySQL

M

WAS inst.

Service

UI

Cache-lib, Jedis

WAS inst.

Service

UI

Cache-lib, Jedis

WAS inst.

Service

UI

Cache-lib, Jedis

M M

S S

Redis Cluster

Load balancer

Page 45: Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략

해결 완료!!

예제코드

일정

복부비만탈출

신기술

구글검색

칼퇴하자

기계식키보드

디버깅은 생명

다 됐다.. 치맥?

Page 46: Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략

그 시각 옆 팀에서는 신규 서비스가

Page 47: Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략

우리도 캐시쓰게 해주세요

feat. Python

Redis Cluster

NER API

NER

Python,redis-py

키 생성 규칙 WAS inst.

Service

UI

Java,Jedis

키 생성 규칙

Page 48: Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략

캐시 서버좀공유합시다

feat. 김책임

Redis Cluster

NER API

NER

Python,redis-py

키 생성 규칙

WAS inst.

Service

UI

Cache-lib,Jedis

검색 API

게시글검색

Node.js,ioredis

키 생성 규칙

Daemon

영상인덱싱

PHP,Predis

키 생성 규칙

WAS inst.

모바일

PHP,Phpredis

키 생성 규칙

Batch

랭킹

Java,Lettuce

키 생성 규칙

API 1

Service 1

Python,redis-py

키 생성 규칙

API 2

Service 2

Python,redis-py

키 생성 규칙

API 3

Service 3

Python,redis-py

키 생성 규칙

API 4

Service 4

Python,redis-py

키 생성 규칙

헐!

Page 49: Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략

할일과 고민

캐시 클러스터를 모든 개발팀에 오픈하자

• 굿 아이디어!

오픈 전 고민들

• 사람은 누구나 실수를(flushdb, config set)

• 각 언어에 대한 라이브러리 검토 및 버전관리

• maxclients 1024??

• 키 생성 규칙이 변경되면?

• 개발자의 영원한 숙제 버전 관리!!

Page 50: Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략

라이브러리버전

feat. 김책임

Redis Cluster

NER API

NER

Python,redis-py

키 생성 규칙

WAS inst.

Service

UI

Cache-lib,Jedis 2.8

검색 API

게시글검색

Node.js,ioredis

키 생성 규칙

Daemon

영상인덱싱

PHP,Predis

키 생성 규칙

Batch

랭킹

Cache-lib,Lettuce

키 생성 규칙

Page 51: Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략

HTTP 기반 Cache API

S

M

WAS inst.

Service

UI

HttpClient

M M

S S

Redis Cluster

Cache API

Service

Cache-lib, Jedis

Page 52: Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략

장단점

장점

• 클라이언트 라이브러리

• 접근 제어 / Command 제어

• 유연성

단점

• Web API 추가 리소스 필요

• 라이브러리 대비 성능저하(Throughput/Latency)

• 관리 포인트 증가

Page 53: Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략

Webd.is? 직접 구현?

Webdis?

HTTP 기반 Cache API

S

M M M

S S

Redis Cluster

Custom API?

Service

Cache-lib, Jedis

curl -XPUT http://host/cache/set -d ‘hello world… '

Page 54: Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략

HTTP 기반 Cache API 구조

Zookeeper

S

M M M

S S

Redis Cluster

Cache API

Armeria

Netty

Zookeper

Service

Lettuce

Page 55: Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략

Cache API

Service

Cache-lib, Jedis

Cache API

Service

Cache-lib, Jedis

WAS inst.

Service

UI

HttpClient

WAS inst.

Service

UI

HttpClient

아키텍처 변화 V3.0

S

MySQL

M

WAS inst.

Service

UI

HttpClient

M M

S S

Redis Cluster

Cache API

Service

Cache-lib, Jedis

Zookeeper

Load balancer

Page 56: Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략

API가 생각보다 가볍다?

Page 57: Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략

HA Proxy 적용 – 다중 인스턴스

frontend api-server-http

bind *:80

log global

option httplog

option http-keep-alive

default_backend cache_api

backend cache_api

option httpchk GET /path

option http-keep-alive

server cache_api-01 127.0.0.1:9081 check inter 5000 maxconn 10000

server cache_api-02 127.0.0.1:9082 check inter 5000 maxconn 10000

server cache_api-02 127.0.0.1:9083 check inter 5000 maxconn 10000

Cache API서버01~03

Page 58: Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략

Cache API

Service

Cache-lib, Jedis

Cache API

Service

Cache-lib, Jedis

WAS inst.

Service

UI

HttpClient

WAS inst.

Service

UI

HttpClient

아키텍처 변화 V3.2

S

MySQL

M

WAS inst.

Service

UI

HttpClient

M M

S S

Redis Cluster

Cache API

Service

Cache-lib, Jedis

Zookeeper

Load balancer

HAProxy

Page 59: Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략

캐시 적용 사례

Page 60: Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략

서비스 적용상태

Page 61: Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략

조회수 어뷰징방지

Page 62: Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략

사용자별 영상 조회 정보를 저장

조회수 어뷰징방지 구현

51213:device6572:2134654 1

사용자 번호 동영상 번호 최종 시청위치

Data(String)Key

Page 63: Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략

동영상 이어보기

Page 64: Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략

단일 사용자별 영상번호와 재생 시간 저장

동영상 이어보기구현

“vod:view:position:21021”

513224 152

13213 350

78754 30

1028462 35

사용자 번호

동영상 번호 최종 시청위치

Data(Hash)Key

Page 65: Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략

읽음 처리

Page 66: Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략

메시지 번호와 읽은 사용자의 사용자 번호 저장

메시지 읽음처리

두 가지 구현 방법 중 Line의 구현 방법

“msg:readcount:39929:21021”

39929

92943

30233

1355549

사용자 번호 메시지 번호

읽은 사용자 번호

Data(Hash)Key

Page 67: Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략

주간단위 이벤트

Page 68: Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략

이벤트 이름과 사용자 번호에 데이터 저장

기간이 정해진이벤트

ExpireAt or select <db번호> flushdb

“event:hotsummer:21021”

viewBroad 3

viewVod 7

liveUp 2

addFavorite 1

Data(Hash)Key

사용자 번호

이벤트명 횟수

Page 69: Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략

Copyright ⓒ 2017 SAMSUNG ELECTRONICS. ALL RIGHTS RESERVED

감사합니다