NoSQL 大腸花

2e147e13e3cf585a86626062d710a205?s=47 yunglin
January 17, 2015

NoSQL 大腸花

2e147e13e3cf585a86626062d710a205?s=128

yunglin

January 17, 2015
Tweet

Transcript

  1. NoSQL ⼤大腸花 何永琳
 ⼯工頭 @ Fliptop

  2. 議程 • NoSQL 經驗 • MongoDB 2.2, 2.4, 2.6 •

    CouchDB 1.2 • Cassandra 0.6, 0.7, 1.0 • Riak 1.?
  3. 其實我只是想幹樵 MongoDB

  4. NoSQL 前世今⽣生

  5. No SQL Not Only SQL

  6. 為什麼 SQL 變成 DB 的代名詞?

  7. 第⼀一次 DB ⼤大戰 1960s~1970s

  8. 參戰國 • Hierarchical model • Network model • Relational model

  9. 戰勝國 • Edgar F. Codd: I don't use database often,

    but when I do, I always use RDBMS.
  10. Relational Model

  11. RDBMS/SQL • Atomicity • Consistency • Isolation • Durability

  12. RDBMS 的問題 • 不是所有資料都是 Relational Model • Schema Migration: 會把整個

    Table/DB 鎖住 • Hard to Scale Write.
  13. 中間(沒⼈人理的)戰爭 2000~?
 ObjectDB, XmlDB

  14. 第⼆二次 DB ⼤大戰 2009~ 未完

  15. 前期參戰國 • Dynamo DB • Google AppEngine Datastore • Cassandra

    • CouchDB • MongoDB http://thechangelog.com/18/
  16. • Amazon SimpleDB • Redis • Neo4j 前期參戰國

  17. 盟國 • Column Store: Cassandra, HBase • Document Store: CouchDB,

    MongoDB • Key-Value Store: DynamoDB, Redis, Riak • Graph Store: Neo4J
  18. CAP

  19. ⼝口號: BASE • Basically Available • Soft State • Eventual

    consistency
  20. 好話說完了,要開幹了

  21. Eventual Consistency? • Eventual inconsistency!! • ⼀一個確認的 Write 可能最終會消失!!

  22. Eventual Consistency? • Eventual inconsistency!! • ⼀一個確認的 Write 可能最終會消失!! •

    ⼀一個確認失敗的 Write 可能會跑出來!!
  23. https://aphyr.com/posts/284-call-me-maybe-mongodb

  24. ⼤大家都說不會掉資料 • 實測結果 • MongoDB: 47% Acked Data Lost! •

    Riak: 91% Ack lost!, 0.3% Unack found! • Cassandra: 28% Ack lost! 
 Cassandra/CRDT: 0% lost
  25. 發⽣生了什麼事?! • Failover Strategy: MongoDB. • When Primary down, the

    secondary will become new Primary. When old Primary is back online, it will replay the op-log on old Primary.
 
 But it won’t most of time !!!
  26. 發⽣生了什麼事?! • Failover Strategy: Riak. • 由下 N 個結點接收 Write.

    如果 N 個寫⼊入成功, 就會回傳成功,但是回傳失敗,即使只有⼀一個 成功,最終,這⼀一個 Write 會被寫到 N 份去。
 • Conflict Resolution: 如果對同⼀一個 Key 的寫⼊入有 衝突,Riak會回傳多個值,由 Client 來判斷怎麼 取捨 http://blog.monitis.com/20123/14/an-overview-of-riak-an-open-source-nosql-database/
  27. 發⽣生了什麼事?! • Failover Strategy: Cassandra. • 由下 N 個結點接收 Write.

    如果 N 個寫⼊入成功,就會 回傳成功,但是回傳失敗,即使只有⼀一個成功,最終, 這⼀一個 Write 會被寫到 N 份去。
 • Conflict Resolution: 如果對同⼀一個 Key 的寫⼊入有衝突, Timestamp 最⼤大的會獲勝. • Timestamp 是個不可靠的數值,因為你不能保證 Cluster 中所有機器的時間都是同步的。 http://blog.monitis.com/20123/14/an-overview-of-riak-an-open-source-nosql-database/
  28. 教訓 • 不要對同⼀一值重覆寫⼊入。 • 使⽤用 Commutative Replicated Data Type, Command

    Query Responsibility Segregation Pattern 來寫程式
  29. 教訓 • 不要對同⼀一值重覆寫⼊入。 • 使⽤用 Commutative Replicated Data Type, Command

    Query Responsibility Segregation Pattern 來寫程式
  30. CRDT • Bank never deletes anything • https://www.youtube.com/watch?v=BGxnjKd4MFQ

  31. Scalability? • 所有的 DB 都是實作⼀一樣的 Journal DB 機制。 • 所以所有的

    DB 在 EC2 m1.large 上,都是 11,000 write/sec. (Riak: 我只有 4000w/s)
  32. Scale Read • Shading. • Replication. • ⼤大家都做得很好.

  33. Scale Write • MongoDB: 請叫我廢柴,無論開多少台,都是笑 能。

  34. Scale Write - Cassandra http://techblog.netflix.com/2011/11/benchmarking-cassandra-scalability-on.html

  35. Schema-less • Schema 真的是問題嗎?請再問你⾃自⼰己三遍 http://techblog.netflix.com/2011/11/benchmarking-cassandra-scalability-on.html

  36. Schema-less • Schema 真的是問題嗎?請再問你⾃自⼰己三遍 • Schema 的危害是,Migrate 時可能會把 DB 鎖住,

    造成 Downtime
 • Schema-less 要做 migration ,是在 code 中做 read-repair. • 所以說你的程式碼中要⼀一直有有 V1->V2, V2->V3, V3->V4…. 的 migration code. http://techblog.netflix.com/2011/11/benchmarking-cassandra-scalability-on.html
  37. Schema-less • Dynamic Language ⽤用起來很爽 • var tweets = db.find(….)


    for tweet in tweets:
 print tweet.text
  38. Schema-less • Dynamic Language ⽤用起來很爽 • var tweets = db.find(….)


    for tweet in tweets:
 print tweet.text • 可是我們是寫 Java 的
  39. Model class is Schema @Entity("employees") class Employee { // auto-generated,

    if not set (see ObjectId) @Id ObjectId id; // value types are automatically persisted String firstName, lastName; // only non-null values are stored Long salary = null; // by default fields are @Embedded Address address;
  40. Schema-less • ⼤大多數時間造成的是危害不是好處

  41. AdHoc Query • SQL 中好好⽤用。 • MongoDB 中可以⽤用 • Cassandra,

    Riak 中.... • CouchDB 有 MapReduce 可⽤用
  42. MapReduce?! • 把資料庫的所有物件,⼀一個個的拿出來看 • 挑想要的資料,佔存在 “某個地⽅方” • 然後再來 Reduce(Aggregate)

  43. MapReduce?! • 把資料庫的所有物件,⼀一個個的拿出來看 • 挑想要的資料,佔存在 “某個地⽅方” • 然後再來 Reduce(Aggregate) •

    所以 MongoDB 會要個 Write Lock !! 把 DB 鎖死
  44. MapReduce • Not Production Ready.

  45. 2nd Index. • Cassandra, Riak 對 AdHoc Query 的回應 •

    每個結點⾃自⼰己 Index ⾃自⼰己的資料。 • 所以 Index 的⼤大⼩小是無限的。
  46. 2nd Index. • Cassandra, Riak 對 AdHoc Query 的回應 •

    每個結點⾃自⼰己 Index ⾃自⼰己的資料。 • 所以 Index 的⼤大⼩小是無限的。 • 結果變成能夠承受的 Query 總量,是固定的。
  47. ACID 好好⽤用 • counter + 1 (NoSQL開始提供對單⼀一欄位操作) • 資料正確性 vs

    Availability. • Transaction • Data Consistency
  48. MongoDB • 最熱⾨門的 NoSQL • ⽀支援 AdHoc Query • ⽀支援

    Index on any field • ⽀支援 Sharding, Replication
  49. MongoDB 缺點 • ⽂文件的 Size • Index 的 Size 驚⼈人

    • 被 Index 有欄位⼤大⼩小的限制(1024 bytes) • 對變⾰革的適應能⼒力( 連結外部新來的資料或查 尋)
  50. 結語