Redis (Remote Dictionary Server)
Today’s topic <ul><li>Redis( 현재  version 2.4.6) 에서 지원하는 기능 및 특징 </li></ul><ul><ul><li>무엇이 가능하고 ,  무엇이 불가능한가 ? </li></ul></...
Redis Overview <ul><li>Replication  </li></ul><ul><ul><li>Non-blocking 으로 동작 </li></ul></ul><ul><ul><ul><li>Master 는  repl...
Redis Overview <ul><li>Replication  </li></ul><ul><ul><li>How Redis replication works (see below fig) </li></ul></ul><ul><...
Redis Overview <ul><li>Replication  </li></ul><ul><ul><li>Slave 가  Master 와 연결이 끊기거나  replication 이 진행 중일 때 동작은  configura...
Redis Overview <ul><li>Publish/Subscribe  기능 지원 </li></ul><ul><ul><li>System decoupling  에 유용함 </li></ul></ul>Slave  Maste...
Redis Overview <ul><li>Redis Persistence </li></ul><ul><ul><li>RDB persistence </li></ul></ul><ul><ul><ul><li>Performs poi...
Redis Overview <ul><li>Redis Persistence </li></ul><ul><ul><li>RDB persistence </li></ul></ul><ul><ul><ul><li>Snapshotting...
Redis Overview <ul><li>Redis Persistence </li></ul><ul><ul><li>Append-only file </li></ul></ul><ul><ul><ul><li>Snapshottin...
Redis Overview <ul><li>Pipelining </li></ul><ul><ul><li>한 번에 다수의  command 를 보내고 ,  나중에 그 결과를 수신하는 기술 </li></ul></ul><ul><u...
Redis Overview <ul><li>Redis cluster specification (Redis-trib) </li></ul><ul><ul><li>다수의  node 를  cluster  단위로 관리 </li></...
Client library <ul><li>Client 의 기능 </li></ul><ul><ul><li>Redis server 로  command 를 송신 </li></ul></ul><ul><ul><ul><li>데이터 관...
Client library <ul><li>현재 제공되는  C/C++ library </li></ul><ul><ul><li>C </li></ul></ul><ul><ul><ul><li>hiredis  :  recommend...
Functional test <ul><li>Master / Slave node  구성 </li></ul><ul><ul><li>아래와 같이 구성하면 모두 같은  data 를 공유할 수 있음 </li></ul></ul>No...
Functional test <ul><li>Data update  문제 </li></ul><ul><ul><li>Master / Slave  관계가 순환 구조를 갖는 경우 발생 </li></ul></ul><ul><ul><...
Performance test <ul><li>시험결과 </li></ul><ul><ul><li>SET, GET  연산 결과는 거의 유사함 </li></ul></ul><ul><ul><li>Local :  약  10,000 ...
Performance test <ul><li>시험결과 </li></ul><ul><ul><li>Data size 와 처리시간 관계 </li></ul></ul><ul><ul><li>Redis server 는  client ...
Cluster  구성  <ul><li>방안  1 </li></ul><ul><ul><li>Master/Slave  순환 구조로 구성 </li></ul></ul><ul><ul><li>Client 는 최초 하나의  Redis...
Cluster  구성  <ul><li>방안  2 </li></ul><ul><ul><li>모든  Redis server 를  Master 로 구성 </li></ul></ul><ul><ul><li>Client 에서 현재 연...
Cluster  구성  <ul><li>방안  3 </li></ul><ul><ul><li>모든  client 는 하나의  Master server 에  write </li></ul></ul><ul><ul><li>Maste...
Summary  <ul><li>Cluster  구성을 어떤 방식으로 해야 할까 ? </li></ul><ul><li>Cluster  관리용  process 가 필요할 듯 </li></ul><ul><ul><li>Cluste...
Upcoming SlideShare
Loading in...5
×

Redis Overview

2,093

Published on

Published in: Technology
1 Comment
2 Likes
Statistics
Notes
No Downloads
Views
Total Views
2,093
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
51
Comments
1
Likes
2
Embeds 0
No embeds

