redis begins

91
Redis Begins [email protected]

Upload: dae-myung-kang

Post on 06-May-2015

1.901 views

Category:

Technology


1 download

TRANSCRIPT

Page 1: Redis begins

Redis Begins

[email protected]

Page 2: Redis begins

Redis?

Page 3: Redis begins

Redis? Redis is an open source.

http://redis.io

Page 4: Redis begins

Redis? Redis is an open source. BSD licensed.

http://redis.io

Page 5: Redis begins

Redis? Redis is an open source. BSD licensed. advanced key-value store.

http://redis.io

Page 6: Redis begins

Redis? Redis.io

http://redis.io

Page 7: Redis begins

Why Redis?

Page 8: Redis begins

Why Redis? Simple. Performance.

Page 9: Redis begins

Build $ make

Page 10: Redis begins

But You can meet some errors in Linux Solution: $> make distclean; make;

Page 11: Redis begins

Why? Redis saves settings to .make-* files And they disturb normal building.

Page 12: Redis begins

Argenda Single Thread. Collections. Persistent. Replication.

Page 13: Redis begins

The one thing you should know.

Page 14: Redis begins

Redis is Single Threaded!

Page 15: Redis begins

Single Thread Means!

Page 16: Redis begins

Don’t execute long task.

Page 17: Redis begins

Example: Keys command Flushall/flushdb command

Page 18: Redis begins

O(n)

Page 19: Redis begins

Keys *

di = dictGetSafeIterator(c->db->dict); allkeys = (pattern[0] == '*' && pattern[1] == '\0'); while((de = dictNext(di)) != NULL) { …… stringmatchlen(pattern,plen,key,sdslen(key),0) }

Page 20: Redis begins

FlushAll

Cache Item Count Time

Memcache 1,000,000 1~2ms

Redis 1,000,000 1000ms(1 second)

Page 21: Redis begins

Memcache’s flush is faster than Redis’s flush.

Page 22: Redis begins

Memcache’s flush is faster than

Redis’s flush?

Page 23: Redis begins

FlushAll-Redis for (i = 0; i < ht->size && ht->used > 0; i++) { dictEntry *he, *nextHe; if ((he = ht->table[i]) == NULL) continue; while(he) { nextHe = he->next; dictFreeKey(d, he); dictFreeVal(d, he); zfree(he); ht->used--; he = nextHe; } }

Page 24: Redis begins

FlushAll-Memcache

if (exptime > 0) settings.oldest_live = realtime(exptime) - 1; else /* exptime == 0 */ settings.oldest_live = current_time - 1;

Page 25: Redis begins

FlushAll-Memcache if (settings.oldest_live != 0 && settings.oldest_live <= current_time && it->time <= settings.oldest_live) { do_item_unlink(it, hv); do_item_remove(it); it = NULL; }

Page 26: Redis begins

Argenda Single Thread. Collections. Persistent. Replication.

Page 27: Redis begins

Collections Memcached supports just K-V List Set Sorted Set Hash

Page 28: Redis begins

Key:Value $> set key value $> get key

Page 29: Redis begins

Key:Value sql> insert into userinfo (name, email) values(‘charsyam’, ‘[email protected]’);

Page 30: Redis begins

Key:Value $> set id:name “charsyam” $> set id:email [email protected] $> mget id:name id:email 1) “charsyam” 2) [email protected]

Page 31: Redis begins

List $> rpush listname a --- (a) $> rpush listname b --- (a, b) $> lpush listname c --- (c, a, b) $> rpop listname(or lpop listname)

Page 32: Redis begins

List - when When you need job queue or stack.

Page 33: Redis begins

Set $> sadd setname id1 $> sadd setname id2 $> smember setname 1) “id2” 2) “id1”

Page 34: Redis begins

set - when When you need follwers ids or group members id

Page 35: Redis begins

Sorted Set $> zadd zsetname 1 “one” $> zadd zsetname 2 “two” $> zadd zsetname 3 “three”

Page 36: Redis begins

Sorted Set $> zrange zsetname 0 -1 1) “one” 2) “two” 3) “three”

Page 37: Redis begins

zset - when When you need ranking

Page 38: Redis begins

Sorted Set $> zrange zsetname 1 3 1) “two” 2) “three”

Page 39: Redis begins

Hash sql> insert into userinfo (name, email) values(‘charsyam’, ‘[email protected]’);

Page 40: Redis begins

Hash $> hmset id name “charsyam” email [email protected]

Page 41: Redis begins

Hash $> hgetall 1) “name” 2) “charsyam” 3) “email” 4) “[email protected]

Page 42: Redis begins

Hash $> hset id email [email protected] $> hgetall 1) “name” 2) “charsyam” 3) “email” 4) “[email protected]

Page 43: Redis begins

Remember!!!!!

Page 44: Redis begins

The one thing you should know.

Page 45: Redis begins

Redis is Single Threaded!

Page 46: Redis begins

Don’t insert too many items into collections.

Page 47: Redis begins

Delete collections

Item Count Time

