孙立@qunar.comweibo.com@sunli1223误用和常见陷阱分析大纲被误用的NoSQLNoSQL陷阱NoSQL与MySQLNoSQL无处不在NoSQL运维被误用的NoSQL非常容易出现的错误使用方法循环网络调用• Memcached的循环和批量GET对比MapString, String result=new HashMapString, String(); for (int i = 0,len=keys.length; i len; i++) { //循环获取memcached数据 result.put(keys[i], memcacheGet(keys[i])); }//使用批量get协议 MapString,ObjectobjMap=client.get(Arrays.asList(keys));5倍性能的影响10个key消耗10ms10个key消耗2ms循环网络调用• Redis的循环和批量GET对比MapString, String result=new HashMapString, String(); for (int i = 0,len=keys.length; i len; i++) { //循环获取memcached数据 result.put(keys[i], jredis.get(keys[i])); }//循环从redis get数据 jredis.mget(keys);100个key消耗10ms100个key消耗5ms2倍性能的影响不压缩大数据• 压缩的分类不压缩NoSQ存储压缩外部client压缩不压缩大数据• 内部压缩和外部压缩内部压缩webwebwebNoSQL内部压缩,可以减小存储,提升IO性能,不能提升网络IO性能Web-外部压缩Web-外部压缩Web-外部压缩外部压缩,可以减小存储,提升IO性能,并且能够提升网络IO性能不压缩大数据• 压缩对比内部压缩webwebwebWeb-外部压缩Web-外部压缩Web-外部压缩无压缩的原始数据压缩后的数据(1000*1024*1024/8)/(10*1024)=12800qps(1000*1024*1024/8)/(4*1024)=32000qps1000Mb网卡单条数据10KB的理论qpsCPU消耗可扩展CPU消耗不可扩展跨语言交互NoSQLserializePHPOther能unserialize?NoSQL某压缩算法JAVAOther能解压吗?NoSQL陷阱NoSQL是一个新兴的话题,大量的NoSQL产品也都是新出来的,难免出现各式各样的陷阱。不能避免陷阱,但是得掉进去可以爬出来。官方数据很美好• 官方数据• 很少有提及缺点的TokyoCabinet的官方数据。实际测试你会发现,数据增加后,速度会骤减场景错误• Redis做持久存储– 单点、复制问题– 数据超过内存性能急剧下降– 扩容问题• Redis做Cache存储– 性能极高– 数据结构丰富– 可以持久化、避免雪崩现象细节描述不清楚• Ttserver=兼容memcached协议不支持memcached的flag参数早期版本increment与memcached不一致Stats命令不一致缓存重建• 系统重启后,大部分请求到磁盘• 整个系统的性能可能出现抖动• 出现连锁雪崩反应NoSQL陷阱-32bit问题• Ttserver-2GB(32bit)• Mongodb-2.5GB(32bit)Ttserver在32bit下,到达2g数据大小将出现无法启动的现象版本升级问题• 版本升级带来兼容问题(官方未声明的)• 版本升级可能导致适用场景变化NoSQL与MySQL不要犹豫该用MySQL还是NoSQL,在你还没有掌握NoSQL前,最好先在小项目尝试下。选择NoSQL需要考虑• 数据的安全性-是否久经考验• 事务性的保障• 数据的重要性• 是否有DBA运维• 未来的业务需求变化性能之争—差别在哪里?• 普通磁盘的IOPS(几百个)• 寻道时间、延迟时间• 顺序读和顺序写吞吐上百MB/S随机写变顺序写内存索引-热数据cache读写算法优化(场景化)网络协议优化NoSQL在普通磁盘的优化如果是SSD?NoSQL无处不在不管你信不信,你很可能早已在接触NoSQL了。Memcached缓存SVN使用的BDB比如:为什么要构建自己的NoSQL• 考察清楚场景和需求• 现有产品满足需求成本高• 针对特殊场景,也许比想象的简单• 可掌控构建自己的NoSQL• IP查询TreeMapIPEntry,String可轻松完成构建自己的NoSQL• 通过MySQL构建GETSETDELETEMySQL接口封装MySQLMySQL这样也是NoSQLNoSQL运维并不像官方宣称的那样,NoSQL无需DBA运维运维NoSQL并不容易• 文档齐全吗?• 网上交流多嘛?• 周边工具齐全吗?• 出现意外问题你能搞定吗?出现意外问题,很难求助到人监控-运维之本• IO• CPU• 延迟• QPS• 抖动• 数据量除了操作系统最基本的监控,还应该监控备份很重要• 避免单点• 定期数据库备份• 开发前做好切换准备(能切换到其他产品)谢谢!