SlideShare une entreprise Scribd logo
1  sur  22
Télécharger pour lire hors ligne
Redis 기능의 변화
- 2.8 부터 최근까지
글로벌 오픈 프론티어 4기 파트, 강대명
발표자 소개
• 강대명
• Redis Contributor
• RedisConf 2016 Speaker
오늘 할 이야기들
• Redis 3.x 부터 최근까지(2.8도 조금)
• 가볍게 살펴보고 깊게 들어가지 않습니다.
버전 추가된 기능
2.8 HyperLogLog
3.0 Redis Cluster
3.2 GeoHash
4.0 Redis Module
HyperLogLog #1
• From 2.8
• 원리는 논문을 참고하세요. 키워드로 검색하면 바로 나옵니다.
• 화장품 광고의 타켓 두 그룹
• A: 20대 후반 여성(50만명)
• B: 서울의 여성(100만명)
• A+B의 Unique 한 광고 타겟은 몇 명일까?
• 50만명 + 100만명 = 150만명?
• 유니크한 유저를 다시 구해야 할까요?
HyperLogLog #2
• 유니크 유저는 어떻게 구해야 하나요?
• A그룹을 로딩해서, B그룹에 존재하는지 일일이 찾아야 합니다.
• 유저 수가 클 수록 시간이 많이 걸리게 됩니다.
• 그렇다면 HyperLogLog는…
• 확률적 자료구조
• 정확도가 떨어지는 대신, 메모리를 적게 먹고, 속도가 빠릅니다.
• 즉 유니크한 원소의 정확한 값이 아닌 근사치 값을 보여줍니다.
• 버킷 사이즈에 따라서 달라지는데, 15%에서 20% 까지의 차이가 있을 수 있습니다.
• 이러면 써야되? 라는 생각이 드실 수도 있는데, 들어가는 비용이 정말 작아서…
HyperLogLog #3
• PFADD, PFCOUNT, PFMERGE 의 세 가지 명령이 있습니다.
명령어 내용
PFADD HyperLogLog 를 생성한다.
PFCOUNT HyperLogLog 내의 Unique한 값을 보여준다.
PFMERGE HyperLogLog 그룹을 하나로 합쳐준다.
HyperLogLog #4
• PFADD pf1 a b c d e f g
• PFCOUNT pf1
• 7
• PFADD pf1 a b c z
• PFCOUNT pf1
• 8
• PFADD pf2 e1 e2 e3 e4 a b
• PFCOUNT pf2
• 6
• PFMERGE pf3 pf1 pf2
• PFCOUNT pf3
• 12
Redis Cluster #1
• From 3.0
• 모두가 기다리던 Redis Cluster
• 그런데 결과적으로는 좋아하는 곳도 있고,
• 아닌곳도 많습니다.
Redis Cluster #2
• 동작원리
• 미리 16384 개의 Hash Slot을 정의해두고 주어진 노드들에게 할당한다.
• Node #1 : 0 ~ 5461
• Node #2: 5462 ~ 10922
• Node #3: 10923 ~ 16384
• crc16(key) % 16384 = 0 면, 0가 속하는 노드에 저장됨.
Node #1
Master
Node #2
Master
Node #3
Master
Node #1
Slave
Node #2
Slave
Node #3
Slave
Client
crc16(“kosslab”) % 16384 = 0
저장
Redis Cluster #3
• Slave 노드는 자신의 Master의 내용만 들고 있음.
• 즉 Node #2의 Master, Slave 가 모두 장애가 났을 때는 그냥 데이터 유실.
• Slot의 재분배를 통해서 데이터의 이동이 가능함.
• Migration 중인 Slot은 잠시 사용 불가.
Redis Cluster #4
• Redirection
Node #1
Master
Node #2
Master
Node #3
Master
Client
set kosslab 123
<- MOVED 0 127.0.0.1:7002
Redis Cluster #5
• No Redirection
Node #1
Master
Node #2
Master
Node #3
Master
Client
set kosslab 123
저장
Redis Cluster #6 – no cli cluster mode
• cli> set kosslab 123
• -> (error) MOVED 0 127.0.0.1:7002
• cli> set openfrontier 123
• -> (error) MOVED 13000 located at 127.0.0.1:7000
• cli> get kosslab
• -> (error) MOVED 0 127.0.0.1:7002
• cli> get openfrontier
• -> (error) MOVED 0 127.0.0.1:7000
Redis Cluster #6 – cli cluster mode
• cli:7001> set kosslab 123
• -> Redirected to slot [0] located at 127.0.0.1:7002
• OK
• cli:7002> set openfrontier 123
• -> Redirected to slot [0] located at 127.0.0.1:7000
• OK
• cli:7000> get kosslab
• Redirected to slot [0] located at 127.0.0.1:7002
• “123”
• cli:7002> get openfrontier
• Redirected to slot [0] located at 127.0.0.1:7000
• “123”
GeoHash #1
• From 3.2
• Redis 도 GeoHash가 지원됩니다.
• 우버 같은 서비스를 만든다면?
• 각 우버드라이버의 위치 정보가 존재(지속적 업데이트)
• 우버사용자의 위치가 존재
• 현재 사용자의 위치에서 반경 K 킬로미터에 있는 우버드라이버의 리스트를 가져온다면?
GeoHash #2
명령어 내용
GEOADD GEO Location 정보를 추가한다.
GEOHASH 해당 위치 정보에 대한 해식밧을 출력한다.
GEOPOS 해당 유저의 지역정보를 출력한다.
GEODIST 두 지역간의 거리를 출력한다.
GEORADIUS 특정 지역 반경에 존재하는 객체를 조회한다.
GEORADIUSBYMEMBER 특정 객체 반경에 존재하는 객체를 조회한다.
GeoHash #3
• cli> GEOADD coex 127.0590198 37.5119854 bugerking 127.0588857
37.5127556 coex_sb 127.0601088 37.5153427 bong_sb
• cli> GEORADIUSBYMEMBER coex bugerking 1 km
• 1) "bugerking"
• 2) "coex_sb"
• 3) "bong_sb"
• cli> GEORADIUSBYMEMBER coex bugerking 100 m
• 1) "bugerking"
• 2) "coex_sb"
• cli> GEORADIUSBYMEMBER coex bugerking 10 m
• 1) "bugerking"
Redis Module #1
• From 4.0
• Redis는 lua script를 지원함.
• lua script 사용의 단점
• 성능이 느리다.(네이티브로 돌았으면 좋겠다.)
• 그러면서 다양한 기능을 커버했으면 좋겠다.
• Redis PR의 대부분은 기능 추가
• 기존에 잘 받아들여지지 않음.(가벼운(?) 서버를 지향.)
Redis Module #2
• Redis Module
• Dynamic Loading Library(.so)
• 플러그인 방식으로 Redis Command를 동적으로 등록할 수 있다.
• 기존 명령을 바꿀 수는 없지만, 내부적으로 사용이 가능
• 새로운 명령을 등록함으로써, 자료구조를 추가할 수 있다.
Redis Module #3
• RedisLabs Module Repository
• https://github.com/RedisLabsModules
• bloomfilter, Full-Text Search 같은 모듈이 이미 만들어져 있음
Redis Module #4
• 모듈 작성시 주의 사항
• Redis는 Single Threaded 이므로, 모듈에서 긴 시간 처리하는 경우 Redis 자체가 블
럭되어 버림.
• 모듈에서 장애가 날 경우, Redis 서버 자체가 종료됨.
• Master/Slave 형태일 경우는, 장애를 대비해서 Slave 들도 해당 모듈을 다 로드해야
함.
• Redis 코드 자체가 익숙할 경우는 모듈 개발이 어렵지는 않음.
Thanks you!

