370 likes | 447 Views
Using Redis. 2019-01-08, KISTI, Yeonghun Chae. Redis. In-memory Database. 디스크가 아닌 주 메모리 (RAM) 에 모든 데이터를 보유하는 데이터베이스 장점 ? 디스크 기반 데이터베이스에 비해 검색 속도가 빠름 단점 ? DB 서버가 예측되지 못한 오류가 발생하면 데이터가 삭제됨. In-memory Database Software. Redis 특징. In-memory Database 클러스터 지원 Key-Value 데이터 모델
E N D
Using Redis 2019-01-08, KISTI, YeonghunChae
In-memory Database • 디스크가 아닌 주 메모리(RAM)에 모든 데이터를 보유하는 데이터베이스 • 장점? • 디스크 기반 데이터베이스에 비해 검색 속도가 빠름 • 단점? • DB 서버가 예측되지 못한 오류가 발생하면 데이터가 삭제됨
Redis 특징 • In-memory Database • 클러스터 지원 • Key-Value 데이터 모델 • Publish-Subscribe Pattern 지원 • 데이터에 대한 만료 시간 설정 가능 • 메모리 데이터에 대한 백업 복구 기능
Key-Value Storage • 특정 키 값에 값을 저장하는 구조 • Put / Get 을 통해 데이터 접근 • 쉽게 생각하면 HashMap과 같은 형태의 데이터베이스
Redisvs Memcached • Memcached • 구조가 단순해서 Redis에 비해 적은 메모리 사용 • String 데이터 타입만 지원함 • 주로 HTML 캐싱에 사용됨 • 서버가 재실행되면 데이터가 삭제됨 (메모리만 사용하여 데이터 관리) • Redis • 다양한 데이터 타입 지원 • Pub-Sub 등 다양한 기능 지원 • Session 관리, Message Queuing 등 다양한 응용 • 서버가 재실행되더라도 데이터가 보존됨 (디스크 활용)
Redis Failover • Snapshotting 방식 • 순간적으로 메모리에 있는 내용을 디스크로 백업 • 백업을 할 때 시간이 오래 걸림 • 주기적으로 백업하기 때문에 예기치 못한 오류 발생시 일부 데이터가 유실될 위험 • AOF(Append On File) 방식 • Get, Put 등 모든 상태 변화가 발생할 때 상태를 디스크에 기록함 • 상태 변화에 따른 로그를 파일로 저장하여 순차적으로 실행하는 방식 • 재실행 시 속도가 느림
Pub-Sub 모델 • 쉽게 생각하면 채팅 • 특정 클라이언트가 Redis로 Publish(데이터 추가)를 하면 Subscribe 하고있는 모든 클라이언트에 전달 (Broadcast) • Pub-Sub을 활용하여 Message Queuing 시스템으로 사용 가능
Redis 사용시 주의사항 • 메모리 용량을 초과하는 데이터를 보관 • Disk Swap 영역을 사용하게 되기 때문에속도가 느려짐 • 기본적으로 자주 사용되는 메모리가 우선적으로 메모리에 남아있기 때문에 사용시 큰 문제가 되지는 않지만, 과도하게 용량이 초과되는 경우에는 조치가 필요함 • 충분한 메모리 확보가 필요 • 데이터 백업 • 데이터에 대해 100% 안전하게 보관이 불가능하기 때문에 휘발성 데이터에 대해서만 주로 사용 권장 • 보안 • 기본적으로 별도의 보안 옵션을 제공하지 않기 때문에 방화벽 설정이 필요함
Redis 활용 예시 • 웹 서버에서 HTML 캐싱 • 사용자 로그인 Session 관리 • 채팅 어플리케이션 서버 • Message Broker 시스템
Redis 명령어 • Redis 접속 및 Get / Set • redis-cli -h 127.0.0.1 • get testkey • set testkey testvalue • set testint 1 • INCR testint • INCRBY testint 10 • mget testkey testint
Redis 명령어 • List & Hash • rpush testlist test1 test2 test3 • lrange testlist 0 -1 • rpop testlist • hmset testhash name user1 birth 2000 • hget testhash name • hgetall testhash
Redis 명령어 • Set & Sorted Set • sadd testset v1 v2 v3 • smembers testset • zadd testsortedset 1 v3 • zadd testsortedset 3 v1 • zadd testsortedset 2 v2 • zrange testsortedset 0 -1
Redis 명령어 • 데이터 삭제 • keys * • del testlist • flushall
Redis 명령어 • Pub-Sub • subscribe ch1 ch2 • publish ch1 hello,world!
Session 이란? • 웹 서버에서 사용자에 대한 상태를 저장하기 위한 데이터 구조 • 브라우저의 쿠키와 서버에서 동일한 키 값(세션키)을 가지고 있음 • 세션키에 대한 데이터를 서버에서 보관함 (Key-Value 타입)
기존 Session 관리 방식 • PHP는 세션 값을 파일 시스템의 특정 공간에 저장하여 활용 • 디스크 I/O로 인해 성능 저하가 발생 할 수 있음 • Java 기반의 WAS(Tomcat 등)에서는 코드상에서 메모리에 저장하여 관리 • WAS를 재실행 하는 경우 세션이 유지되지 않음 • Node.js Express의 경우 별도 설정을 하지 않으면 메모리에 세션 정보를 저장 • Java WAS와 마찬가지로 재실행시 세션이 유지되지 않음
기존 Session 관리 방식의 한계 • Load Balancer 등을 사용하여 웹 서버를 분산하는 경우 • 접근하는 서버에 따라 세션 동기화가 되지 않음 • Load Balancer가 사용자의 접근을 어느정도 관리하기 때문에 큰 문제는 없지만, 간혹 부하가 몰리는 경우 다른 서버로 할당되기 때문에 로그인이 풀리는 경우가 있음
Redis를 활용하는 경우 장점 • Load Balancer를 사용하여 분산하더라도 세션 정보를 항상 동기화 할 수 있음 • 메모리 상에 데이터를 보관하기 때문에 속도가 빠름 • 서버를 재실행해도 세션 상태를 유지 할 수 있음
app.js • npm install express express-session connect-redis ioredis • node app.js
Example Redis Node.js/Socket.io WebServer
ioredis const Redis = require("ioredis") let redis = new Redis({ host: "127.0.0.1", port: 6379 }) redis.subscribe("channel") redis.on("message", (channel, message)=> { console.log(message) }) • npm install ioredis const Redis = require("ioredis") let redis = new Redis({ host: "127.0.0.1", port: 6379 }) redis.publish("channel", "Hello, World!")
Message Broker • 송신자의 이전 메시지 프로토콜로부터의 메시지를 수신자의 이전 메시지 프로토콜로 변환하는 중간 컴퓨터 프로그램 모듈 • IoT에서 데이터를 수집할 때 안정성을 위해 Message Broker를 사용함 • IoT에서의 Message Broker로 Mosca가 있음 • https://github.com/mcollina/mosca • MQTT 프로토콜의 데이터를 변환하기 위해 사용됨 • 센서로부터 전송받은 데이터를 서버에 저장하기 전 단계에서 사용됨
const mosca = require("mosca") let ascoltatore = { type: "redis", redis: require("redis"), db: 12, port: 6379, return_buffers: true, host: "127.0.0.1" } let moscaSettings = { port: 1883, backend: ascoltatore, persistence: { factory: mosca.persistence.Redis } } let server = new mosca.Server(moscaSettings) server.on("ready", ()=> console.log("Server Running")) server.on("clientConnected", (client)=> console.log(client.id)) server.on("publish", (packet, client)=> console.log(client.topic, client.payload) ) Mosca • npm install mosca --save • https://github.com/mcollina/mosca
THANK YOU proin@kisti.re.kr