No notes for slide

Redis Overview

  1. 1. Redis (Remote Dictionary Server)
  2. 2. Today’s topic <ul><li>Redis( 현재 version 2.4.6) 에서 지원하는 기능 및 특징 </li></ul><ul><ul><li>무엇이 가능하고 , 무엇이 불가능한가 ? </li></ul></ul><ul><ul><li>데이터 연산보다는 운영 상의 특징들을 정리 </li></ul></ul><ul><ul><li>간단한 기능 및 성능 시험 </li></ul></ul>
  3. 3. Redis Overview <ul><li>Replication </li></ul><ul><ul><li>Non-blocking 으로 동작 </li></ul></ul><ul><ul><ul><li>Master 는 replication 하는 동시에 client 의 query 에 응답할 수 있음 </li></ul></ul></ul><ul><ul><li>Master 는 server, slave 는 client 로 동작 </li></ul></ul><ul><ul><li>Master 에 기록하는 정보는 공유 되지만 , slave 에 기록하는 정보는 공유되지 않음 </li></ul></ul>Master Slave Slave server client client replication replication X
  4. 4. Redis Overview <ul><li>Replication </li></ul><ul><ul><li>How Redis replication works (see below fig) </li></ul></ul><ul><ul><li>Reconnection </li></ul></ul><ul><ul><ul><li>Slaves are able to automatically reconnect when the master <-> slave link goes down for some reason. When a master and a slave reconnects after the link went down, a full resync is performed . </li></ul></ul></ul>Master Slave SYNC DB file - saves DB file on disk - loads DB file into memory All accumulated commands modify the dataset <ul><li>background saving </li></ul><ul><li>collects all new commands </li></ul><ul><li>received that will modify the dataset </li></ul>Fig. Replication procedure <ul><li>set up </li></ul>
  5. 5. Redis Overview <ul><li>Replication </li></ul><ul><ul><li>Slave 가 Master 와 연결이 끊기거나 replication 이 진행 중일 때 동작은 configuration 에 따라 달라짐 </li></ul></ul><ul><ul><ul><li>1. slave-serve-stale 을 yes 로 지정한 경우 </li></ul></ul></ul><ul><ul><ul><ul><li>자신이 현재 가지고 있는 data 를 기반으로 client 에 응답 </li></ul></ul></ul></ul><ul><ul><ul><ul><li>Data 가 최신이라는 보장은 없다 . </li></ul></ul></ul></ul><ul><ul><ul><li>2. slave-serve-stale 을 no 로 지정한 경우 </li></ul></ul></ul><ul><ul><ul><ul><li>Client 에 error 응답 (“SYNC with master in progress”), 단 INFO, SLAVEOF command 는 제외 </li></ul></ul></ul></ul>Issue: replication 이 진행 중일 때 , slave 는 client request 에 갱신된 값을 줄 수 있을까 ? 성능에 영향은 ..?
  6. 6. Redis Overview <ul><li>Publish/Subscribe 기능 지원 </li></ul><ul><ul><li>System decoupling 에 유용함 </li></ul></ul>Slave Master Client 1 Client 2 1. Subscribe foo 2. Publish foo (key) bar (value) 3. Message foo bar Fig. Pub/Sub procedure
  7. 7. Redis Overview <ul><li>Redis Persistence </li></ul><ul><ul><li>RDB persistence </li></ul></ul><ul><ul><ul><li>Performs point-in-time snapshots of your dataset at specified intervals. </li></ul></ul></ul><ul><ul><li>AOF (Append Only File) persistence </li></ul></ul><ul><ul><ul><li>Logs every write operation received by the server, that will be played again at server startup, reconstructing the original dataset.  </li></ul></ul></ul><ul><ul><li>Server 가 동작하는 동안만 data 를 유지하고 싶으면 RDB, AOF 기능을 사용하지 않을 수 있음 </li></ul></ul><ul><ul><li>RDB, AOF 조합해서 사용 가능 </li></ul></ul><ul><ul><li>RDB persistence </li></ul></ul><ul><ul><ul><li>Snapshotting 정책 설정 </li></ul></ul></ul><ul><ul><ul><ul><li>Ex) save 60 1000 </li></ul></ul></ul></ul><ul><ul><ul><ul><li>Redis automatically dump the dataset to disk every 60 seconds if at least 1000 keys changed </li></ul></ul></ul></ul><ul><ul><ul><ul><li>여러 개 지정 가능 </li></ul></ul></ul></ul><ul><ul><ul><ul><ul><li>save 900 1 </li></ul></ul></ul></ul></ul><ul><ul><ul><ul><ul><li>save 300 10 </li></ul></ul></ul></ul></ul><ul><ul><ul><ul><ul><li>save 60 10000 </li></ul></ul></ul></ul></ul>
  8. 8. Redis Overview <ul><li>Redis Persistence </li></ul><ul><ul><li>RDB persistence </li></ul></ul><ul><ul><ul><li>Snapshotting 동작과정 </li></ul></ul></ul>Redis Parent child 1. fork() 2. The child starts to write the dataset to a temporary RDB file 3. When the child is done writing the new RDB file, it replaces the old one.
  9. 9. Redis Overview <ul><li>Redis Persistence </li></ul><ul><ul><li>Append-only file </li></ul></ul><ul><ul><ul><li>Snapshotting is not very durable. </li></ul></ul></ul><ul><ul><ul><ul><li>If your computer running Redis stops, your power line fails, or you accidentally kill -9 your instance, the latest data written on Redis will get lost. </li></ul></ul></ul></ul><ul><ul><ul><li>The  append-only file  is an alternative, fully-durable strategy for Redis. </li></ul></ul></ul><ul><ul><ul><li>You can turn on the AOF in your configuration file: </li></ul></ul></ul><ul><ul><ul><ul><li>appendonly yes </li></ul></ul></ul></ul><ul><ul><ul><ul><li>From now on, every time Redis receives a command that changes the dataset (e.g. SET) it will append it to the AOF. When you restart Redis it will re-play the AOF to rebuild the state. </li></ul></ul></ul></ul>
  10. 10. Redis Overview <ul><li>Pipelining </li></ul><ul><ul><li>한 번에 다수의 command 를 보내고 , 나중에 그 결과를 수신하는 기술 </li></ul></ul><ul><ul><li>RTT(Round Trip Time) 을 줄이기 위함 </li></ul></ul><ul><li>Redis Administration </li></ul><ul><ul><li>Upgrading or restarting a Redis instance without downtime </li></ul></ul><ul><ul><ul><li>CONFIG SET 명령을 이용해서 실행 도중 설정 값을 변경할 수 있음 </li></ul></ul></ul><ul><ul><ul><li>단 , Redis 를 upgrade 하거나 기능이 변경되어 바꿔야 하는 경우에는 불가피하게 down 시켜야 함 </li></ul></ul></ul>
  11. 11. Redis Overview <ul><li>Redis cluster specification (Redis-trib) </li></ul><ul><ul><li>다수의 node 를 cluster 단위로 관리 </li></ul></ul><ul><ul><li>제공 기능 </li></ul></ul><ul><ul><ul><li>Redirection (MOVED, ASK) </li></ul></ul></ul><ul><ul><ul><ul><li>자신이 key 에 대한 데이터를 가지고 있지 않은 경우 실제 데이터를 가지고 있는 node 를 알려줌 </li></ul></ul></ul></ul><ul><ul><ul><li>Cluster live reconfiguration </li></ul></ul></ul><ul><ul><ul><ul><li>운영 중에 새로운 node 를 추가하거나 제거하는 기능 </li></ul></ul></ul></ul><ul><ul><ul><li>Fault Tolerance </li></ul></ul></ul><ul><ul><ul><ul><li>Node failure detection </li></ul></ul></ul></ul><ul><ul><ul><ul><li>Cluster state detection (only partially implemented) </li></ul></ul></ul></ul><ul><ul><ul><ul><li>Slave election (not implemented) </li></ul></ul></ul></ul><ul><ul><ul><ul><ul><li>Master node 가 중지된 경우 새로운 Master 를 선발하는 기능 </li></ul></ul></ul></ul></ul><ul><ul><ul><li>… </li></ul></ul></ul><ul><ul><li>현재 release 된 Redis(v.2.4.6) 자체에는 cluster 기능이 구현되어있지 않음 </li></ul></ul><ul><ul><ul><li>현재 개발중인 것으로 보임 </li></ul></ul></ul>
  12. 12. Client library <ul><li>Client 의 기능 </li></ul><ul><ul><li>Redis server 로 command 를 송신 </li></ul></ul><ul><ul><ul><li>데이터 관련 연산 뿐 아니라 , server 의 동작도 제어 가능함  기능 분리 필요 </li></ul></ul></ul><ul><ul><ul><ul><li>데이터 관련연산 </li></ul></ul></ul></ul><ul><ul><ul><ul><li>Redis server 동작 제어 </li></ul></ul></ul></ul>
  13. 13. Client library <ul><li>현재 제공되는 C/C++ library </li></ul><ul><ul><li>C </li></ul></ul><ul><ul><ul><li>hiredis : recommended !! </li></ul></ul></ul><ul><ul><ul><li>credis </li></ul></ul></ul><ul><ul><ul><li>libredis </li></ul></ul></ul><ul><ul><li>C++ </li></ul></ul><ul><ul><ul><li>C++ Client </li></ul></ul></ul><ul><ul><ul><ul><li>Multi-server 로 command 송신 지원 </li></ul></ul></ul></ul><ul><ul><ul><ul><li>Experimental state…. </li></ul></ul></ul></ul>“… Generally the current api is not stable and not well documented. Please have a look at the provided test cases (test_client.cpp) to see what is currently possible.” “ This is the official C client. Support for the whole command set, pipelining, event driven programming.” “ Support for executing commands on multiple servers in parallel via poll(2), ketama hashing. Includes PHP bindings.” “ Credis aims to be fast and minimalistic with respect to memory usage . It supports connections to multiple Redis servers. ... Current status is &quot;almost complete“…”  찾을 수 없음
  14. 14. Functional test <ul><li>Master / Slave node 구성 </li></ul><ul><ul><li>아래와 같이 구성하면 모두 같은 data 를 공유할 수 있음 </li></ul></ul>Node1 Node2 Master Slave <ul><li>=> 처음부터 모두 slave 로 구동 시키면 불가능 . 다음 순서로 실행하면 가능 </li></ul><ul><li>Node1 을 Master 로 구동 </li></ul><ul><li>Node2 를 Node1 의 Slave 로 구동 </li></ul><ul><li>Client command 로 Node1 을 Node2 의 slave 로 설정 </li></ul>Slave Master Node1 Node2 Node3 Master Slave Master Slave => POSSIBLE Node1 Node2 Node3 Master Slave Master Slave Master Slave => POSSIBLE
  15. 15. Functional test <ul><li>Data update 문제 </li></ul><ul><ul><li>Master / Slave 관계가 순환 구조를 갖는 경우 발생 </li></ul></ul><ul><ul><ul><li>GET 은 무조건 된다 . </li></ul></ul></ul><ul><ul><ul><li>Update 가 되지 않는 경우가 발생 . Update 기능에 대해 신뢰성이 없다 . </li></ul></ul></ul><ul><ul><ul><ul><li>Update: 특정 key A 에 대해 value 를 SET 하고 , 같은 key 에 대해 다시 value SET 을 시도 </li></ul></ul></ul></ul>Node1 Node2 Node3 Master Slave Master Slave Master Slave Node1 Node2 Node3 Node4 Node5 * 이상적인 구조 * Master/Slave 순환 구조
  16. 16. Performance test <ul><li>시험결과 </li></ul><ul><ul><li>SET, GET 연산 결과는 거의 유사함 </li></ul></ul><ul><ul><li>Local : 약 10,000 TPS </li></ul></ul><ul><ul><li>Remote: 약 2,000 TPS </li></ul></ul><ul><li>Data size: 1024 byte </li></ul><ul><li>Client num: 1 </li></ul><ul><li>Request num: SET/GET 각각 10,000 </li></ul><ul><li>Operation: SET  GET </li></ul>VM-Client 1 - Redis client <ul><li>VM-Client 1 (local) </li></ul><ul><li>Redis server </li></ul><ul><li>10,000 개 request 처리시간 약 1 초 </li></ul><ul><li>VM-Client 2 (remote) </li></ul><ul><li>Redis server </li></ul><ul><li>10,000 개 request 처리시간 약 5 초 </li></ul>Issue: local 연산이 확연히 빠름 . 성능 향상을 위해 Redis server 측에 data 연산용 process 가 필요할까 ..?
  17. 17. Performance test <ul><li>시험결과 </li></ul><ul><ul><li>Data size 와 처리시간 관계 </li></ul></ul><ul><ul><li>Redis server 는 client 와 물리적으로 다른 server 에 존재 </li></ul></ul>Data size (byte) SET time (sec) GET time (sec) 32 3.08 2.7 64 2.62 2.33 128 2.66 2.31 256 3.13 2.4 512 3.38 2.88 1024 4.41 4.38
  18. 18. Cluster 구성 <ul><li>방안 1 </li></ul><ul><ul><li>Master/Slave 순환 구조로 구성 </li></ul></ul><ul><ul><li>Client 는 최초 하나의 Redis server 에만 wirte </li></ul></ul><ul><ul><li>장애 발생 시 client 에서 다른 server 로 연결하고 , 이후 연결된 server 에 write </li></ul></ul>Node1 Node2 Node3 Master Slave Master Slave Master Slave Client Node1 Node2 Node3 Master Slave Master Slave Master Slave X Client X X Command] > Slaveof no one > Slaveof node3_ip port - 장점 : replication 기능을 최대한 활용할 수 있음 - 단점 : Value update 가 안될 가능성이 존재
  19. 19. Cluster 구성 <ul><li>방안 2 </li></ul><ul><ul><li>모든 Redis server 를 Master 로 구성 </li></ul></ul><ul><ul><li>Client 에서 현재 연결된 모든 server 에 write </li></ul></ul>Node1 Node2 Node3 Client Master Master Master - 장점 : 안전함 , master 하나에 장애가 발생해도 데이터 유지 , replication traffic 없음 - 단점 : Client 에서 다수의 connection 유지해야 함
  20. 20. Cluster 구성 <ul><li>방안 3 </li></ul><ul><ul><li>모든 client 는 하나의 Master server 에 write </li></ul></ul><ul><ul><li>Master server 에 장애 발생 시 Slave 중 하나를 Master 로 교체 </li></ul></ul>Node1 Node2 Node3 Client Slave Master Slave Client Client Node1 Node2 Node3 Client Slave Master Slave Client Client X X - 장점 : 방안 2 에 비해 connection 수가 적음 , Master/Slave 구조가 이상적임 - 단점 : 하나의 server 에 트래픽 집중 , slave 가 master 되기 전까지 서비스 불가
  21. 21. Summary <ul><li>Cluster 구성을 어떤 방식으로 해야 할까 ? </li></ul><ul><li>Cluster 관리용 process 가 필요할 듯 </li></ul><ul><ul><li>Cluster 관리 process 역할 예시 </li></ul></ul><ul><ul><ul><li>처음 구동 시 , 구동 순서 조정 및 Master / Slave 지정 </li></ul></ul></ul><ul><ul><ul><li>Master node 가 죽으면 연결되어있던 slave 는 계속해서 re-connection 시도 . Command( slaveof no one ) 를 보내서 connection 시도 중지 . </li></ul></ul></ul>
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×