您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 陌陌CTO李志威《GoRedis:SSD替代内存方案》
GoRedis介绍陌陌/李志威/CTO-goredis.io“GoRedis是基于RocksDB,使⽤用Go语⾔言编写的⾼高效RedisServer,提供Redis所不具备的众多特性。”RocksDB❖RocksDB由Facebook基于LevelDB改进⽽而来,能充分利⽤用多核CPU,并提供系列的扩展特性!❖LevelDB是Google开源的⾼高性能Key-Value数据库,基于⽂文件系统,主要解决⾼高并发随机写,以及海量存储的需求,配合SSD能提供⾮非常⾼高的随机读性能!❖Key有序存储,让RocksDB实现Redis数据结构提供了可⾏行性Go语⾔言❖Go是Google在近年推出的⼀一个全新的编程语⾔言!❖充分利⽤用多CPU;强类型;简化开发;貌美C/C++的速度RedisServer❖实现了Redis协议,并⽀支持⼤大部分数据指令!❖对开发者来说,服务端是GoRedis或是Redis基本⽆无异RedisServerProtocol(Golang)RocksDB!(SSD)Clients:Jedis/Pedis/redis-py/hiredisGoRedisGoRedis特性❖基于RocksDB获得⼤大量特性!❖“零”内存,数百万Field的Hash,⼏几千万Member的SortedSet,都不会消耗额外的内存!❖海量存储,基于RocksDB能提供亿级的数据存储!❖性能可观,在SSD下,Get/Set6w+/sGoRedis特性❖快速启动,没有类似ReloadRDB的过程,可以快速重启实例!❖增量同步,GoRedis主从情况下,从库断开后不会全量同步(参考MongoDB)!❖MultiSlaveOf,⼀一个GoRedis可以同时作为多个Redis的从库,实现集群备份!❖完善⽇日志,为DBA提供完善的各类⽇日志输出适⽤用场景❖海量数据存储!❖安全数据存储!❖节省内存性能测试❖以下测试基于Flash卡!❖redis-benchmark-p1602-n1000000-c20-tset,get-r100000000!❖SET:68742.70requestspersecond!❖GET:72150.07requestspersecond性能测试❖redis-benchmark-p1602-n1000000-c20-r100000000rpushmylist__rand_int__!❖RPUSH:25012.51requestspersecond磁盘IO参数/型号SAS (15K/Raid1)SSDMLC!(Raid1)SSDSLC!(Raid1)Flash容量600G200G200G600G随机读带宽(64K)45MB/s512MB/s705MB/s2.5GB/s随机写带宽(64K)30MB/s195MB/s138MB/s962MB/s随机读(4KB)IOPS85459887102694410369随机写(4KB)IOPS584204709677241557顺序读(4KB)IOPS7913767205124113337635顺序写(4KB)IOPS180171120899163866247138随机读写(R:W3:1)7904566032128413989以上数据为特定配置和环境下⼩小样本测试,仅供参考“使⽤用RocksDB实现各种Redis数据结构。”存储结构❖每个Key在RocksDB⾥里都有这样的数据结构!❖+[key]type=value!❖对于String以外的复杂结构,会使⽤用额外的数据来存储!❖不同指令,性能不同Redis结构RocksDB结构String+[key]stringHash/Set+[key]hashList+[key]listSortedSet+[key]zsetString❖Redis:SETnamelatermoon!❖RocksDB:Put(‘+[name]string’,‘latermoon’)keyvalue+[name]stringlatermoonHash/Set❖Redis:HMSETusernamelatermoonage28sexMale!❖RocksDB:!❖Put(‘+[user]hash’,‘’)!❖Put(‘_h[user]name’,‘latermoon’)!❖Put(‘_h[user]age’,’28’)!❖Put(‘_h[user]sex’,‘Male’)keyvalue+[user]hashnull_h[user]namelatermoon_h[user]age28_h[user]sexMaleList❖Redis:LPUSHmylistabc!❖RockDB:!❖Put(‘+[mylist]list’,‘0,2’)!❖Put(‘_l[mylist]#0’,‘a’)!❖Put(‘_l[mylist]#1’,‘b’)!❖Put(‘_l[mylist]#2’,‘c’)keyvalue+[mylist]list0,2_l[mylist]#0a_l[mylist]#1b_l[mylist]#2cSortedSet❖Redis:ZADDmyzset1a2b!❖RockDB:!❖Put(‘+[myzset]zset’,‘2’)!❖Put(‘_z[myzset]m#a’,‘1’)!❖Put(‘_z[myzset]m#b’,‘2’)!❖Put(‘_z[myzset]s#1#a’,‘’)!❖Put(‘_z[myzset]s#2#b’,‘’)keyvalue+[myzset]zset2_z[myzset]m#a1_z[myzset]m#b2_z[myzset]s#1#anull_z[myzset]s#2#bnull增量同步SlaveMasterSYNCSNAPSHOTSendSnapshotSendSEQnSendCommandn……SendSEQn+1SendCommandn+1❖⾸首次同步,Slave发出SYNCSNAPSHOT指令!❖Master先把完整的数据快照发送给Slave!❖然后把实时指令,及序号SEQ实时发送给Slave,实现同步增量同步❖Slave重连时,会把最后⼀一次接收到的序号SEQ发给Mater,请求接收增量数据!❖Master从本地⽇日志队列⾥里,找到对应的SEQ,补发给Slave!❖补发完成后,会继续发送实时数据,实现增量同步SlaveMasterSYNCSEQnSendSEQnSendCommandn……SendSEQn+1SendCommandn+1⽇日志❖stdlog.log标准输出!❖cmd.log指令⽇日志!❖cmd.string.log字符串指令⽇日志!❖cmd.hash.logHash指令⽇日志!❖cmd.list.logList指令⽇日志!❖cmd.zset.logSortedSet指令⽇日志!❖exec.time.log指令耗时⽇日志!❖leveldb.io.logrocksdb指令数⽇日志!❖seq.log主从同步⽇日志!❖slow.log慢查询⽇日志扩展指令❖为GoRedis定制指令,实现更多实⽤用功能!❖doc指令集提供⾯面向Document的数据结构!❖key指令集提供数据枚举功能!❖info指令提供丰富的状态信息❖对⼀一个Key提供⾯面向Document的DOC_SET和DOC_GET指令!❖doc_set(key,{name:latermoon})!❖doc_set(key,{$rpush:[photos,d.jpg,e.jpg]}})!❖doc_set(key,{$incr:[version,1]})doc_set(key,{setting.mute.start:23,setting.mute.end:8})!❖doc_set(key,{$del:[name,setting.mute.start])!❖doc_get(key)!❖doc_get(key,name,sex,photos,setting.mute,version)数据:!user:300000:profile={!!name:latermoon,//string!!sex:1//int!!photos:[a.jpg,b.jpg,c.jpg],!!setting:{//hash!!!mute:{start:23,end:8}!!},!!is_vip:true,//bool!!version:172//int!}Doc指令集Keys⽀支持❖在⼤大量数据的情况下,官⽅方Redis的Keys操作会阻塞进程,处于不可以状态!❖⽽而RocksDB的Key是有序可扫描的,因此可以提供!❖key_next[seek][count][withtype][withvalue]!❖实现稳定的全表扫描AOF指令❖AOF[yes/no]!❖⽣生成数据副本⾼高可⽤用GoRedisM1GoRedisM2GoRedis-Proxy/HaProxy双主Cache模式RedisCacheGoRedisGoRedis-Proxy⼆二次开发❖Go语⾔言版本的RedisServer框架!❖添加OnXXX(cmd*Command)即可添加⾃自定义指令陌陌/李志威/latermoon@qq.com!
本文标题:陌陌CTO李志威《GoRedis:SSD替代内存方案》
链接地址:https://www.777doc.com/doc-6166728 .html