NoSQL, Clojure
NoSQL
ACID
在傳統(tǒng)數(shù)據(jù)庫(kù)系統(tǒng)中,事務(wù)具有ACID屬性(Jim Gray在《事務(wù)處理:概念與技術(shù)》中對(duì)事務(wù)進(jìn)行了詳盡的討論)。
(1)原子性(Atomicity):事務(wù)是一個(gè)原子操作單元,其對(duì)數(shù)據(jù)的修改,要么全都執(zhí)行,要么全都不執(zhí)行。
(2)一致性(Consistent):在事務(wù)開(kāi)始和完成時(shí),數(shù)據(jù)都必須保持一致?tīng)顟B(tài)。這意味著所有相關(guān)的數(shù)據(jù)規(guī)則都必須應(yīng)用于事務(wù)的修改,以保持?jǐn)?shù)據(jù)的完整性;事務(wù)結(jié)束時(shí),所有的內(nèi)部數(shù)據(jù)結(jié)構(gòu)(如B樹(shù)索引或雙向鏈表)也都必須是正確的。
(3)隔離性(Isolation):數(shù)據(jù)庫(kù)系統(tǒng)提供一定的隔離機(jī)制,保證事務(wù)在不受外部并發(fā)操作影響的“獨(dú)立”環(huán)境執(zhí)行。這意味著事務(wù)處理過(guò)程中的中間狀態(tài)對(duì)外部是不可見(jiàn)的,反之亦然。
(4)持久性(Durable):事務(wù)完成之后,它對(duì)于數(shù)據(jù)的修改是永久性的,即使出現(xiàn)系統(tǒng)故障也能夠保持。
對(duì)于單個(gè)節(jié)點(diǎn)的事務(wù),數(shù)據(jù)庫(kù)都是通過(guò)并發(fā)控制(兩階段封鎖,two phase locking或者多版本,multiversioning)和恢復(fù)機(jī)制(日志技術(shù))保證事務(wù)的ACID特性。對(duì)于跨多個(gè)節(jié)點(diǎn)的分布式事務(wù),通過(guò)兩階段提交協(xié)議(two phase commiting)來(lái)保證事務(wù)的ACID。
可以說(shuō),數(shù)據(jù)庫(kù)系統(tǒng)是伴隨著金融業(yè)的需求而快速發(fā)展起來(lái)的。對(duì)于金融業(yè),可用性和性能都不是最重要的,而一致性是最重要的,用戶(hù)可以容忍系統(tǒng)故障而停止服務(wù),但絕不能容忍帳戶(hù)上的錢(qián)無(wú)故減少(當(dāng)然,無(wú)故增加是可以的)。而強(qiáng)一致性的事務(wù)是這一切的根本保證。
Data Replication
數(shù)據(jù)復(fù)制(data replication)屬于分布式計(jì)算的范疇,它并不僅僅局限于數(shù)據(jù)庫(kù),但這里主要是指分布式數(shù)據(jù)庫(kù)的復(fù)制。
在多副本構(gòu)成的分布式數(shù)據(jù)庫(kù)系統(tǒng)中,其事務(wù)特性與單個(gè)數(shù)據(jù)庫(kù)系統(tǒng)的差別主要表現(xiàn)在原子性和一致性?xún)蓚€(gè)方面。在原子性方面,要求同一分布式事務(wù)的所有操作在所有相關(guān)副本上要么提交,要么回滾,即除了保證原有的局部事務(wù)的原子性,還需要控制全局事務(wù)的原子性;在一致性方面,多副本之間需要保證單一副本一致性。
針對(duì)分布式事務(wù)的原子性和一致性這兩個(gè)復(fù)制協(xié)議中的核心問(wèn)題,經(jīng)過(guò)近20年的研究,人們提出了各種各樣的復(fù)制協(xié)議。這些協(xié)議在外在功能和內(nèi)部實(shí)現(xiàn)兩方面都有較大的差別。據(jù)此,我們可以從這兩個(gè)大的方面進(jìn)行分類(lèi)說(shuō)明。
從外在功能的角度看,可以從事務(wù)執(zhí)行的地點(diǎn)和時(shí)間兩個(gè)方面進(jìn)行分類(lèi)。從事務(wù)執(zhí)行的地點(diǎn),可以分為兩類(lèi):主從(Priamry/Copy)方式和更新所有(Update-Anywhere)方式。
前者的處理過(guò)程一般是系統(tǒng)中僅僅指定一個(gè)Primary節(jié)點(diǎn)接受更新請(qǐng)求,在事務(wù)操作執(zhí)行完畢后,在事務(wù)提交前或后將操作廣播到其他Copy節(jié)點(diǎn)。
后者的處理過(guò)程稍微復(fù)雜,系統(tǒng)中的任何副本具有相同的地位,都可以接收Update請(qǐng)求,在檢測(cè)事務(wù)沖突、事務(wù)提交前或后將各個(gè)節(jié)點(diǎn)的Update傳播到其他副本節(jié)點(diǎn)。
Primary/Copy方式并發(fā)控制較為簡(jiǎn)單,由Primary本地的事務(wù)控制即可實(shí)現(xiàn),事務(wù)原子性的實(shí)現(xiàn)也較為簡(jiǎn)單,一般由Primary節(jié)點(diǎn)作為協(xié)調(diào)節(jié)點(diǎn)來(lái)實(shí)現(xiàn)。但是,其缺陷也顯而易見(jiàn):僅僅單個(gè)節(jié)點(diǎn)提供Update請(qǐng)求處理能力,對(duì)于Update密集類(lèi)型的應(yīng)用,如OLTP,容易形成單點(diǎn)性能瓶頸。Update-Anywhere方式則與其相輔相成,可以通過(guò)多點(diǎn)提高事務(wù)吞吐率,但隨之而來(lái)的是多個(gè)分布式事務(wù)之間復(fù)雜的并發(fā)控制和原子性問(wèn)題。
從事務(wù)提交的時(shí)間點(diǎn)看,可以分為積極(Eager)和消極(Lazy)兩類(lèi)。其區(qū)別在于,前者是在事務(wù)提交前傳播更新,后者則是在提交之后才將事務(wù)操作傳播到其他副本。實(shí)際上,前者即通常所謂的同步復(fù)制(synchronous replication),后者即所謂的異步復(fù)制(asynchronous replication)。
異步復(fù)制的優(yōu)點(diǎn)是可以提高響應(yīng)速度,但犧牲了一致性,一般實(shí)現(xiàn)該類(lèi)協(xié)議的算法需要增加額外的補(bǔ)償機(jī)制。同步復(fù)制的優(yōu)點(diǎn)是可以保證一致性(一般通過(guò)兩階段提交協(xié)議),但是開(kāi)銷(xiāo)較大,可用性不好(參見(jiàn)CAP部分),帶來(lái)了更多的沖突和死鎖等問(wèn)題。值得一提的是Lazy+Primary/Copy的復(fù)制協(xié)議在實(shí)際生產(chǎn)環(huán)境中是非常實(shí)用的,MySQL的復(fù)制實(shí)際上就屬于這種。
CAP
在2000年的PODC(Principles of Distributed Computing)會(huì)議上,University of California, Berkeley的計(jì)算機(jī)科學(xué)教授Eric Brewer提出了著名的CAP理論。2002年,Seth Gilbert和Nancy Lynch證明了這一理論。CAP指的是:Consistency、Availability和Partition Tolerance。
(1)Consistency(一致性):一致性是指數(shù)據(jù)的原子性,這種原子性在經(jīng)典的數(shù)據(jù)庫(kù)中是通過(guò)事務(wù)來(lái)保證的,當(dāng)事務(wù)完成時(shí),無(wú)論其是成功還是回滾,數(shù)據(jù)都會(huì)處于一致的狀態(tài)。在分布式環(huán)境中,一致性是說(shuō)多個(gè)節(jié)點(diǎn)的數(shù)據(jù)是否一致。
(2)Availability(可用性):可用性是指服務(wù)能一直保證是可用的狀態(tài),當(dāng)用戶(hù)發(fā)出一個(gè)請(qǐng)求,服務(wù)能在有限時(shí)間內(nèi)返回結(jié)果。
(3)Partition Tolerance(分區(qū)容錯(cuò)性):Partition是指網(wǎng)絡(luò)的分區(qū)。可以這樣理解,一般來(lái)說(shuō),關(guān)鍵的數(shù)據(jù)和服務(wù)都會(huì)位于不同的IDC。
CAP理論告訴我們,一個(gè)分布式系統(tǒng)不可能同時(shí)滿(mǎn)足一致性,可用性和分區(qū)容錯(cuò)性這三個(gè)需求,三個(gè)要素中最多只能同時(shí)滿(mǎn)足兩點(diǎn)。三者不可兼顧,此所謂魚(yú)與熊掌不可兼得也!而對(duì)于分布式數(shù)據(jù)系統(tǒng)而言,分區(qū)容錯(cuò)性是基本要求,否則就不稱(chēng)其為分布式系統(tǒng)了。因此架構(gòu)設(shè)計(jì)師不要把精力浪費(fèi)在設(shè)計(jì)如何能同時(shí)滿(mǎn)足三者的完美分布式系統(tǒng)上,而是應(yīng)該進(jìn)行權(quán)衡取舍。這也意味著分布式系統(tǒng)的設(shè)計(jì)過(guò)程,也就是根據(jù)業(yè)務(wù)特點(diǎn)在C(一致性)和A(可用性)之間尋求平衡的過(guò)程,要求架構(gòu)師真正理解系統(tǒng)需求,把握業(yè)務(wù)特點(diǎn)。
BASE
BASE來(lái)自于互聯(lián)網(wǎng)的電子商務(wù)領(lǐng)域的實(shí)踐,它是基于CAP理論逐步演化而來(lái),核心思想是即便不能達(dá)到強(qiáng)一致性(Strong consistency),但可以根據(jù)應(yīng)用特點(diǎn)采用適當(dāng)?shù)姆绞絹?lái)達(dá)到最終一致性(Eventual consistency)的效果。BASE是Basically Available、Soft state、Eventually consistent三個(gè)詞組的簡(jiǎn)寫(xiě),是對(duì)CAP中C&A的延伸。BASE的含義:
(1)Basically Available:基本可用;
(2)Soft-state:軟狀態(tài)/柔性事務(wù),即狀態(tài)可以有一段時(shí)間的不同步;
(3)Eventual consistency:最終一致性;
BASE是反ACID的,它完全不同于A(yíng)CID模型,犧牲強(qiáng)一致性,獲得基本可用性和柔性可靠性并要求達(dá)到最終一致性。
CAP、BASE理論是當(dāng)前在互聯(lián)網(wǎng)領(lǐng)域非常流行的NoSQL的理論基礎(chǔ)。
NoSQL
NoSQL領(lǐng)域的相關(guān)知識(shí)點(diǎn)參見(jiàn)如下思維導(dǎo)圖:
參考
http://www.infoq.com/cn/articles/cap-twelve-years-later-how-the-rules-have-changed
http://www.cnblogs.com/hustcat/archive/2010/09/07/1820970.html
http://www.cnblogs.com/mmjx/archive/2011/12/19/2290540.html
http://blog.csdn.net/yangbutao/article/details/8365695
http://www.cnblogs.com/me115/p/3835050.html
12306
http://www.csdn.net/article/2015-02-10/2823900
技術(shù)揭秘12306改造
https://www.zhihu.com/question/21217971/answer/17575573
超級(jí)計(jì)算機(jī)能不能用于12306?
Clojure
Clojure是Lisp語(yǔ)言在JVM上的實(shí)現(xiàn)。源代碼以.clj為后綴。
官網(wǎng):
http://clojure.org/
Clojure的安裝主要有兩種方法:
1.
sudo apt-get install clojure1.6
2.Clojure的全部功能都被放在clojure-1.8.0.jar中,因此實(shí)際上并不需要安裝。所謂安裝,不過(guò)是下載jar,然后讓程序能夠找到j(luò)ar即可。因此,更好的辦法是利用我們下面提到的leiningen,自動(dòng)下載相關(guān)依賴(lài)。
leiningen
leiningen是Clojure的自動(dòng)管理工具。
官網(wǎng):
http://leiningen.org/
project.clj是Leigingen為項(xiàng)目添加的配置文件,類(lèi)似于Maven的pom.xml。
project.clj中可以定義項(xiàng)目所需的Clojure的版本,并自動(dòng)下載依賴(lài)。因此,很多Clojure項(xiàng)目在依賴(lài)上,往往只寫(xiě)leiningen和maven,根本就不提Clojure。這一點(diǎn)和其他編程語(yǔ)言,包括同為JVM語(yǔ)言的scala,還是差異挺大的。
Hello World
1.
lein new app hello
2.
cd hello
lein run
這里要注意路徑,一定要在project.cl所在的路徑下執(zhí)行l(wèi)ein命令,否則會(huì)報(bào)如下錯(cuò)誤:
No :main namespace specified in project.clj.
參見(jiàn):
https://tonydeng.github.io/2016/07/19/leiningen-clojure-hello-world/
JavaFX
JavaFX和Clojure的結(jié)合,本來(lái)不是什么新鮮的東西,然而由于相關(guān)環(huán)境(JDK、leiningen)的演進(jìn),網(wǎng)上的demo已經(jīng)大多不可用了。
這些變動(dòng)主要包括:
1.由于JDK7的較新版本之后,JavaFX已經(jīng)集成到JDK中,因此JavaFX的運(yùn)行時(shí)jar不再需要了。相關(guān)依賴(lài)需要去除。
2.由于leiningen新版本的改變,現(xiàn)在main函數(shù)必須在源代碼和工程文件中顯式定義。
代碼參見(jiàn):
https://github.com/antkillerfarm/antkillerfarm_rubbish/tree/master/clojure/javafx
總結(jié)
以上是生活随笔為你收集整理的NoSQL, Clojure的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 天池大赛, Storm
- 下一篇: word2vec, LSTM Speec