您好,欢迎访问三七文档
Redis介绍2014.09.09DBA王洪权mydbalife@gmail.com内容概要•一redis简介•二redisvsmemcached•三redis持久化(rdb,aof)•四redis复制&&redissentinel•五redis分片&&twemproxyRedis简介•Startat2009by@antirez•in-memorybutpersistentdatabaseondisk•Opensource•丰富的数据结构(string、hash、list、set、sortedset)•支持持久化:AOFvsRDB•高性能(读的速度是110000次/s,写的速度是81000次/s)•PUB/SUB(订阅和发布)Redis简介高可用•replication•redis-sentinel•redisclusterRedis简介--内存数据库Redis简介redisvsmemcachedMemcached多线程Redis单线程•Redis使用单线程的IO多路复用模型•封装了一个简单的AeEvent事件处理框架,主要实现了epoll、kqueue和select•对于单纯只有IO操作来说,单线程可以将速度优势发挥到最大•Redis提供了一些简单的计算功能,比如排序、聚合等,对于这些操作,单线程模型实际会严重影响整体吞吐量,CPU计算过程中,整个IO调度都是被阻塞住的。每个slab都是1MBchunk填充item后会有空间浪费双向链表key索引表剩余空间指针回收空间指针memcached内存分配Memcached内存Item浪费Redis内存分配Redis2.4开始使用jemalloc分配内存。Jemalloc•1快速分配内存和回收•2低内存碎片•3多核心利用非常好Memcached的删除机制•空间复用(不释放删除空间)•惰性过期(get时查看时间戳,检查过期,过期删除)--过期键无法有效删除,造成非过期键被踢出。•LRU淘汰(覆盖空间)Redis的删除机制•惰性删除(类似于memcached惰性删除)•定时删除(定时对过期的key进行删除)•Redis采用惰性删除和定时删除2种混合策略,称之为定期删除•Maxmemory•volatile-lru-removethekeywithanexpiresetusinganLRUalgorithm•allkeys-lru-removeanykeyaccordinglytotheLRUalgorithm•volatile-random-removearandomkeywithanexpireset•allkeys-random-removearandomkey,anykey•volatile-ttl-removethekeywiththenearestexpiretime(minorTTL)•noeviction-don'texpireatall,justreturnanerroronwriteoperationsRedis持久化•定时快照方式(rdb)•基于语句追加文件的方式(aof)•Redis持久化存在的问题定时快照方式(snapshot):rdbcompressionyesdbfilenamer8360.rdbsave9001save30010save6010000过程:1fork一个子进程,采用copy-on-write的方式和父进程共享相同地址空间,父进程的操作不会受到阻塞2遍历所有的库,进行相关keyvalue存储操作。3重命名操作rdbAOF(appendonlylogfile)appendonlyyesappendfilenameappendonly.aofappendfsyncalways--每次收到写命令就立即强制写入磁盘,是最有保证的完全的持久化,但速度也是最慢的,一般不推荐使用。appendfsynceverysec--每秒钟强制写入磁盘一次,在性能和持久化方面做了很好的折中,是受推荐的方式。appendfsyncno--完全依赖OS的写入,但是持久化最没有保证,不被推荐。类似于mysqlinnodb_flush_log_at_trx_commitauto(自动重写)–auto-aof-rewrite-percentage100•aof_current_size•aof_base_size–auto-aof-rewrite-min-size64mbcrontab(脚本调度触发)AOF重写(bgrewriteaof)•Append•Rewrite–Fork子进程–子进程遍历所有key写入临时文件–父进程更新aof写入缓冲区–缓冲区追加临时文件–替换已有的aof文件AOF重写(bgrewriteaof)恢复过程•–只打开aof,使用aof加载•–同时打开aof和rdb,使用aof加载•–打开rdb,使用rdb加载恢复Redis持久化存在的问题•实例使用内存建议不超过物理内存的3/5,当然如果做cache的话,可以全部使用使用•Redis持久化使用bufferio,当内存不足的时候,导致swap产生,进而产生OOM。Redis持久化存在的问题Redis复制Redis复制(新浪改进)RedisSentinelSentinel是一个监视器,它可以根据被监视实例的身份和状态来判断应该执行何种动作。功能:•监视实例•下线判断•故障转移•通过PUB/SUB来交流•分布式•切换时先选举Leader,再选举新主库RedisSentinel主服务器FAIL进行故障转移RedisSentinelcatsentinel.conf############master1configure##############sentinelmonitormaster1127.0.0.163791sentineldown-after-millisecondsmaster15000sentinelparallel-syncsmaster11sentinelfailover-timeoutmaster1300000############master2configure##############sentinelmonitormaster2127.0.0.163811sentineldown-after-millisecondsmaster25000sentinelparallel-syncsmaster21sentinelfailover-timeoutmaster2300000RedisSentinelRedis分片•Jedis客户端分片支持一致性hash•中间层分片,基于twemproxy,当然也可以采用Pre-Sharding做动态扩容•Pre-Sharding(方法,在线扩容,依赖于复制)RedisPre-Sharding一致性hash添加服务器时ConsistentHashing最大限度地抑制了键的重新分布有的ConsistentHashing的实现方法还采用了虚拟节点的思想Redis的高可用•网络瞬断导致全同步(2.6)•主从没有同步点,recover只能依赖aof•Slaveof,bgsave对io冲击很大•持久化引起swap•单实例受到qps,容量限制⾃自动错开AOF重写单实例容量20G以下,引入中间层突破容量限制哨兵保障主库高可用twemproxy中间层•开源@twitter•兼容mc与redis•多种⼀致性hash策略•pipeline,批量处理•长连接,减少连接数两种使⽤用⽅方式:•cache:动态映射•storage:用从库顶替RedisHA:哨兵+中间层RedisSvr1RedisSvr2RedisSvr3Twemproxy2Twemproxy1共享相同的配置方案扩充twemproxy群集的并发能力客户端+ZooKeeper实现⾼可用2014/9/15Q&A
本文标题:redis介绍
链接地址:https://www.777doc.com/doc-6424716 .html