list 1,000,000 1000ms(1 second)

set

Sorted set

hash

Page 48: Redis begins

Argenda Single Thread. Collections. Persistent. Replication.

Page 49: Redis begins

Redis can store its memory snapshot.

Page 50: Redis begins

RDB

Page 51: Redis begins

RDB is not Relation DBMS.

Page 52: Redis begins

RDB is redis snapshot name.

Page 53: Redis begins

Fork()

Page 54: Redis begins

RDB - BAD • Bad Performance in Large memory.

• Twice memory problem.

• Denying write problem when storing RDB fails.

• If you just want Cache. Turn off RDB

Page 55: Redis begins

RDB – Large Memory • Performance is relevant to Memory

Size.

17.1 GB 34.2 GB

68.4 GB

117 GB

Page 56: Redis begins

RDB – Twice Memory • fork() and COW(copy on write) Issue

–In Write Heavy System:

Page 57: Redis begins

RDB – Twice Memory

Page 58: Redis begins

RDB – Twice Memory

Page 59: Redis begins

RDB – Twice Memory

Page 60: Redis begins

Real Case Study • Background

–Can’t write to Redis Server

–Sentinel doesn’t find Server’s failure.

Page 61: Redis begins

Real Case Study • Reason –If redis fails to save RDB, Redis basically

denies write operations from client.

–“MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error.”

Page 62: Redis begins

Real Case Study • Reason if (server.stop_writes_on_bgsave_err &&

server.saveparamslen > 0 && server.lastbgsave_status == REDIS_ERR && c->cmd->flags & REDIS_CMD_WRITE) { flagTransaction(c); addReply(c, shared.bgsaveerr); return REDIS_OK; }

Page 63: Redis begins

Real Case Study • Solution #1

• Solution #2

config set stop-writes-on-bgsave-error no

Turn off RDB Setting

2.6.12 부터 conf 에서 stop-writes-on-bgsave-error 설정이 가능해짐.

Page 64: Redis begins

AOF

Page 65: Redis begins

AOF is append only file.

Page 66: Redis begins

AOF memorizes all requests.

Page 67: Redis begins

AOF *3\r\n$3\r\nset\r\n$1\r\nA\r\n$3\r\n123\r\n*3\r\n$3\r\nset\r\n$1\r\nB\r\n$3\r\n123\r\n*3\r\n$3\r\nset\r\n$1\r\nC\r\n$3\r\n123\r\n

Page 68: Redis begins

AOF *3 $3 Set $1 A ……

Page 69: Redis begins

AOF Rewrite When size of AOF grows than redis rewrite memory state to AOF.

Page 70: Redis begins

Argenda Single Thread. Collections. Persistent. Replication.

Page 71: Redis begins

Redis support master/slave replication

Page 72: Redis begins

Replication •Support Chained Replication

Master 1st Slave 2nd Slave

1st slave is master of 2nd slave

Page 73: Redis begins

Replication

Master Slave replicationCron

Health check

Page 74: Redis begins

Replication

Master Slave replicationCron

Health check

Page 75: Redis begins

Replication

Master Slave replicationCron

When master reruns, Resync with Master

Page 76: Redis begins

Mistake: Replication

Master Slave replicationCron

Slave will has no data after resyncing

If master has no data.

Page 77: Redis begins

Initial Replication Step

Page 78: Redis begins

Replication Don’t forget “slave of no one”

Page 79: Redis begins

Sentinel

Page 80: Redis begins

Sentinel • Sentinel is Failover Solution for Redis.

Master Slave

Sentinel Sentinel periodically checks Redis Master

Page 81: Redis begins

Sentinel

Master Slave

Sentinel Send “slaveof no one” to slave node

Page 82: Redis begins

Sentinel

Master Slave

Sentinel Notify to client about changing master

Client

Page 83: Redis begins

Sentinel redis 127.0.0.1:2003> psubscribe * Reading messages... (press Ctrl-C to quit) 1) "pmessage" 2) "*" 3) "+switch-master" 4) "resque 127.0.0.1 1999 127.0.0.1 2002"

Page 84: Redis begins

Sentinel • Sentinel will connect correct master

even if you set slave’s ip in conf

Master Slave

Sentinel Slave’s ip in sentinel.conf

Page 85: Redis begins

Sentinel • INFO

# Replication

role:slave

master_host:127.0.0.1

master_port:6379

……

Page 86: Redis begins

Sentinel • Reconnect to correct master using

master_host and master_port.

Master Slave

Sentinel Reconnect to master of slave.

Page 87: Redis begins

Sentinel.conf port 26379

sentinel monitor mymaster 127.0.0.1 6379 1 sentinel down-after-milliseconds mymaster 30000

sentinel can-failover mymaster yes

sentinel parallel-syncs mymaster 1

sentinel failover-timeout mymaster 900000

Page 88: Redis begins

Wrap Up

Page 89: Redis begins

Redis is Single Threaded!

Page 90: Redis begins

Q & A

Page 91: Redis begins

Thank you!