Contenu connexe

Tendances

이것이 레디스다.
이것이 레디스다.이것이 레디스다.
이것이 레디스다.Kris Jeong
 
[234]멀티테넌트 하둡 클러스터 운영 경험기
[234]멀티테넌트 하둡 클러스터 운영 경험기[234]멀티테넌트 하둡 클러스터 운영 경험기
[234]멀티테넌트 하둡 클러스터 운영 경험기NAVER D2
 
[2B5]nBase-ARC Redis Cluster
[2B5]nBase-ARC Redis Cluster[2B5]nBase-ARC Redis Cluster
[2B5]nBase-ARC Redis ClusterNAVER D2
 
How to use redis well
How to use redis wellHow to use redis well
How to use redis wellDaeMyung Kang
 
Node Js와 Redis를 사용한 구조화된 데이터
Node Js와 Redis를 사용한 구조화된 데이터Node Js와 Redis를 사용한 구조화된 데이터
Node Js와 Redis를 사용한 구조화된 데이터jinho park
 
분산저장시스템 개발에 대한 12가지 이야기
분산저장시스템 개발에 대한 12가지 이야기분산저장시스템 개발에 대한 12가지 이야기
분산저장시스템 개발에 대한 12가지 이야기NAVER D2
 
Mongodb 특징 분석
Mongodb 특징 분석Mongodb 특징 분석
Mongodb 특징 분석Daeyong Shin
 
Massive service basic
Massive service basicMassive service basic
Massive service basicDaeMyung Kang
 
[스마트스터디]모바일 애플리케이션 서비스에서의 로그 수집과 분석
[스마트스터디]모바일 애플리케이션 서비스에서의 로그 수집과 분석[스마트스터디]모바일 애플리케이션 서비스에서의 로그 수집과 분석
[스마트스터디]모바일 애플리케이션 서비스에서의 로그 수집과 분석smartstudy_official
 
