SlideShare a Scribd company logo
1 of 48
Download to read offline
인프라 운영자를 위한
Redis 트러블 슈팅
Clark.kang
charsyam@naver.com
목차
• Redis 특성 소개
– Single Threaded
• 장애 사례 및 대응법
– G 서비스 장애 사례
– P 서비스 장애 사례
– S 서비스 장애 사례
• Redis 보안 이슈
Single Threaded #1
Client #1
Client #2
……
Client #N
Redis Event Loop
I/O Multiplexing
Process
Command
Packet #1
Packet #2
Single Threaded #2
• 한 번에 하나의 명령만 처리 됨.
• 긴 작업을 호출하면 Redis 의 다른 명령들은 전부 Pending 됨
– Keys, flushall, flushdb, lua script, MULTI/EXEC
• 내부적으로 다른 스레드가 있긴 하지만 fsync 용임.
얼마나 느린가?
Command Item Count Time
flashall 1,000,000 1000ms(1 second)
추천 버전 #1
• 가능한 최신 버전
– 3.0.x 도 괜찮음.
– 아니면 2.8.x 후반대(최소 2.8.13 이후가 유리)
• 버전마다 약간씩의 차이가 있음.(최신 버전이 젤 좋음)
– 2.6.x 에서는 config set client-output-buffer-limit 은 redis-
cli 에서만 가능
– 2.8.20에서는 config set client-output-buffer-limit 에서 1GB
이런 표현이 안됨
메모리 파편화 #1
• Jemalloc 이 3.6.0 이전 버전
메모리 파편화 #2
• Jemalloc 이 3.6.0 이후버전
– 그래도 주의가 필요.
추천 클라이언트(매니지먼트용)
• Redis-cli 를 쓰세요.
– 권장 추천
• telnet 도 가능
– Inline command 라고 해서 한줄짜리는 레디스가 알아서 해석
– Inline command는 twemproxy에서는 지원되지 않음
– 구버전의 경우는 안먹는 커맨드가 있을 수도 있음
서비스 팀에 제공시 유의 사항
• 캐시인지 저장용인지에 대해서 확인이 필요
– 캐시용이라면, SAVE 옵션은 무조건 끄고 주어야 합니다.
– 저장용일때도, 해당 옵션에 대한 조절이 필요합니다.
• 하나의 레디스 인스턴스가 전체 메모리를 사용하는 것 보다는 적절히
여러 개의 인스턴스를 띄우도록 가이드합니다.
– 16G 면 11G, 12G를 쓰는것보다는 6G * 2 로 사용하는게 더 좋음.
• 기본적으로 maxmemory를 설정해 두는 것이 유리.
서비스 팀에 제공시 유의 사항
• CPU 4 core 32G Memory
Mem: 26G
Mem: 8G
Mem: 8G
Mem: 8G
Replication
Redis Replication
• Redis는 Single Thread
– Replication을 위해서 fork를 하게 됨
• Chained replication을 지원
– Multi-Master 또는 양방향 Replication은 지원 안함
• Replication을 해야할 상황이 발생할 수 있으므로 메모리에 신경써
야 함.
Replication
•Support Chained Replication
Master 1st Slave 2nd Slave
1st slave is master of 2nd slave
Replication
Master Slave
replicationCron
Health check
Replication
Master Slave
replicationCron
Health check
Replication
Master Slave
replicationCron
When master reruns, Resync with Master
Mistake: Replication
Master Slave
replicationCron
Slave will has no data after resyncing
If master has no data.
Persistent
Persistent 라고 쓰고
Hell Gate라고 읽으세요.
RDB/AOF
• RDB/AOF는 완전히 별개의 기능(서로 연관성이 없음)
• RDB
– 현재 프로세스를 Fork 해서 현재의 메모리 상태를 디스크로 덤프함.
– COW에 의해서 읽기가 많을 때는 추가로 사용하는 메모리가 적지만,
write 가 많으면 최대 메모리 2배까지 사용 가능.
• AOF
– 현재 레디스의 write 커맨드를 디스크에 저장함.
– Disk Sync 옵션에 따라서 성능에 영향을 줌(default: everysec)
– AOF rewrite가 일어나기 전까지는 그래도 부하가 적음.
피해가고 싶어도
무조건 겪게 됩니다.
(장비 이전 이슈…)
Migration
Migration 방법
1. 현재 장비에 대해서 대체 장비를 준비
2. 대체 장비에서 slave of 현재장비 IP 현재장비 port
3. Replication 완료를 기다림
1. 이때 무조건 fork 가 발생(메모리 두배 이슈 발생 가능)
4. Replication이 끝나면 Slave 장비에서 쓰기 활성화
1. Config set slave-read-only no
5. 클라이언트들이 대체 장비를 바라보도록 설정
6. 대체 장비에서 다음 명령 수행
1. slaveof no one
Partial Sync
Redis Replication 과정
1. Slave 가 Master로 Sync 명령을 보냄
2. Master는 Fork 하여 RDB 생성
3. RDB 생성이 끝나면 Master는 RDB를 Slave로 전송
4. 해당 시간동에 master가 받는 명령어는 memory에 저장
5. RDB 전송이 끝나면 Slave 가 해당 RDB Load
6. Slave의 RDB 로드가 끝나면 Master가 메모리에 쌓인 데이터 전
송
Redis Repliaction의 문제점
• Redis의 경우 마스터 슬레이브 상황에서 Master랑 연결이 잠시
라도 끊어지면, Slave는 Master의 모든 내용을 Full Sync 받는다.
– Disk IO는 비쌈
• Slave는 Master 상태를 계속 폴링으로 체크함.
Partial Sync
• Master와의 접속이 끊기고 다시 연결될 때, 기존과 동일한 master
라면, 그리고 master의 memory buffer 범위 내로 데이터가 변
경되었다면 해당 데이터만 전송 받아서 full sync를 피함.
– 데이터 변경이 없어도, 시간이 지나면 PING 등의 메시지로 인해서 버퍼가
찰 수 있다는게 함정.
• 다만 마스터가 바뀌는 경우에는 Partial Sync는 안됨
– 즉, 장애로 마스터 장비 위치가 바뀌면… slave는 무조건 full sync
장애 사례
T모 서비스
• 상황
– 캐시로만 사용
• Redis 설정
– stop-writes-on-bgsave-error yes
• 장애 현상
– RDB 생성 실패 후, write 가 계속 실패.
– 읽기만 가능
• 장애 처리
– stop-writes-on-bgsave-error no 로 설정
– 해당 값이 yes 면 RDB 생성에 실패하면 write 명령을 모두 에러냄.
G모 서비스
• 상황
– 캐시로만 사용
• Redis 설정
– SAVE 가 디폴트 옵션
– SAVE 900 1
– SAVE 300 10
– SAVE 60 10000
• 장애 현상
– 짧은 시간에 계속 RDB가 생성되면서 Disk IO가 많이 발생
• 장애 처리
– SAVE 값을 제거(config set SAVE “”)
S모 서비스
• 상황
– 캐시와 일부 복구가 필요한 데이터.
– 물리메모리 32G 에서 28G 사용
– 디스크 장애도 있던 상황
• 장애 현상
– Swap memory 사용으로 응답시간이 늘어남.
– RDB 생성에 엄청난 시간이 걸림(28G 메모리 dump에 7시간 이상 걸림)
• 장애 처리
– 그냥 포기(T.T)
Copy on Write
• 부모 프로세스의 메모리 Page 에 Write 가 발생할 때 마다, 해당
메모리 Page를 복사하게 된다.
• 읽기의 경우에는 메모리를 추가로 복사할 필요가 없다.
Copy on Write #1
Process - Parent
Physical Memory
Page A
Page B
Page C
Copy on Write #2 – Fork(), 메모리 수정 전
Process - Parent
Physical Memory
Page A
Page B
Page C
Process - Child
Copy on Write #2 – Fork(), 메모리 수정 후
Process - Parent
Physical Memory
Page A
Page B
Page C
Copy of Page C
Process - Child
Copy on Write 결론
• 최악의 경우에는 메모리를 두 배 까지 사용할 수 있다.
– 모든 Page 에 write가 발생했을 경우
• 메모리가 부족해서 스왑 영역을 사용하면 엄청나게 느려지게 된다.
P모 서비스(#1)
• 상황
– AOF 사용
– 8개의 인스턴스가 256G 장비에서 동작
• 장애 현상
– 8개의 AOF가 전부 AOF Rewrite가 발생
– 과도한 메모리 사용과 Disk 사용으로 인한 장애
• 장애 처리
– AOF Rewrite를 중지
P모 서비스(#2) – 장애는 아님
• 상황
– 네트웍 Master/Slave Replication이 모두 끊어짐.
• 장애 가능성
– 네트웍이 복구되면 모든 서버가 Master/Slave 상태를 복구하게 됨
– 모든 Master가 Fork 하여 메모리와 Disk를 사용할 가능성(전면장애)
• 대처
– Slaveof no one 명령을 이용하여 모든 M/S 관계를 제거
– 순차적으로 한대씩 Replication을 재 연결함.
Replication 실패
• 상황
– 메모리 사용량이 20G 정도
– 어느정도의 Write가 발생하는 경우
• 장애 현상
– Master/Slave Replication 연결이 계속 실패함
• 장애 처리 #1
– Redis는 Replication 중에 fork 후에 들어오는 데이터를 저장함.
– 해당 값이 특정 메모리 사이즈를 넘어가면 접속이 끊어짐
– client-output-buffer-limit slave 256mb 64mb 60
– 20G 이상이면 이 값을 512mb 이상으로 잡아두는 것이 좋음(메모리 사이즈에 비례)
• 데이터가 굉장히 많으면 미리 슬레이브의 데이터를 지워주는 것이 유리함.
– Loading 직전에, 데이터를 지우므로, 지우는데도 시간이 많이 걸릴 수 있음.
THP Disable
• 상황
– THP가 enable
– 메모리 사용량이 많음
• 장애 현상
– Fork 시에 메모리 사용량에 따라서 fork 시간이 오래 걸림
• 장애 처리
– THP Disable
Diskless Replication
• RDB 덤프를 디스크에 저장하면 disk io가 발생하므로, 디스크에 쓰지
않고, 바로 Slave로 전송
– AWS의 EBS는 느리다.
– 일반 서버의 디스크도 많이 쓰면 느리다.
• 메모리 두배 이슈를 해결하지는 못하지만, Disk IO는 줄일 수 있음.
Redis 모니터링
Redis Monitoring 항목
항목 수집 위치(Host or Redis(info))
CPU Usage, Load Host
Network inbound,
outbound
Host
현재 클라이언트 개수,
max client 설정
Redis
키 개수, 명령어 처리 수 Redis
메모리 사용량, RSS Redis
Disk 사용량, io Host
Expired keys, Evicted keys Redis
Redis 보안 이슈
Redis 보안은 굉장히 취약하다.
• ACL
– 기능 없음
– 내부망이 아닐 경우 절대로 해당 포트가 열려있으면 안됨
– Root로 띄우는 경우가 많은데, 가능한 특정 user로 띄워야 함
• 데이터
– 평문으로 모두 확인 가능.
Redis 해킹 사례
• 해당 포트가 외부에 열려있음(자세한 코드는 숨깁니다.)
– Config set dir “/root/.ssh”
– Config set dbfilename “authorized_keys”
– Save
• 이제 루트로 접근 가능.
감사합니다.

More Related Content

What's hot

쿠키런 1년, 서버개발 분투기
쿠키런 1년, 서버개발 분투기쿠키런 1년, 서버개발 분투기
쿠키런 1년, 서버개발 분투기Brian Hong
 
Jenkins를 활용한 Openshift CI/CD 구성
Jenkins를 활용한 Openshift CI/CD 구성 Jenkins를 활용한 Openshift CI/CD 구성
Jenkins를 활용한 Openshift CI/CD 구성 rockplace
 
[오픈소스컨설팅] 프로메테우스 모니터링 살펴보고 구성하기
[오픈소스컨설팅] 프로메테우스 모니터링 살펴보고 구성하기[오픈소스컨설팅] 프로메테우스 모니터링 살펴보고 구성하기
[오픈소스컨설팅] 프로메테우스 모니터링 살펴보고 구성하기Ji-Woong Choi
 
서버 아키텍처 이해를 위한 프로세스와 쓰레드
서버 아키텍처 이해를 위한 프로세스와 쓰레드서버 아키텍처 이해를 위한 프로세스와 쓰레드
서버 아키텍처 이해를 위한 프로세스와 쓰레드KwangSeob Jeong
 
DockerからKubernetesへのシフト
DockerからKubernetesへのシフトDockerからKubernetesへのシフト
DockerからKubernetesへのシフトmasaki nakayama
 
Holistic testing in DevOps
Holistic testing in DevOpsHolistic testing in DevOps
Holistic testing in DevOpsJanet Gregory
 
SRE Demystified - 01 - SLO SLI and SLA
SRE Demystified - 01 - SLO SLI and SLASRE Demystified - 01 - SLO SLI and SLA
SRE Demystified - 01 - SLO SLI and SLADr Ganesh Iyer
 
Monitoring Microservices
Monitoring MicroservicesMonitoring Microservices
Monitoring MicroservicesWeaveworks
 
Salvatore Sanfilippo – How Redis Cluster works, and why - NoSQL matters Barce...
Salvatore Sanfilippo – How Redis Cluster works, and why - NoSQL matters Barce...Salvatore Sanfilippo – How Redis Cluster works, and why - NoSQL matters Barce...
Salvatore Sanfilippo – How Redis Cluster works, and why - NoSQL matters Barce...NoSQLmatters
 
ASP.NET과 C#으로 개발하는 대규모 소셜 게임
ASP.NET과 C#으로 개발하는 대규모 소셜 게임ASP.NET과 C#으로 개발하는 대규모 소셜 게임
ASP.NET과 C#으로 개발하는 대규모 소셜 게임흥배 최
 
webservice scaling for newbie
webservice scaling for newbiewebservice scaling for newbie
webservice scaling for newbieDaeMyung Kang
 
Apache kafka 관리와 모니터링
Apache kafka 관리와 모니터링Apache kafka 관리와 모니터링
Apache kafka 관리와 모니터링JANGWONSEO4
 
REST API 설계
REST API 설계REST API 설계
REST API 설계Terry Cho
 
[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유
[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유
[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유Hyojun Jeon
 
Apache kafka performance(throughput) - without data loss and guaranteeing dat...
Apache kafka performance(throughput) - without data loss and guaranteeing dat...Apache kafka performance(throughput) - without data loss and guaranteeing dat...
Apache kafka performance(throughput) - without data loss and guaranteeing dat...SANG WON PARK
 
Wowza 탐험기
Wowza 탐험기Wowza 탐험기
Wowza 탐험기진수 한
 
웹서버 부하테스트 실전 노하우
웹서버 부하테스트 실전 노하우웹서버 부하테스트 실전 노하우
웹서버 부하테스트 실전 노하우IMQA
 
카프카, 산전수전 노하우
카프카, 산전수전 노하우카프카, 산전수전 노하우
카프카, 산전수전 노하우if kakao
 

What's hot (20)

Redis
RedisRedis
Redis
 
쿠키런 1년, 서버개발 분투기
쿠키런 1년, 서버개발 분투기쿠키런 1년, 서버개발 분투기
쿠키런 1년, 서버개발 분투기
 
Jenkins를 활용한 Openshift CI/CD 구성
Jenkins를 활용한 Openshift CI/CD 구성 Jenkins를 활용한 Openshift CI/CD 구성
Jenkins를 활용한 Openshift CI/CD 구성
 
[오픈소스컨설팅] 프로메테우스 모니터링 살펴보고 구성하기
[오픈소스컨설팅] 프로메테우스 모니터링 살펴보고 구성하기[오픈소스컨설팅] 프로메테우스 모니터링 살펴보고 구성하기
[오픈소스컨설팅] 프로메테우스 모니터링 살펴보고 구성하기
 
서버 아키텍처 이해를 위한 프로세스와 쓰레드
서버 아키텍처 이해를 위한 프로세스와 쓰레드서버 아키텍처 이해를 위한 프로세스와 쓰레드
서버 아키텍처 이해를 위한 프로세스와 쓰레드
 
DockerからKubernetesへのシフト
DockerからKubernetesへのシフトDockerからKubernetesへのシフト
DockerからKubernetesへのシフト
 
Holistic testing in DevOps
Holistic testing in DevOpsHolistic testing in DevOps
Holistic testing in DevOps
 
SRE Demystified - 01 - SLO SLI and SLA
SRE Demystified - 01 - SLO SLI and SLASRE Demystified - 01 - SLO SLI and SLA
SRE Demystified - 01 - SLO SLI and SLA
 
Monitoring Microservices
Monitoring MicroservicesMonitoring Microservices
Monitoring Microservices
 
kubernetes, pourquoi et comment
kubernetes, pourquoi et commentkubernetes, pourquoi et comment
kubernetes, pourquoi et comment
 
Salvatore Sanfilippo – How Redis Cluster works, and why - NoSQL matters Barce...
Salvatore Sanfilippo – How Redis Cluster works, and why - NoSQL matters Barce...Salvatore Sanfilippo – How Redis Cluster works, and why - NoSQL matters Barce...
Salvatore Sanfilippo – How Redis Cluster works, and why - NoSQL matters Barce...
 
ASP.NET과 C#으로 개발하는 대규모 소셜 게임
ASP.NET과 C#으로 개발하는 대규모 소셜 게임ASP.NET과 C#으로 개발하는 대규모 소셜 게임
ASP.NET과 C#으로 개발하는 대규모 소셜 게임
 
webservice scaling for newbie
webservice scaling for newbiewebservice scaling for newbie
webservice scaling for newbie
 
Apache kafka 관리와 모니터링
Apache kafka 관리와 모니터링Apache kafka 관리와 모니터링
Apache kafka 관리와 모니터링
 
REST API 설계
REST API 설계REST API 설계
REST API 설계
 
[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유
[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유
[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유
 
Apache kafka performance(throughput) - without data loss and guaranteeing dat...
Apache kafka performance(throughput) - without data loss and guaranteeing dat...Apache kafka performance(throughput) - without data loss and guaranteeing dat...
Apache kafka performance(throughput) - without data loss and guaranteeing dat...
 
Wowza 탐험기
Wowza 탐험기Wowza 탐험기
Wowza 탐험기
 
웹서버 부하테스트 실전 노하우
웹서버 부하테스트 실전 노하우웹서버 부하테스트 실전 노하우
웹서버 부하테스트 실전 노하우
 
카프카, 산전수전 노하우
카프카, 산전수전 노하우카프카, 산전수전 노하우
카프카, 산전수전 노하우
 

Similar to Redis trouble shooting

Redis basicandroadmap
Redis basicandroadmapRedis basicandroadmap
Redis basicandroadmapDaeMyung Kang
 
Mongo db 복제(Replication)
Mongo db 복제(Replication)Mongo db 복제(Replication)
Mongo db 복제(Replication)Hyosung Jeon
 
Redis Overview
Redis OverviewRedis Overview
Redis Overviewkalzas
 
Pgday bdr gt1000
Pgday bdr gt1000Pgday bdr gt1000
Pgday bdr gt1000정대 천
 
Pgday bdr 천정대
Pgday bdr 천정대Pgday bdr 천정대
Pgday bdr 천정대PgDay.Seoul
 
[2B5]nBase-ARC Redis Cluster
[2B5]nBase-ARC Redis Cluster[2B5]nBase-ARC Redis Cluster
[2B5]nBase-ARC Redis ClusterNAVER D2
 
Cassandra 멘붕기 | Devon 2012
Cassandra 멘붕기 | Devon 2012Cassandra 멘붕기 | Devon 2012
Cassandra 멘붕기 | Devon 2012Daum DNA
 
KGC 2014: 분산 게임 서버 구조론
KGC 2014: 분산 게임 서버 구조론KGC 2014: 분산 게임 서버 구조론
KGC 2014: 분산 게임 서버 구조론Hyunjik Bae
 
3.[d2 오픈세미나]분산시스템 개발 및 교훈 n base arc
3.[d2 오픈세미나]분산시스템 개발 및 교훈 n base arc3.[d2 오픈세미나]분산시스템 개발 및 교훈 n base arc
3.[d2 오픈세미나]분산시스템 개발 및 교훈 n base arcNAVER D2
 
CUDA를 게임 프로젝트에 적용하기
CUDA를 게임 프로젝트에 적용하기CUDA를 게임 프로젝트에 적용하기
CUDA를 게임 프로젝트에 적용하기YEONG-CHEON YOU
 
The nosql echossytem
The nosql echossytemThe nosql echossytem
The nosql echossytem종석 박
 
[스마트스터디]모바일 애플리케이션 서비스에서의 로그 수집과 분석
[스마트스터디]모바일 애플리케이션 서비스에서의 로그 수집과 분석[스마트스터디]모바일 애플리케이션 서비스에서의 로그 수집과 분석
[스마트스터디]모바일 애플리케이션 서비스에서의 로그 수집과 분석smartstudy_official
 
MySQL/MariaDB Proxy Software Test
MySQL/MariaDB Proxy Software TestMySQL/MariaDB Proxy Software Test
MySQL/MariaDB Proxy Software TestI Goo Lee
 
Osc4.x installation v1-upload
Osc4.x installation v1-uploadOsc4.x installation v1-upload
Osc4.x installation v1-uploadDong-Hwa jung
 
GPGPU(CUDA)를 이용한 MMOG 캐릭터 충돌처리
GPGPU(CUDA)를 이용한 MMOG 캐릭터 충돌처리GPGPU(CUDA)를 이용한 MMOG 캐릭터 충돌처리
GPGPU(CUDA)를 이용한 MMOG 캐릭터 충돌처리YEONG-CHEON YOU
 
Advanced nGrinder 2nd Edition
Advanced nGrinder 2nd EditionAdvanced nGrinder 2nd Edition
Advanced nGrinder 2nd EditionJunHo Yoon
 
이것이 레디스다.
이것이 레디스다.이것이 레디스다.
이것이 레디스다.Kris Jeong
 

Similar to Redis trouble shooting (20)

Redis acc 2015
Redis acc 2015Redis acc 2015
Redis acc 2015
 
Redis basicandroadmap
Redis basicandroadmapRedis basicandroadmap
Redis basicandroadmap
 
Mongo db 복제(Replication)
Mongo db 복제(Replication)Mongo db 복제(Replication)
Mongo db 복제(Replication)
 
Redis Overview
Redis OverviewRedis Overview
Redis Overview
 
Pgday bdr gt1000
Pgday bdr gt1000Pgday bdr gt1000
Pgday bdr gt1000
 
Pgday bdr 천정대
Pgday bdr 천정대Pgday bdr 천정대
Pgday bdr 천정대
 
[2B5]nBase-ARC Redis Cluster
[2B5]nBase-ARC Redis Cluster[2B5]nBase-ARC Redis Cluster
[2B5]nBase-ARC Redis Cluster
 
Cassandra 멘붕기 | Devon 2012
Cassandra 멘붕기 | Devon 2012Cassandra 멘붕기 | Devon 2012
Cassandra 멘붕기 | Devon 2012
 
KGC 2014: 분산 게임 서버 구조론
KGC 2014: 분산 게임 서버 구조론KGC 2014: 분산 게임 서버 구조론
KGC 2014: 분산 게임 서버 구조론
 
3.[d2 오픈세미나]분산시스템 개발 및 교훈 n base arc
3.[d2 오픈세미나]분산시스템 개발 및 교훈 n base arc3.[d2 오픈세미나]분산시스템 개발 및 교훈 n base arc
3.[d2 오픈세미나]분산시스템 개발 및 교훈 n base arc
 
CUDA를 게임 프로젝트에 적용하기
CUDA를 게임 프로젝트에 적용하기CUDA를 게임 프로젝트에 적용하기
CUDA를 게임 프로젝트에 적용하기
 
Cache governance
Cache governanceCache governance
Cache governance
 
The nosql echossytem
The nosql echossytemThe nosql echossytem
The nosql echossytem
 
[스마트스터디]모바일 애플리케이션 서비스에서의 로그 수집과 분석
[스마트스터디]모바일 애플리케이션 서비스에서의 로그 수집과 분석[스마트스터디]모바일 애플리케이션 서비스에서의 로그 수집과 분석
[스마트스터디]모바일 애플리케이션 서비스에서의 로그 수집과 분석
 
MySQL/MariaDB Proxy Software Test
MySQL/MariaDB Proxy Software TestMySQL/MariaDB Proxy Software Test
MySQL/MariaDB Proxy Software Test
 
Osc4.x installation v1-upload
Osc4.x installation v1-uploadOsc4.x installation v1-upload
Osc4.x installation v1-upload
 
GPGPU(CUDA)를 이용한 MMOG 캐릭터 충돌처리
GPGPU(CUDA)를 이용한 MMOG 캐릭터 충돌처리GPGPU(CUDA)를 이용한 MMOG 캐릭터 충돌처리
GPGPU(CUDA)를 이용한 MMOG 캐릭터 충돌처리
 
Advanced nGrinder 2nd Edition
Advanced nGrinder 2nd EditionAdvanced nGrinder 2nd Edition
Advanced nGrinder 2nd Edition
 
NoSQL
NoSQLNoSQL
NoSQL
 
이것이 레디스다.
이것이 레디스다.이것이 레디스다.
이것이 레디스다.
 

More from DaeMyung Kang

How to use redis well
How to use redis wellHow to use redis well
How to use redis wellDaeMyung 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
 
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
 
Internet Scale Service Arichitecture
Internet Scale Service ArichitectureInternet Scale Service Arichitecture
Internet Scale Service ArichitectureDaeMyung Kang
 
Redis From 2.8 to 4.x(unstable)
Redis From 2.8 to 4.x(unstable)Redis From 2.8 to 4.x(unstable)
Redis From 2.8 to 4.x(unstable)DaeMyung Kang
 
Redis From 2.8 to 4.x
Redis From 2.8 to 4.xRedis From 2.8 to 4.x
Redis From 2.8 to 4.xDaeMyung Kang
 

More from 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
 
How to use redis well
How to use redis wellHow to use redis well
How to use redis well
 
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
 
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
 
Internet Scale Service Arichitecture
Internet Scale Service ArichitectureInternet Scale Service Arichitecture
Internet Scale Service Arichitecture
 
Bloomfilter
BloomfilterBloomfilter
Bloomfilter
 
Redis From 2.8 to 4.x(unstable)
Redis From 2.8 to 4.x(unstable)Redis From 2.8 to 4.x(unstable)
Redis From 2.8 to 4.x(unstable)
 
Redis From 2.8 to 4.x
Redis From 2.8 to 4.xRedis From 2.8 to 4.x
Redis From 2.8 to 4.x
 

Redis trouble shooting

  • 1. 인프라 운영자를 위한 Redis 트러블 슈팅 Clark.kang charsyam@naver.com
  • 2. 목차 • Redis 특성 소개 – Single Threaded • 장애 사례 및 대응법 – G 서비스 장애 사례 – P 서비스 장애 사례 – S 서비스 장애 사례 • Redis 보안 이슈
  • 3. Single Threaded #1 Client #1 Client #2 …… Client #N Redis Event Loop I/O Multiplexing Process Command Packet #1 Packet #2
  • 4. Single Threaded #2 • 한 번에 하나의 명령만 처리 됨. • 긴 작업을 호출하면 Redis 의 다른 명령들은 전부 Pending 됨 – Keys, flushall, flushdb, lua script, MULTI/EXEC • 내부적으로 다른 스레드가 있긴 하지만 fsync 용임.
  • 5. 얼마나 느린가? Command Item Count Time flashall 1,000,000 1000ms(1 second)
  • 6. 추천 버전 #1 • 가능한 최신 버전 – 3.0.x 도 괜찮음. – 아니면 2.8.x 후반대(최소 2.8.13 이후가 유리) • 버전마다 약간씩의 차이가 있음.(최신 버전이 젤 좋음) – 2.6.x 에서는 config set client-output-buffer-limit 은 redis- cli 에서만 가능 – 2.8.20에서는 config set client-output-buffer-limit 에서 1GB 이런 표현이 안됨
  • 7. 메모리 파편화 #1 • Jemalloc 이 3.6.0 이전 버전
  • 8. 메모리 파편화 #2 • Jemalloc 이 3.6.0 이후버전 – 그래도 주의가 필요.
  • 9. 추천 클라이언트(매니지먼트용) • Redis-cli 를 쓰세요. – 권장 추천 • telnet 도 가능 – Inline command 라고 해서 한줄짜리는 레디스가 알아서 해석 – Inline command는 twemproxy에서는 지원되지 않음 – 구버전의 경우는 안먹는 커맨드가 있을 수도 있음
  • 10. 서비스 팀에 제공시 유의 사항 • 캐시인지 저장용인지에 대해서 확인이 필요 – 캐시용이라면, SAVE 옵션은 무조건 끄고 주어야 합니다. – 저장용일때도, 해당 옵션에 대한 조절이 필요합니다. • 하나의 레디스 인스턴스가 전체 메모리를 사용하는 것 보다는 적절히 여러 개의 인스턴스를 띄우도록 가이드합니다. – 16G 면 11G, 12G를 쓰는것보다는 6G * 2 로 사용하는게 더 좋음. • 기본적으로 maxmemory를 설정해 두는 것이 유리.
  • 11. 서비스 팀에 제공시 유의 사항 • CPU 4 core 32G Memory Mem: 26G Mem: 8G Mem: 8G Mem: 8G
  • 13. Redis Replication • Redis는 Single Thread – Replication을 위해서 fork를 하게 됨 • Chained replication을 지원 – Multi-Master 또는 양방향 Replication은 지원 안함 • Replication을 해야할 상황이 발생할 수 있으므로 메모리에 신경써 야 함.
  • 14. Replication •Support Chained Replication Master 1st Slave 2nd Slave 1st slave is master of 2nd slave
  • 18. Mistake: Replication Master Slave replicationCron Slave will has no data after resyncing If master has no data.
  • 20. Persistent 라고 쓰고 Hell Gate라고 읽으세요.
  • 21. RDB/AOF • RDB/AOF는 완전히 별개의 기능(서로 연관성이 없음) • RDB – 현재 프로세스를 Fork 해서 현재의 메모리 상태를 디스크로 덤프함. – COW에 의해서 읽기가 많을 때는 추가로 사용하는 메모리가 적지만, write 가 많으면 최대 메모리 2배까지 사용 가능. • AOF – 현재 레디스의 write 커맨드를 디스크에 저장함. – Disk Sync 옵션에 따라서 성능에 영향을 줌(default: everysec) – AOF rewrite가 일어나기 전까지는 그래도 부하가 적음.
  • 22. 피해가고 싶어도 무조건 겪게 됩니다. (장비 이전 이슈…)
  • 24. Migration 방법 1. 현재 장비에 대해서 대체 장비를 준비 2. 대체 장비에서 slave of 현재장비 IP 현재장비 port 3. Replication 완료를 기다림 1. 이때 무조건 fork 가 발생(메모리 두배 이슈 발생 가능) 4. Replication이 끝나면 Slave 장비에서 쓰기 활성화 1. Config set slave-read-only no 5. 클라이언트들이 대체 장비를 바라보도록 설정 6. 대체 장비에서 다음 명령 수행 1. slaveof no one
  • 26. Redis Replication 과정 1. Slave 가 Master로 Sync 명령을 보냄 2. Master는 Fork 하여 RDB 생성 3. RDB 생성이 끝나면 Master는 RDB를 Slave로 전송 4. 해당 시간동에 master가 받는 명령어는 memory에 저장 5. RDB 전송이 끝나면 Slave 가 해당 RDB Load 6. Slave의 RDB 로드가 끝나면 Master가 메모리에 쌓인 데이터 전 송
  • 27. Redis Repliaction의 문제점 • Redis의 경우 마스터 슬레이브 상황에서 Master랑 연결이 잠시 라도 끊어지면, Slave는 Master의 모든 내용을 Full Sync 받는다. – Disk IO는 비쌈 • Slave는 Master 상태를 계속 폴링으로 체크함.
  • 28. Partial Sync • Master와의 접속이 끊기고 다시 연결될 때, 기존과 동일한 master 라면, 그리고 master의 memory buffer 범위 내로 데이터가 변 경되었다면 해당 데이터만 전송 받아서 full sync를 피함. – 데이터 변경이 없어도, 시간이 지나면 PING 등의 메시지로 인해서 버퍼가 찰 수 있다는게 함정. • 다만 마스터가 바뀌는 경우에는 Partial Sync는 안됨 – 즉, 장애로 마스터 장비 위치가 바뀌면… slave는 무조건 full sync
  • 30. T모 서비스 • 상황 – 캐시로만 사용 • Redis 설정 – stop-writes-on-bgsave-error yes • 장애 현상 – RDB 생성 실패 후, write 가 계속 실패. – 읽기만 가능 • 장애 처리 – stop-writes-on-bgsave-error no 로 설정 – 해당 값이 yes 면 RDB 생성에 실패하면 write 명령을 모두 에러냄.
  • 31. G모 서비스 • 상황 – 캐시로만 사용 • Redis 설정 – SAVE 가 디폴트 옵션 – SAVE 900 1 – SAVE 300 10 – SAVE 60 10000 • 장애 현상 – 짧은 시간에 계속 RDB가 생성되면서 Disk IO가 많이 발생 • 장애 처리 – SAVE 값을 제거(config set SAVE “”)
  • 32. S모 서비스 • 상황 – 캐시와 일부 복구가 필요한 데이터. – 물리메모리 32G 에서 28G 사용 – 디스크 장애도 있던 상황 • 장애 현상 – Swap memory 사용으로 응답시간이 늘어남. – RDB 생성에 엄청난 시간이 걸림(28G 메모리 dump에 7시간 이상 걸림) • 장애 처리 – 그냥 포기(T.T)
  • 33. Copy on Write • 부모 프로세스의 메모리 Page 에 Write 가 발생할 때 마다, 해당 메모리 Page를 복사하게 된다. • 읽기의 경우에는 메모리를 추가로 복사할 필요가 없다.
  • 34. Copy on Write #1 Process - Parent Physical Memory Page A Page B Page C
  • 35. Copy on Write #2 – Fork(), 메모리 수정 전 Process - Parent Physical Memory Page A Page B Page C Process - Child
  • 36. Copy on Write #2 – Fork(), 메모리 수정 후 Process - Parent Physical Memory Page A Page B Page C Copy of Page C Process - Child
  • 37. Copy on Write 결론 • 최악의 경우에는 메모리를 두 배 까지 사용할 수 있다. – 모든 Page 에 write가 발생했을 경우 • 메모리가 부족해서 스왑 영역을 사용하면 엄청나게 느려지게 된다.
  • 38. P모 서비스(#1) • 상황 – AOF 사용 – 8개의 인스턴스가 256G 장비에서 동작 • 장애 현상 – 8개의 AOF가 전부 AOF Rewrite가 발생 – 과도한 메모리 사용과 Disk 사용으로 인한 장애 • 장애 처리 – AOF Rewrite를 중지
  • 39. P모 서비스(#2) – 장애는 아님 • 상황 – 네트웍 Master/Slave Replication이 모두 끊어짐. • 장애 가능성 – 네트웍이 복구되면 모든 서버가 Master/Slave 상태를 복구하게 됨 – 모든 Master가 Fork 하여 메모리와 Disk를 사용할 가능성(전면장애) • 대처 – Slaveof no one 명령을 이용하여 모든 M/S 관계를 제거 – 순차적으로 한대씩 Replication을 재 연결함.
  • 40. Replication 실패 • 상황 – 메모리 사용량이 20G 정도 – 어느정도의 Write가 발생하는 경우 • 장애 현상 – Master/Slave Replication 연결이 계속 실패함 • 장애 처리 #1 – Redis는 Replication 중에 fork 후에 들어오는 데이터를 저장함. – 해당 값이 특정 메모리 사이즈를 넘어가면 접속이 끊어짐 – client-output-buffer-limit slave 256mb 64mb 60 – 20G 이상이면 이 값을 512mb 이상으로 잡아두는 것이 좋음(메모리 사이즈에 비례) • 데이터가 굉장히 많으면 미리 슬레이브의 데이터를 지워주는 것이 유리함. – Loading 직전에, 데이터를 지우므로, 지우는데도 시간이 많이 걸릴 수 있음.
  • 41. THP Disable • 상황 – THP가 enable – 메모리 사용량이 많음 • 장애 현상 – Fork 시에 메모리 사용량에 따라서 fork 시간이 오래 걸림 • 장애 처리 – THP Disable
  • 42. Diskless Replication • RDB 덤프를 디스크에 저장하면 disk io가 발생하므로, 디스크에 쓰지 않고, 바로 Slave로 전송 – AWS의 EBS는 느리다. – 일반 서버의 디스크도 많이 쓰면 느리다. • 메모리 두배 이슈를 해결하지는 못하지만, Disk IO는 줄일 수 있음.
  • 44. Redis Monitoring 항목 항목 수집 위치(Host or Redis(info)) CPU Usage, Load Host Network inbound, outbound Host 현재 클라이언트 개수, max client 설정 Redis 키 개수, 명령어 처리 수 Redis 메모리 사용량, RSS Redis Disk 사용량, io Host Expired keys, Evicted keys Redis
  • 46. Redis 보안은 굉장히 취약하다. • ACL – 기능 없음 – 내부망이 아닐 경우 절대로 해당 포트가 열려있으면 안됨 – Root로 띄우는 경우가 많은데, 가능한 특정 user로 띄워야 함 • 데이터 – 평문으로 모두 확인 가능.
  • 47. Redis 해킹 사례 • 해당 포트가 외부에 열려있음(자세한 코드는 숨깁니다.) – Config set dir “/root/.ssh” – Config set dbfilename “authorized_keys” – Save • 이제 루트로 접근 가능.