先說寫,再說讀,最後說 數據一致性(data consistency)。node
cassandra對於 數據寫入,那是至關給方便的,比對 首長兒子還親呢, 寫的至關快,至關高效。
相比來講,關係型數據庫,對於數據 寫入,那就不那麼方便了。不方便的緣由呢,是由於 關係型 數據庫 爲了保持數據冗餘最少,它的表都是結構化的。舉例來講,一個產品的大小,形狀,價格,打折信息,分散在好多表裏面,你要想查詢一個產品的完整信息,得去好多表裏 拽數據。一樣由於如此,若是你要修改產品的信息,全部相關表,你都得通知到。這就跟你去政府部門辦事,要橫跨多個部門,這事能快得了嗎?
那麼cassandra爲何能快呢。由於它採起了這麼一個解決方案:
數據首先寫到 commit log, 而後寫到memtable。數據庫
幹完了這兩件事,寫就算成功了,別的事情您就不用操心了。app
由於它使用這個辦法,在寫的時候,只有不多量的 disk I/O,因此就很是快。
您這放鬆下來了,可是cassandra後臺還得忙活一陣子,主要忙活啥呢?
把放到memtable裏的數據,寫到硬盤上去,具體的說,是寫到SSTable裏面。這個事情,cassandra在後臺悄悄地幹,打槍的沒有。rest
幹完了這些事以後,後臺還有個事情要作,就是compaction,負責把sstable壓縮一下,減小點空間,這個在前面已經說過了。orm
在關係型數據庫裏,有個概念叫ACID。在cassandra裏,再也不嚴格的遵循ACID,可是它也有本身的事務機制。server
咱們逐個解釋一下:事務
Atomicity in Cassandra
關於原子性,cassandra是放在row level的,什麼意思呢?就是說針對一個給定的row key, 插入或者更新 columns,被視爲一次寫操做。
這裏說的是一個row,不是多個。
若是你同時操做多個row,cassandra並不負責一塊兒提交或者一塊兒回滾。因此你是有可能操做成功一部分row,失敗一部分row的,並不是同進同退。內存
同時,你們都知道,cassandra有不少副本(replica),它也不保證這些副本一塊兒成功或者一塊兒失敗。
你是徹底有可能一個節點成功,另外一個節點失敗的。ci
那麼一部分紅功了,一部分失敗了,到底算誰的呢?誰纔是 對呢?
cassandra是用timestamp來處理這個問題的。針對一個column的最近的操做(most recent update)勝出。誰的時間越晚,誰就是最終被採用的。rem
Tunable Consistency in Cassandra
你若是以爲上面說的方式不爽,好比說,你就堅信應該 不拋棄,不放棄,必須得同進同退,要麼同時成功,要麼同時失敗。
那麼cassandra也可讓你這麼作。
你能夠經過配置cassandra,達到 強一致性,這是能夠的。
Isolation in Cassandra
關於隔離性,在1.1以後,使用了 full row-levelisolation, row級別的隔離,這樣作的好處是:
so that writes to a row are isolated to the client performing the write and arenot
visible to any other user until they are complete.
當你在寫更新一個row的時候,使之與客戶端隔離,在更新操做完成以前,不向其餘用戶開放。
也就是說,我這個正在寫呢,別人不能讀,得等我寫好了,再讀。
從ACID的角度呢,這個算是AID。
Durability in Cassandra
關於持久性,是這麼說的
All writes to a replica node are recorded both in memory and in a commit logbefore
they are acknowledged as a success. If a crash or server failure occurs beforethe memory tables are flushed to disk,
the commit log is replayed on restart to recover any lost writes。
放在memory table的數據,最終會被刷到磁盤上,若是在刷以前,發生了宕機或者其餘錯誤,可使用commit log來恢復。
關於insert and update
cassandra 修改一個列族裏面的列的時候,首先得定位 它是哪個row的。
因此row key很重要,它必須是惟一的。這個看起來,和primarykey有點像。
可是cassandra裏面,若是你插入一個同名的row key,並不報錯,它會認爲是你是要更新原來的row key的記錄。
關於刪除。
刪除一個column,在cassandra裏面,跟原來關係型數據庫的概念不大同樣,主要有2個:
1.Deleted data is not immediately removed from disk
2.A deleted column can reappear if routine node repair is not run.
首先是被刪掉的數據,不會被立刻從硬盤裏刪掉。你們知道,數據在cassandra裏面,是放在SSTable裏面的。SSTable一旦寫入了,就是不可更改的。要刪除一個列,實際上會有一個 墓碑(tombstone)被寫進來,來證實這個列的狀態。
有了墓碑,就是等同於判了死刑,可是不會馬上執行,要到秋後處斬。
‘秋後’這個時間點,是你預先配置好的。(gc_grace_seconds)
其次是,若是分佈在環裏的某一個節點死了,並且死的時間特別長,長過秋後(gc_grace_seconds ),那麼這個節點就錯過了刪除列 這個事情,因此當它活過來以後,可能 被刪除的數據又從新出現了。
解決這個問題的辦法就是作regular node repair on every node。
常常清理,不要積壓問題,就不會形成這個困擾了。
關於讀
當一個請求過來,要讀取一個row的時候,這個row所須要的信息,可能要從許多SSTable和memtable來取。
從memtable來取,問題不大,由於在內存裏,速度沒問題。
從SSTable呢,就要斟酌一下,由於 它是存在磁盤上的。
好在cassandra有一個 Bloom filter, 這個東東就是專門用來判斷某個數據是否存在一個sstable的,若是不在,就不用浪費時間了。
因此讀也是挺快的。
關於數據一致性。
In Cassandra, consistency refers to how up-to-date and synchronized a row ofdata is on all of its replicas。
一致性說的是,你如何更新 分佈在全部副本里的一個row。
關於 write一致性:
這個咱們能夠舉個例子,假若有一個師,下轄 3個團,一個獨立營,共10個營。
你的做戰命令修改了,須要通知下去。
夥計們,要知道,戰場形勢瞬息萬變,耽誤一分鐘,就要死很多人。
理想的狀況是,10個營所有獲得通知之後,做戰命令才能執行,這會須要好久的時間,可是時間緊迫,要看你如何取捨了。
When you do a write in Cassandra, the consistency level specifies on how manyreplicas the write must succeed before
returning an acknowledgement to the client application.
The following consistency levels are available, with ANYbeing the lowest consistency (but highest availability), and ALL
being the highest consistency (but lowest availability). QUORUM is a goodmiddle-ground ensuring strong consistency,
yet still tolerating some level of failure.
cassandra提供了三個選擇:
1. any 只要一個節點被寫入了,就能夠認爲是成功。
2. all ,必需要所有節點,都通知到了,才能算是成功
3. quorum, 通知達到法定節點後就算成功。
對應於剛纔的例子,
第一個選擇是,只要做戰命令 達到一個營,就能夠執行,這種命令通常是什麼命令呢? 撤退! 跑掉一個算一個。
第二個選擇是,命令必須到達所有營,才能夠執行,這種命令是什麼呢? 多路圍攻,只要協同做戰,才能成功。
第三個選擇是,命令到達6個營便可,這種命令是什麼樣子的呢? 追擊敵人,只要有6個營收到命令,就能夠馬上追擊,以避免敵人跑掉。
爲何是6個呢?
A quorum is calculated as (rounded down to a whole number):
(replication_factor / 2) + 1
10/2+1 = 6
關於read一致性。
read和write基本是同樣的。
When you do a read in Cassandra, the consistency level specifies how manyreplicas must respond before a result is
returned to the client application.
The following consistency levels are available, with ONE being the lowestconsistency (but highest availability), and ALL
being the highest consistency (but lowest availability). QUORUM is a goodmiddle-ground ensuring strong consistency,
yet still tolerating some level of failure.
也是分爲三個級別,
1. one
2. quorum
3. all
意思也基本差很少。只是方向反了,此次是讀了。 對應上面的例子,能夠是這樣。 你這個師,由於指揮不當,被完全打殘廢了。 上面派人來收攏殘兵。 1. one說的是,只要接收到1個營的殘兵,就能夠 離開。 2. quorum說的是,必需要接收到6個營的殘兵,才能夠走。 3. ALL說的是,全部10個營的殘兵,必須所有接收到,才能夠離開。