[OpenInfra Days Korea 2018] Day 2 - CEPH 운영자를 위한 Object Storage Performance T...
[OpenInfra Days Korea 2018] Day 2 - CEPH 운영자를 위한 Object Storage Performance T...[OpenInfra Days Korea 2018] Day 2 - CEPH 운영자를 위한 Object Storage Performance T...
[OpenInfra Days Korea 2018] Day 2 - CEPH 운영자를 위한 Object Storage Performance T...OpenStack Korea Community
 
[오픈소스컨설팅]RHEL7/CentOS7 Pacemaker기반-HA시스템구성-v1.0
[오픈소스컨설팅]RHEL7/CentOS7 Pacemaker기반-HA시스템구성-v1.0[오픈소스컨설팅]RHEL7/CentOS7 Pacemaker기반-HA시스템구성-v1.0
[오픈소스컨설팅]RHEL7/CentOS7 Pacemaker기반-HA시스템구성-v1.0Ji-Woong Choi
 
[252] 증분 처리 플랫폼 cana 개발기
[252] 증분 처리 플랫폼 cana 개발기[252] 증분 처리 플랫폼 cana 개발기
[252] 증분 처리 플랫폼 cana 개발기NAVER D2
 
[142]편광을 활용한6 dof 전현기
[142]편광을 활용한6 dof 전현기[142]편광을 활용한6 dof 전현기
[142]편광을 활용한6 dof 전현기NAVER D2
 
Cassandra education material
Cassandra education materialCassandra education material
Cassandra education materialYoungki Kim
 

Tendances (20)

이것이 레디스다.
이것이 레디스다.이것이 레디스다.
이것이 레디스다.
 
[234]멀티테넌트 하둡 클러스터 운영 경험기
[234]멀티테넌트 하둡 클러스터 운영 경험기[234]멀티테넌트 하둡 클러스터 운영 경험기
[234]멀티테넌트 하둡 클러스터 운영 경험기
 
Redis
RedisRedis
Redis
 
[2B5]nBase-ARC Redis Cluster
[2B5]nBase-ARC Redis Cluster[2B5]nBase-ARC Redis Cluster
[2B5]nBase-ARC Redis Cluster
 
Redis edu 1
Redis edu 1Redis edu 1
Redis edu 1
 
How to use redis well
How to use redis wellHow to use redis well
How to use redis well
 
Redis on AWS
Redis on AWSRedis on AWS
Redis on AWS
 
Redis
RedisRedis
Redis
 
Node Js와 Redis를 사용한 구조화된 데이터
Node Js와 Redis를 사용한 구조화된 데이터Node Js와 Redis를 사용한 구조화된 데이터
Node Js와 Redis를 사용한 구조화된 데이터
 
Cache governance
Cache governanceCache governance
Cache governance
 
분산저장시스템 개발에 대한 12가지 이야기
분산저장시스템 개발에 대한 12가지 이야기분산저장시스템 개발에 대한 12가지 이야기
분산저장시스템 개발에 대한 12가지 이야기
 
Mongodb 특징 분석
Mongodb 특징 분석Mongodb 특징 분석
Mongodb 특징 분석
 
Massive service basic
Massive service basicMassive service basic
Massive service basic
 
[스마트스터디]모바일 애플리케이션 서비스에서의 로그 수집과 분석
[스마트스터디]모바일 애플리케이션 서비스에서의 로그 수집과 분석[스마트스터디]모바일 애플리케이션 서비스에서의 로그 수집과 분석
[스마트스터디]모바일 애플리케이션 서비스에서의 로그 수집과 분석
 
[OpenInfra Days Korea 2018] Day 2 - CEPH 운영자를 위한 Object Storage Performance T...
[OpenInfra Days Korea 2018] Day 2 - CEPH 운영자를 위한 Object Storage Performance T...[OpenInfra Days Korea 2018] Day 2 - CEPH 운영자를 위한 Object Storage Performance T...
[OpenInfra Days Korea 2018] Day 2 - CEPH 운영자를 위한 Object Storage Performance T...
 
[오픈소스컨설팅]RHEL7/CentOS7 Pacemaker기반-HA시스템구성-v1.0
[오픈소스컨설팅]RHEL7/CentOS7 Pacemaker기반-HA시스템구성-v1.0[오픈소스컨설팅]RHEL7/CentOS7 Pacemaker기반-HA시스템구성-v1.0
[오픈소스컨설팅]RHEL7/CentOS7 Pacemaker기반-HA시스템구성-v1.0
 
Redis edu 4
Redis edu 4Redis edu 4
Redis edu 4
 
[252] 증분 처리 플랫폼 cana 개발기
[252] 증분 처리 플랫폼 cana 개발기[252] 증분 처리 플랫폼 cana 개발기
[252] 증분 처리 플랫폼 cana 개발기
 
