Nosql及其主要产品简介

2,479 views

Published on

Published in: Technology
0 Comments
7 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,479
On SlideShare
0
From Embeds
0
Number of Embeds
297
Actions
Shares
0
Downloads
0
Comments
0
Likes
7
Embeds 0
No embeds

No notes for slide

Nosql及其主要产品简介

  1. 1. + NoSQL ---- NoSQL在社区项目中的实践 谭振林
  2. 2. + n  NoSQL n  What is NoSQL? n  Why NoSQL? n  Key-value n  Memcache n  Column-oritented n  CassandraAgenda n  Document-database n  MongoDB n  Redis in action n  Practical project
  3. 3. + NoSQL What? Why? Family?
  4. 4. + What is NoSQL? Anti- n  ?革命? SQL? n  一类DB的总称 n  NoSQL的关键属性 n  ACID à BASE n  结构化数据 à Schema Free n  数据强调关系 à 没有关系 n  强调集中与 集群 à 大量分散计算节点的集群 n  接口统一,功能强大 à 接口简单,各擅所长
  5. 5. + Why NoSQL? n  CAP理论 n  Consistency -- 哪里的数据都一样 n  Availability -- 总是可读写 n  Partition Tolerance -- 系统容忍数据分区在物理网络断开 n  CA or CP, no CAP!!! n  应用(如:Web2.0 动态网站)需求新情况: n  强调: n  High performance - n  Huge Storage - 对海量数据的高效率存储和访问的需求 n  High Scalability && High Availability - n  不看重: n  数据库事务一致性需求 n  数据库的写实时性和读实时性需求 n  对复杂的SQL查询,特别是多表关联查询的需求
  6. 6. + NoSQL Family
  7. 7. + Size vs Complexity Size Key/value BigTable-impl Document-stores Graph-database Complexity
  8. 8. +Key/Value categoryMemcache
  9. 9. + Memcache n  From danga.com(LiveJournal) n  Features n  n  基于libevent的事件处理 n  内置内存存储方式 n  Memcached 通信的分布式 n  API: n  ADD/SET/REPLACE/APPEND/PREPEND/CAS n  GET/GETS n  Delete (Not really delete, only unavailable) n  INCR/DECR n  性能测试 n  Write:16222r/s(avg.), 18799r/s(max.) n  Read:20971r/s(avg.), 22497r/s(max.) n  衍生产品 n  dbcached : memcache+ +NMDB
  10. 10. + n  n  Consistent hashing n  hash(key) mode n (一致性哈稀) n  hash(key) mode (n/2)
  11. 11. +Column-orientedCassandra
  12. 12. + Column-Oriented:Cassandra n  From Facebook, used by twitter/digg.com… n  Features: n  灵活的schema,增加或者删除字段非常方便(on the fly) n  支持range查询:可以对Key进行范围查询 n  高可用,可扩展:单点故障不影响集群服务,可线性扩展 n  memtable n  性能 n  MySQL > 50 GB Data n  Writes Average : ~300 ms n  Reads Average : ~350 ms n  Cassandra > 50 GB Data n  Writes Average : 0.12 ms n  Reads Average : 15 ms n  类似产品 n  Google BigTable n  Zvents HyperTable
  13. 13. + Cassandra API n  Keyspace -- database n  Column Family – table n  Key – key ,row? n  Column – value,cell? n  Super Column – 电话分移动、工作、住宅 n  Sorting -- Column name Column value n  set [Keyspace].<columnfamily>[<key>][<column>]=<value>; n  get [Keyspace].<columnfamily>[<key>]([<column>]); n  super column & index;
  14. 14. +
  15. 15. +Document databasesmongoDB
  16. 16. + www.mongodb.org n  Open source, high performance, schema-free document- oriented database n  Goal : Blend performance and functionality
  17. 17. + Features of mongoDB n  面向集合存储,易存储对象类型的数据。 { n  模式自由。 comments: [ {by: "mathias", text: "...", replies: []} n  支持动态查询。 {by: "eliot", text: "...", replies: [ {by: "mike", text: "...", replies: []} n  支持完全索引,包含内部对象。 ]} ] n  支持查询。 } n  支持复制和故障恢复。 n  使用高效的二进制数据存储,包括大型对象(如视频等)。 n  自动分片以支持云级别的伸缩性:自动分片功能支持水平的数据库集群,可 动态添加额外的机器。 n  支持Python,PHP,Ruby,Java,C,C#,Javascript,Perl及C++语言的 驱动程序,社区中也提供了对Erlang及.NET等平台的驱动程序。 n  文件存储格式为BSON(一种JSON的扩展)。
  18. 18. + Large MongoDB deployment
  19. 19. + mongoDB in Worknik case -- a wiki & dictionary online service n  MongoDB承受了平均50万每小时的请求(包括周末和夜间),高峰期大约 是4倍的量。 n  MongoDB中有超过120亿个文档。 n  每个节点大约3TB数据。 n  一般情况下文档插入速度为每条8千条,峰值为每秒5万条。 n  单个Java客户端在千兆带宽下,对单个MongoDB节点的可持续的传输速度 为每秒10MB。同一个客户端的四个读取器可以保持每秒40MB的读取速度。 n  各种形式的查询都比MySQL的实现要快许多: n  示例的获取速度,从400ms减少为60ms。 n  字典项获取速度,从20ms减少为1ms。 n  文档元数据的获取速度,从30ms减少为0.1ms。 n  拼写提示的获取速度,从10ms减少为1.2ms。
  20. 20. + API of mongoDB n  Data Model n  Mongo System – a set of databases n  A database – a set of collections n  A collection – a set of documents n  A document – a set of fields n  A fields is a key-value pair n  A key is a name (string) n  A value is a n  basic type like string, integer, float, timestamp, binary, etc., n  a document n  an array of values
  21. 21. + API of MongoDB n  Native shell client n  javascript + json (bson) = cool!!! n  insert & update n  > doc = { author : joe, created : new Date(03/28/2009), ... } n  > db.posts.insert(doc); n  >db.posts.update({author:’joe’},{“$set”:{“created”:new Date()}}) n  query n  >db.posts.find({author:’joe’}).sort({created:1}) n  >db.posts.find({$query:{author:’joe’},$orderBy {created:1}}) n  >db.posts.find({},{created:false})//without created field n  >db.things.find({x:{$gt:10}})// where x > 10 n  Advanced: $gt/$lt/$gte/$lte/$all/$exists/$mod/$ne/$in/$nin/$or… n  Regex: >db.posts.find({author:/^j/}) n  Javascript expression:>db.things.find(function(){return this.x>10}) n  Cursor:>db.things.find().skip(10).limit(10).count(true) n  Remove n  db.things.remove({n:1});
  22. 22. + API of MongoDB n  samus/mongodb-csharp n  Mongo mongo = new Mongo(); mongo.Connect(); n  var db = mongo.GetDatabase(“mydb”); n  Document collection: ICursor<Document> cursor = db.GetCollection(“Users”).FindAll(); foeach(Document doc in cursor) {} n  Typed collection: ICursor<User>cursor=db.GetCollection<User>(“Users”).FindAll(); foreach(User u in cursor){} n  Linq: IEnumerable<Person> people = db.GetCollection<Person>("Person") .Find(x => x.Age >= 18); var people = from p in collection.Linq() where p.Age >= 18 && p.FirstName.StartsWith("J") orderby p.FirstName select p.FirstName + " " + p.LastName;
  23. 23. + Redis in action •  What is redis? •  Features? •  APIs?
  24. 24. + What is redis ? n  Redis is an open source, advanced key-value store. n  Redis is a data structure server since keys can contain: n  strings n  hashes n  lists n  sets n  sorted sets n  In-memory database -- outstanding performace n  Persistance supported: snapshot & AOF n  Master-slave replication n  More: transction, pub/sub…
  25. 25. + Transaction & Pipeline n  MULTI n  Command1 n  Command2 n  Command3 n  Command4 n  EXEC/DISCARD n  MULTI Redis EXEC n  EXEC n  Client n  用WATCH/UNWATCH加乐观锁 n  n  Pipeline & MGET/MSADD…
  26. 26. + Persistence n  Snapshotting n  Configure auto snapshotting n  Command save & bgsave n  Procudure: n  fork n  父进程处理其它请求,子进程写临时文件(利用copy on write机制) n  子进程完成快照,将临时文件重命名替换老快照,完成,退出 n  Append-only file(AOF) n  Configure appendonly yes & always/everysec/appendfsync n  bgrewriteaof
  27. 27. + Replication n  特性 n  支持多个Slave n  Slave Slave n  同步不会影响Master处理请求,初次同步时,Slave会被阻塞直到完成初始同步 n  Slave可自动重连 n  用法: n  可用性 n  读扩展 n  Master关闭持久化,通过Slave做持久化 n  过程 n  Slave启动,发送Sync命令 n  Master在后台生成快照,并缓存新收到命令 n  将生成好的快照发送给Slave n  Slave加载快照 n  Master将快照后缓存的命令同步给Slave n  Master将收到的命令分发给Slave,保持一致性 n  配置 n  slaveof master_name master_port
  28. 28. + VM n  不活跃数据换到硬盘,提供更多内存空间 n  Redis VM 不直接使用OS的VM: n  OS VM以4k page为最小单位进行交换,远大于一般的redis数据 n  Redis集合对象会分散存在多个Page,造成大多数Page一直被当成活跃 n  Redis会在交换前做压缩,减少IO n  启用:vm-enable yes n  n  Redis VM diskstore
  29. 29. + Clients
  30. 30. + Benchmark n  A low profile box n  Intel core duo T5500 clocked at 1.66Ghz running Linux 2.6 : n  SET: 53684.38 requests per second n  GET: 45497.73 requests per second n  INCR: 39370.47 requests per second n  LPUSH: 34803.41 requests per second n  LPOP: 37367.20 requests per second n  Another one n  64 bit box, a Xeon L5420 clocked at 2.5 Ghz: n  PING: 111731.84 requests per second n  SET: 108114.59 requests per second n  GET: 98717.67 requests per second n  INCR: 95241.91 requests per second n  LPUSH: 104712.05 requests per second n  LPOP: 93722.59 requests per second
  31. 31. + Data type
  32. 32. + Strings
  33. 33. + Strings
  34. 34. + Expirarion
  35. 35. + Delete
  36. 36. + Lists
  37. 37. + Lists
  38. 38. + Queues
  39. 39. + Sets
  40. 40. + Sets
  41. 41. + Sets
  42. 42. + Sets
  43. 43. + Hashes
  44. 44. + Key convention
  45. 45. + Session storage
  46. 46. + Social Network
  47. 47. + Social Network
  48. 48. + Socia Network
  49. 49. + Socia Network
  50. 50. + Social Network
  51. 51. + Put all together
  52. 52. + [Create New] procedure
  53. 53. + Unique IDs
  54. 54. +Practical projectwhitch solution?Experence?Discussion
  55. 55. + n  与传统Web项目的区别 n  写少读多à读写都很频繁 n  n  n  n  n  Redis + MS SQL Server n  Redis n  Memcache n  Redis先期使用两台普通服务器做主-从互备 n  SQL Server中保存所有数据 n  n  应付访问量不高的非关键业务需求 n  应付非线上需求 n  ASP.NET MVC + AJAX
  56. 56. + n  实战经验 n  推-拉模式的选择 n  复杂度从查询过程转移到写入过程 n  发一条微博的过程 1.  缓存微博对象[serialized object string] 2.  更新发布者自己的微博列表[list] 3.  更新发布者的Profile,微博记数+1[serialized object string] 4.  如果是转发,被转微博的转发数 +1[serialized object string] 5.  如果是转发,更新最热转发微博的两个排序列表[zset] 6.  更新发布者所属地区、母校、公会等的用户活跃列表,以支持好友推荐功能[zset] n  将Redis中的数据分成Vector Cache和Row Cache n  Vector Cache Row Cache n  考虑将复杂的写入过程做成Pub/Sub模式 n  应对需求变更 n  隔离程序复杂度 n  n  Schema free n  n  n  n  AJAX Javascript去
  57. 57. + Q&A

×