Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

議程 • NoSQL 經驗 • MongoDB 2.2, 2.4, 2.6 • CouchDB 1.2 • Cassandra 0.6, 0.7, 1.0 • Riak 1.?

Slide 3

Slide 3 text

其實我只是想幹樵 MongoDB

Slide 4

Slide 4 text

NoSQL 前世今⽣生

Slide 5

Slide 5 text

No SQL Not Only SQL

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

戰勝國 • Edgar F. Codd: I don't use database often, but when I do, I always use RDBMS.

Slide 10

Slide 10 text

Relational Model

Slide 11

Slide 11 text

RDBMS/SQL • Atomicity • Consistency • Isolation • Durability

Slide 12

Slide 12 text

RDBMS 的問題 • 不是所有資料都是 Relational Model • Schema Migration: 會把整個 Table/DB 鎖住 • Hard to Scale Write.

Slide 13

Slide 13 text

中間(沒⼈人理的)戰爭 2000~?
 ObjectDB, XmlDB

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

前期參戰國 • Dynamo DB • Google AppEngine Datastore • Cassandra • CouchDB • MongoDB http://thechangelog.com/18/

Slide 16

Slide 16 text

• Amazon SimpleDB • Redis • Neo4j 前期參戰國

Slide 17

Slide 17 text

盟國 • Column Store: Cassandra, HBase • Document Store: CouchDB, MongoDB • Key-Value Store: DynamoDB, Redis, Riak • Graph Store: Neo4J

Slide 18

Slide 18 text

CAP

Slide 19

Slide 19 text

⼝口號: BASE • Basically Available • Soft State • Eventual consistency

Slide 20

Slide 20 text

好話說完了,要開幹了

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

Eventual Consistency? • Eventual inconsistency!! • ⼀一個確認的 Write 可能最終會消失!! • ⼀一個確認失敗的 Write 可能會跑出來!!

Slide 23

Slide 23 text

https://aphyr.com/posts/284-call-me-maybe-mongodb

Slide 24

Slide 24 text

⼤大家都說不會掉資料 • 實測結果 • MongoDB: 47% Acked Data Lost! • Riak: 91% Ack lost!, 0.3% Unack found! • Cassandra: 28% Ack lost! 
 Cassandra/CRDT: 0% lost

Slide 25

Slide 25 text

發⽣生了什麼事?! • 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 !!!

Slide 26

Slide 26 text

發⽣生了什麼事?! • 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/

Slide 27

Slide 27 text

發⽣生了什麼事?! • 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/

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

CRDT • Bank never deletes anything • https://www.youtube.com/watch?v=BGxnjKd4MFQ

Slide 31

Slide 31 text

Scalability? • 所有的 DB 都是實作⼀一樣的 Journal DB 機制。 • 所以所有的 DB 在 EC2 m1.large 上,都是 11,000 write/sec. (Riak: 我只有 4000w/s)

Slide 32

Slide 32 text

Scale Read • Shading. • Replication. • ⼤大家都做得很好.

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

Schema-less • Dynamic Language ⽤用起來很爽 • var tweets = db.find(….)
 for tweet in tweets:
 print tweet.text • 可是我們是寫 Java 的

Slide 39

Slide 39 text

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;

Slide 40

Slide 40 text

Schema-less • ⼤大多數時間造成的是危害不是好處

Slide 41

Slide 41 text

AdHoc Query • SQL 中好好⽤用。 • MongoDB 中可以⽤用 • Cassandra, Riak 中.... • CouchDB 有 MapReduce 可⽤用

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

MapReduce • Not Production Ready.

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

2nd Index. • Cassandra, Riak 對 AdHoc Query 的回應 • 每個結點⾃自⼰己 Index ⾃自⼰己的資料。 • 所以 Index 的⼤大⼩小是無限的。 • 結果變成能夠承受的 Query 總量,是固定的。

Slide 47

Slide 47 text

ACID 好好⽤用 • counter + 1 (NoSQL開始提供對單⼀一欄位操作) • 資料正確性 vs Availability. • Transaction • Data Consistency

Slide 48

Slide 48 text

MongoDB • 最熱⾨門的 NoSQL • ⽀支援 AdHoc Query • ⽀支援 Index on any field • ⽀支援 Sharding, Replication

Slide 49

Slide 49 text

MongoDB 缺點 • ⽂文件的 Size • Index 的 Size 驚⼈人 • 被 Index 有欄位⼤大⼩小的限制(1024 bytes) • 對變⾰革的適應能⼒力( 連結外部新來的資料或查 尋)

Slide 50

Slide 50 text

結語