[142]편광을 활용한6 dof 전현기
[142]편광을 활용한6 dof 전현기[142]편광을 활용한6 dof 전현기
[142]편광을 활용한6 dof 전현기
 
Cassandra education material
Cassandra education materialCassandra education material
Cassandra education material
 

En vedette

TypeScript와 Flow: 
자바스크립트 개발에 정적 타이핑 도입하기
TypeScript와 Flow: 
자바스크립트 개발에 정적 타이핑 도입하기TypeScript와 Flow: 
자바스크립트 개발에 정적 타이핑 도입하기
TypeScript와 Flow: 
자바스크립트 개발에 정적 타이핑 도입하기Heejong Ahn
 
인프런 - 스타트업 인프랩 시작 사례
인프런 - 스타트업 인프랩 시작 사례인프런 - 스타트업 인프랩 시작 사례
인프런 - 스타트업 인프랩 시작 사례Hyung Lee
 
소프트웨어 공부하는법
소프트웨어 공부하는법소프트웨어 공부하는법
소프트웨어 공부하는법Minsuk Lee
 
[오픈소스컨설팅]클라우드기반U2L마이그레이션 전략 및 고려사항
[오픈소스컨설팅]클라우드기반U2L마이그레이션 전략 및 고려사항[오픈소스컨설팅]클라우드기반U2L마이그레이션 전략 및 고려사항
[오픈소스컨설팅]클라우드기반U2L마이그레이션 전략 및 고려사항Ji-Woong Choi
 

En vedette (6)

TypeScript와 Flow: 
자바스크립트 개발에 정적 타이핑 도입하기
TypeScript와 Flow: 
자바스크립트 개발에 정적 타이핑 도입하기TypeScript와 Flow: 
자바스크립트 개발에 정적 타이핑 도입하기
TypeScript와 Flow: 
자바스크립트 개발에 정적 타이핑 도입하기
 
How to study
How to studyHow to study
How to study
 
인프런 - 스타트업 인프랩 시작 사례
인프런 - 스타트업 인프랩 시작 사례인프런 - 스타트업 인프랩 시작 사례
인프런 - 스타트업 인프랩 시작 사례
 
Soma search
Soma searchSoma search
Soma search
 
소프트웨어 공부하는법
소프트웨어 공부하는법소프트웨어 공부하는법
소프트웨어 공부하는법
 
[오픈소스컨설팅]클라우드기반U2L마이그레이션 전략 및 고려사항
[오픈소스컨설팅]클라우드기반U2L마이그레이션 전략 및 고려사항[오픈소스컨설팅]클라우드기반U2L마이그레이션 전략 및 고려사항
[오픈소스컨설팅]클라우드기반U2L마이그레이션 전략 및 고려사항
 

Similaire à Redis From 2.8 to 4.x

android stuff1
android stuff1android stuff1
android stuff1Jin Jiu
 
[2010 CodeEngn Conference 04] hahah - Defcon 18 CTF 문제풀이
[2010 CodeEngn Conference 04] hahah - Defcon 18 CTF 문제풀이[2010 CodeEngn Conference 04] hahah - Defcon 18 CTF 문제풀이
[2010 CodeEngn Conference 04] hahah - Defcon 18 CTF 문제풀이GangSeok Lee
 
[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기
[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기
[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기Sumin Byeon
 
Mongo db 2.x to 3.x
Mongo db 2.x to 3.xMongo db 2.x to 3.x
Mongo db 2.x to 3.xInBum Kim
 
초보 개발자/학생들을 위한 오픈소스 트랜드
초보 개발자/학생들을 위한 오픈소스 트랜드 초보 개발자/학생들을 위한 오픈소스 트랜드
초보 개발자/학생들을 위한 오픈소스 트랜드 YoungSu Son
 
Mongo db 시작하기
Mongo db 시작하기Mongo db 시작하기
Mongo db 시작하기OnGameServer
 
XECon+PHPFest2014 발표자료 - ElasticSearch를 이용한 통합검색 구축방법 - 김훈민
XECon+PHPFest2014 발표자료 - ElasticSearch를 이용한 통합검색 구축방법 - 김훈민XECon+PHPFest2014 발표자료 - ElasticSearch를 이용한 통합검색 구축방법 - 김훈민
XECon+PHPFest2014 발표자료 - ElasticSearch를 이용한 통합검색 구축방법 - 김훈민XpressEngine
 
kgc2014 LINE Rangers/Stage 크래시 및 어뷰징 대응
kgc2014 LINE Rangers/Stage크래시 및 어뷰징 대응kgc2014 LINE Rangers/Stage크래시 및 어뷰징 대응
kgc2014 LINE Rangers/Stage 크래시 및 어뷰징 대응sewoon Nam
 
[NDC2017 : 박준철] Python 게임 서버 안녕하십니까 - 몬스터 슈퍼리그 게임 서버
[NDC2017 : 박준철] Python 게임 서버 안녕하십니까 - 몬스터 슈퍼리그 게임 서버[NDC2017 : 박준철] Python 게임 서버 안녕하십니까 - 몬스터 슈퍼리그 게임 서버
[NDC2017 : 박준철] Python 게임 서버 안녕하십니까 - 몬스터 슈퍼리그 게임 서버준철 박
 
데브옵스(DevOps)의 현재와 미래 - ChatOps & VoiceOps (윤석찬)
데브옵스(DevOps)의 현재와 미래 - ChatOps & VoiceOps (윤석찬)데브옵스(DevOps)의 현재와 미래 - ChatOps & VoiceOps (윤석찬)
데브옵스(DevOps)의 현재와 미래 - ChatOps & VoiceOps (윤석찬)Amazon Web Services Korea
 
Remote-debugging-based-on-notrace32-20130619-1900
Remote-debugging-based-on-notrace32-20130619-1900Remote-debugging-based-on-notrace32-20130619-1900
Remote-debugging-based-on-notrace32-20130619-1900Samsung Electronics
 
[OpenTRS-001] Hotel California
[OpenTRS-001] Hotel California[OpenTRS-001] Hotel California
[OpenTRS-001] Hotel CaliforniaTheori
 
Intro KaKao ADT (Almighty Data Transmitter)
Intro KaKao ADT (Almighty Data Transmitter)Intro KaKao ADT (Almighty Data Transmitter)
Intro KaKao ADT (Almighty Data Transmitter)I Goo Lee
 
5_spatial analysis(2)
5_spatial analysis(2)5_spatial analysis(2)
5_spatial analysis(2)Joonho Lee
 
[225]yarn 기반의 deep learning application cluster 구축 김제민
[225]yarn 기반의 deep learning application cluster 구축 김제민[225]yarn 기반의 deep learning application cluster 구축 김제민
[225]yarn 기반의 deep learning application cluster 구축 김제민NAVER D2
 
Yobi-hands-on-lab-at-d2fest
Yobi-hands-on-lab-at-d2festYobi-hands-on-lab-at-d2fest
Yobi-hands-on-lab-at-d2festinsanehong Kim
 
[D2 fest 2014]yobi hands on lab
[D2 fest 2014]yobi hands on lab[D2 fest 2014]yobi hands on lab
[D2 fest 2014]yobi hands on labNAVER D2
 
HTTP 완벽가이드- 19장 배포시스템
HTTP 완벽가이드- 19장 배포시스템HTTP 완벽가이드- 19장 배포시스템
HTTP 완벽가이드- 19장 배포시스템박 민규
 
[215]네이버콘텐츠통계서비스소개 김기영
[215]네이버콘텐츠통계서비스소개 김기영[215]네이버콘텐츠통계서비스소개 김기영
[215]네이버콘텐츠통계서비스소개 김기영NAVER D2
 
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기Chris Ohk
 

Similaire à Redis From 2.8 to 4.x (20)

android stuff1
android stuff1android stuff1
android stuff1
 
[2010 CodeEngn Conference 04] hahah - Defcon 18 CTF 문제풀이
[2010 CodeEngn Conference 04] hahah - Defcon 18 CTF 문제풀이[2010 CodeEngn Conference 04] hahah - Defcon 18 CTF 문제풀이
[2010 CodeEngn Conference 04] hahah - Defcon 18 CTF 문제풀이
 
[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기
[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기
[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기
 
Mongo db 2.x to 3.x
Mongo db 2.x to 3.xMongo db 2.x to 3.x
Mongo db 2.x to 3.x
 
초보 개발자/학생들을 위한 오픈소스 트랜드
초보 개발자/학생들을 위한 오픈소스 트랜드 초보 개발자/학생들을 위한 오픈소스 트랜드
초보 개발자/학생들을 위한 오픈소스 트랜드
 
Mongo db 시작하기
Mongo db 시작하기Mongo db 시작하기
Mongo db 시작하기
 
XECon+PHPFest2014 발표자료 - ElasticSearch를 이용한 통합검색 구축방법 - 김훈민
XECon+PHPFest2014 발표자료 - ElasticSearch를 이용한 통합검색 구축방법 - 김훈민XECon+PHPFest2014 발표자료 - ElasticSearch를 이용한 통합검색 구축방법 - 김훈민
XECon+PHPFest2014 발표자료 - ElasticSearch를 이용한 통합검색 구축방법 - 김훈민
 
kgc2014 LINE Rangers/Stage 크래시 및 어뷰징 대응
kgc2014 LINE Rangers/Stage크래시 및 어뷰징 대응kgc2014 LINE Rangers/Stage크래시 및 어뷰징 대응
kgc2014 LINE Rangers/Stage 크래시 및 어뷰징 대응
 
[NDC2017 : 박준철] Python 게임 서버 안녕하십니까 - 몬스터 슈퍼리그 게임 서버
[NDC2017 : 박준철] Python 게임 서버 안녕하십니까 - 몬스터 슈퍼리그 게임 서버[NDC2017 : 박준철] Python 게임 서버 안녕하십니까 - 몬스터 슈퍼리그 게임 서버
[NDC2017 : 박준철] Python 게임 서버 안녕하십니까 - 몬스터 슈퍼리그 게임 서버
 
데브옵스(DevOps)의 현재와 미래 - ChatOps & VoiceOps (윤석찬)
데브옵스(DevOps)의 현재와 미래 - ChatOps & VoiceOps (윤석찬)데브옵스(DevOps)의 현재와 미래 - ChatOps & VoiceOps (윤석찬)
데브옵스(DevOps)의 현재와 미래 - ChatOps & VoiceOps (윤석찬)
 
Remote-debugging-based-on-notrace32-20130619-1900
Remote-debugging-based-on-notrace32-20130619-1900Remote-debugging-based-on-notrace32-20130619-1900
Remote-debugging-based-on-notrace32-20130619-1900
 
[OpenTRS-001] Hotel California
[OpenTRS-001] Hotel California[OpenTRS-001] Hotel California
[OpenTRS-001] Hotel California
 
Intro KaKao ADT (Almighty Data Transmitter)
Intro KaKao ADT (Almighty Data Transmitter)Intro KaKao ADT (Almighty Data Transmitter)
Intro KaKao ADT (Almighty Data Transmitter)
 
5_spatial analysis(2)
5_spatial analysis(2)5_spatial analysis(2)
5_spatial analysis(2)
 
[225]yarn 기반의 deep learning application cluster 구축 김제민
[225]yarn 기반의 deep learning application cluster 구축 김제민[225]yarn 기반의 deep learning application cluster 구축 김제민
[225]yarn 기반의 deep learning application cluster 구축 김제민
 
Yobi-hands-on-lab-at-d2fest
Yobi-hands-on-lab-at-d2festYobi-hands-on-lab-at-d2fest
Yobi-hands-on-lab-at-d2fest
 
[D2 fest 2014]yobi hands on lab
[D2 fest 2014]yobi hands on lab[D2 fest 2014]yobi hands on lab
[D2 fest 2014]yobi hands on lab
 
HTTP 완벽가이드- 19장 배포시스템
HTTP 완벽가이드- 19장 배포시스템HTTP 완벽가이드- 19장 배포시스템
HTTP 완벽가이드- 19장 배포시스템
 
[215]네이버콘텐츠통계서비스소개 김기영
[215]네이버콘텐츠통계서비스소개 김기영[215]네이버콘텐츠통계서비스소개 김기영
[215]네이버콘텐츠통계서비스소개 김기영
 
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
 

Plus de DaeMyung Kang

The easiest consistent hashing
The easiest consistent hashingThe easiest consistent hashing
The easiest consistent hashingDaeMyung Kang
 
How to name a cache key
How to name a cache keyHow to name a cache key
How to name a cache keyDaeMyung Kang
 
Integration between Filebeat and logstash
Integration between Filebeat and logstash Integration between Filebeat and logstash
Integration between Filebeat and logstash DaeMyung Kang
 
How to build massive service for advance
How to build massive service for advanceHow to build massive service for advance
How to build massive service for advanceDaeMyung Kang
 
Data Engineering 101
Data Engineering 101Data Engineering 101
Data Engineering 101DaeMyung Kang
 
How To Become Better Engineer
How To Become Better EngineerHow To Become Better Engineer
How To Become Better EngineerDaeMyung Kang
 
Kafka timestamp offset_final
Kafka timestamp offset_finalKafka timestamp offset_final
Kafka timestamp offset_finalDaeMyung Kang
 
Kafka timestamp offset
Kafka timestamp offsetKafka timestamp offset
Kafka timestamp offsetDaeMyung Kang
 
Data pipeline and data lake
Data pipeline and data lakeData pipeline and data lake
Data pipeline and data lakeDaeMyung Kang
 
webservice scaling for newbie
webservice scaling for newbiewebservice scaling for newbie
webservice scaling for newbieDaeMyung Kang
 
Internet Scale Service Arichitecture
Internet Scale Service ArichitectureInternet Scale Service Arichitecture
Internet Scale Service ArichitectureDaeMyung Kang
 
Using spark data frame for sql
Using spark data frame for sqlUsing spark data frame for sql
Using spark data frame for sqlDaeMyung Kang
 

Plus de DaeMyung Kang (20)

Count min sketch
Count min sketchCount min sketch
Count min sketch
 
Ansible
AnsibleAnsible
Ansible
 
Why GUID is needed
Why GUID is neededWhy GUID is needed
Why GUID is needed
 
The easiest consistent hashing
The easiest consistent hashingThe easiest consistent hashing
The easiest consistent hashing
 
How to name a cache key
How to name a cache keyHow to name a cache key
How to name a cache key
 
Integration between Filebeat and logstash
Integration between Filebeat and logstash Integration between Filebeat and logstash
Integration between Filebeat and logstash
 
How to build massive service for advance
How to build massive service for advanceHow to build massive service for advance
How to build massive service for advance
 
Data Engineering 101
Data Engineering 101Data Engineering 101
Data Engineering 101
 
How To Become Better Engineer
How To Become Better EngineerHow To Become Better Engineer
How To Become Better Engineer
 
Kafka timestamp offset_final
Kafka timestamp offset_finalKafka timestamp offset_final
Kafka timestamp offset_final
 
Kafka timestamp offset
Kafka timestamp offsetKafka timestamp offset
Kafka timestamp offset
 
Data pipeline and data lake
Data pipeline and data lakeData pipeline and data lake
Data pipeline and data lake
 
Redis acl
Redis aclRedis acl
Redis acl
 
Coffee store
Coffee storeCoffee store
Coffee store
 
Scalable webservice
Scalable webserviceScalable webservice
Scalable webservice
 
Number system
Number systemNumber system
Number system
 
webservice scaling for newbie
webservice scaling for newbiewebservice scaling for newbie
webservice scaling for newbie
 
Internet Scale Service Arichitecture
Internet Scale Service ArichitectureInternet Scale Service Arichitecture
Internet Scale Service Arichitecture
 
Bloomfilter
BloomfilterBloomfilter
Bloomfilter
 
Using spark data frame for sql
Using spark data frame for sqlUsing spark data frame for sql
Using spark data frame for sql
 

Redis From 2.8 to 4.x

  • 1. Redis 기능의 변화 - 2.8 부터 최근까지 글로벌 오픈 프론티어 4기 파트, 강대명
  • 2. 발표자 소개 • 강대명 • Redis Contributor • RedisConf 2016 Speaker
  • 3. 오늘 할 이야기들 • Redis 3.x 부터 최근까지(2.8도 조금) • 가볍게 살펴보고 깊게 들어가지 않습니다. 버전 추가된 기능 2.8 HyperLogLog 3.0 Redis Cluster 3.2 GeoHash 4.0 Redis Module
  • 4. HyperLogLog #1 • From 2.8 • 원리는 논문을 참고하세요. 키워드로 검색하면 바로 나옵니다. • 화장품 광고의 타켓 두 그룹 • A: 20대 후반 여성(50만명) • B: 서울의 여성(100만명) • A+B의 Unique 한 광고 타겟은 몇 명일까? • 50만명 + 100만명 = 150만명? • 유니크한 유저를 다시 구해야 할까요?
  • 5. HyperLogLog #2 • 유니크 유저는 어떻게 구해야 하나요? • A그룹을 로딩해서, B그룹에 존재하는지 일일이 찾아야 합니다. • 유저 수가 클 수록 시간이 많이 걸리게 됩니다. • 그렇다면 HyperLogLog는… • 확률적 자료구조 • 정확도가 떨어지는 대신, 메모리를 적게 먹고, 속도가 빠릅니다. • 즉 유니크한 원소의 정확한 값이 아닌 근사치 값을 보여줍니다. • 버킷 사이즈에 따라서 달라지는데, 15%에서 20% 까지의 차이가 있을 수 있습니다. • 이러면 써야되? 라는 생각이 드실 수도 있는데, 들어가는 비용이 정말 작아서…
  • 6. HyperLogLog #3 • PFADD, PFCOUNT, PFMERGE 의 세 가지 명령이 있습니다. 명령어 내용 PFADD HyperLogLog 를 생성한다. PFCOUNT HyperLogLog 내의 Unique한 값을 보여준다. PFMERGE HyperLogLog 그룹을 하나로 합쳐준다.
  • 7. HyperLogLog #4 • PFADD pf1 a b c d e f g • PFCOUNT pf1 • 7 • PFADD pf1 a b c z • PFCOUNT pf1 • 8 • PFADD pf2 e1 e2 e3 e4 a b • PFCOUNT pf2 • 6 • PFMERGE pf3 pf1 pf2 • PFCOUNT pf3 • 12
  • 8. Redis Cluster #1 • From 3.0 • 모두가 기다리던 Redis Cluster • 그런데 결과적으로는 좋아하는 곳도 있고, • 아닌곳도 많습니다.
  • 9. Redis Cluster #2 • 동작원리 • 미리 16384 개의 Hash Slot을 정의해두고 주어진 노드들에게 할당한다. • Node #1 : 0 ~ 5461 • Node #2: 5462 ~ 10922 • Node #3: 10923 ~ 16384 • crc16(key) % 16384 = 0 면, 0가 속하는 노드에 저장됨. Node #1 Master Node #2 Master Node #3 Master Node #1 Slave Node #2 Slave Node #3 Slave Client crc16(“kosslab”) % 16384 = 0 저장
  • 10. Redis Cluster #3 • Slave 노드는 자신의 Master의 내용만 들고 있음. • 즉 Node #2의 Master, Slave 가 모두 장애가 났을 때는 그냥 데이터 유실. • Slot의 재분배를 통해서 데이터의 이동이 가능함. • Migration 중인 Slot은 잠시 사용 불가.
  • 11. Redis Cluster #4 • Redirection Node #1 Master Node #2 Master Node #3 Master Client set kosslab 123 <- MOVED 0 127.0.0.1:7002
  • 12. Redis Cluster #5 • No Redirection Node #1 Master Node #2 Master Node #3 Master Client set kosslab 123 저장
  • 13. Redis Cluster #6 – no cli cluster mode • cli> set kosslab 123 • -> (error) MOVED 0 127.0.0.1:7002 • cli> set openfrontier 123 • -> (error) MOVED 13000 located at 127.0.0.1:7000 • cli> get kosslab • -> (error) MOVED 0 127.0.0.1:7002 • cli> get openfrontier • -> (error) MOVED 0 127.0.0.1:7000
  • 14. Redis Cluster #6 – cli cluster mode • cli:7001> set kosslab 123 • -> Redirected to slot [0] located at 127.0.0.1:7002 • OK • cli:7002> set openfrontier 123 • -> Redirected to slot [0] located at 127.0.0.1:7000 • OK • cli:7000> get kosslab • Redirected to slot [0] located at 127.0.0.1:7002 • “123” • cli:7002> get openfrontier • Redirected to slot [0] located at 127.0.0.1:7000 • “123”
  • 15. GeoHash #1 • From 3.2 • Redis 도 GeoHash가 지원됩니다. • 우버 같은 서비스를 만든다면? • 각 우버드라이버의 위치 정보가 존재(지속적 업데이트) • 우버사용자의 위치가 존재 • 현재 사용자의 위치에서 반경 K 킬로미터에 있는 우버드라이버의 리스트를 가져온다면?
  • 16. GeoHash #2 명령어 내용 GEOADD GEO Location 정보를 추가한다. GEOHASH 해당 위치 정보에 대한 해식밧을 출력한다. GEOPOS 해당 유저의 지역정보를 출력한다. GEODIST 두 지역간의 거리를 출력한다. GEORADIUS 특정 지역 반경에 존재하는 객체를 조회한다. GEORADIUSBYMEMBER 특정 객체 반경에 존재하는 객체를 조회한다.
  • 17. GeoHash #3 • cli> GEOADD coex 127.0590198 37.5119854 bugerking 127.0588857 37.5127556 coex_sb 127.0601088 37.5153427 bong_sb • cli> GEORADIUSBYMEMBER coex bugerking 1 km • 1) "bugerking" • 2) "coex_sb" • 3) "bong_sb" • cli> GEORADIUSBYMEMBER coex bugerking 100 m • 1) "bugerking" • 2) "coex_sb" • cli> GEORADIUSBYMEMBER coex bugerking 10 m • 1) "bugerking"
  • 18. Redis Module #1 • From 4.0 • Redis는 lua script를 지원함. • lua script 사용의 단점 • 성능이 느리다.(네이티브로 돌았으면 좋겠다.) • 그러면서 다양한 기능을 커버했으면 좋겠다. • Redis PR의 대부분은 기능 추가 • 기존에 잘 받아들여지지 않음.(가벼운(?) 서버를 지향.)
  • 19. Redis Module #2 • Redis Module • Dynamic Loading Library(.so) • 플러그인 방식으로 Redis Command를 동적으로 등록할 수 있다. • 기존 명령을 바꿀 수는 없지만, 내부적으로 사용이 가능 • 새로운 명령을 등록함으로써, 자료구조를 추가할 수 있다.
  • 20. Redis Module #3 • RedisLabs Module Repository • https://github.com/RedisLabsModules • bloomfilter, Full-Text Search 같은 모듈이 이미 만들어져 있음
  • 21. Redis Module #4 • 모듈 작성시 주의 사항 • Redis는 Single Threaded 이므로, 모듈에서 긴 시간 처리하는 경우 Redis 자체가 블 럭되어 버림. • 모듈에서 장애가 날 경우, Redis 서버 자체가 종료됨. • Master/Slave 형태일 경우는, 장애를 대비해서 Slave 들도 해당 모듈을 다 로드해야 함. • Redis 코드 자체가 익숙할 경우는 모듈 개발이 어렵지는 않음.