2014年4月9日 星期三

多語言維持 Polyglot Persistence

    Martin Fowler和Pramod Sadalage兩位是近來頗為暢銷的「NoSQL Distilled」一書的作者(國內有翻譯本,名稱為「搞懂NoSQL的15堂課」),在該書中,除了介紹NoSQL的概念及方法之外,在第十三章中還介紹了一個他們所推廣的理念:Polyglot Persistence

    Polyglot Persistence可翻譯為多語言維持,若單純從字面上很難馬上體會出它的意義,但其實更早之前,在2006年Neal Ford曾經創造了類似的「Polyglot Programming」一詞,他希望闡述一個概念,就是每種不同的程式語言皆有其最適合解決的問題類型,針對不同工作需求選擇對的程式語言,會比僅嚐試僅用單一程式語言來解決所有面臨的問題更具有生產力,因此針對此觀點,他提出了「Polyglot Programming」,建議應用程式應混合不同的程式語言來撰寫來發揮最大的效益;相同的,在數年後,Martin Fowler也針對更後端的資料庫技術,提出了「Polyglot Persistence」,用以打破SQL與NoSQL的界限以混合不同的資料庫系統,使用不同的工具到不同的目的;畢竟各式不同的資料庫原本就是設計用來解決不同的問題,若使用單一資料庫引擎來完成所有的需求通常會導致沒有效率的結果。

    以下的內容摘譯自2013年Martin Fowler於ThoughtWorks發表的簡報,原文位於:http://martinfowler.com/articles/nosql-intro-original.pdf


未來不應肓目的追求NoSQL
而是多語言堅持(Polyglot Persistence)

  1. 關聯式資料庫+SQL:


關聯式資料庫+SQL已經統領了企業界的資料庫系統數十年了,大家樂於使用的原因是

安全穩定的儲存資料
    把資料存儲在硬碟中,允許程式或系統透過最標準化的語言SQL來對資料進行各種操作與查詢。

應用程式整合
    企業內部的應用桯式都需要共用及分享資訊,為了確保所有的程式都能存取資料庫取得所需的資訊,SQL能夠確保資料庫中儲存的資訊都是最新且能持續的提供服務。

標準化
    關聯式資料庫以及標準的SQL語法已經廣泛的被應用及瞭解,IT業界對於此類的資料庫系統相當熟稔依賴,不需要去學習新的資料庫系統。

資料一致性
    很多使用者可能會在同時間內存取相同的資料,因此關聯式資料庫提供了「交易」方式來確保資料的一致性。

報表呈現
    SQL的簡單資料模型以及標準化,使得各種匯總產生報表的工具皆使用SQL作為操作的基本工具。

以上這些傳統上原本由DBA(資料庫管理者)所負責的項目與特色,在NoSQL的世界裏,則附加在各自擁有不同特色的NoSQL之中。

  1. SQL唯一霸主的地位正動揺







同一個cluster中有這麼多台的主機,每一部主機都有不確定的因素(當機的風險),但因為同時間可提供服務的主機不止一台,所以整體的cluster是可信賴的,因為其它運作中的機器會cover當掉的機器。

目前流行的雲端技術就相當依賴scale horizontally,換而言之,傳統關聯式資料庫則無法適用於雲端的場合,唯有透過web services的方式,讓不同的程式選擇它們自已合適的資料庫,才能提供有效率的資料庫整合存取。

Google和Amazon是最早因需求而採用此類大型Cluster的廠商,所以它們不約而同都避免使用傳統關聯式資料庫,這種作法,給予了當時正萌芽的NoSQL社群相當大的鼓舞。

  1. 我們現在有了NoSQL

NoSQL這個名稱並沒有一個標準的解釋,最早是在2009年的一個研討會上出現,但更多的爭論主要在於「什麼類型的資料庫才能稱為NoSQL?」,因此,只要符合下列條件之一,我們便可稱它為NoSQL資料庫:

        • 不使用傳統的關聯式資料庫和SQL語法
        • 被設計適合用於cluster的環境
        • Open Source
        • 沒有固定的schema,允許儲存任何型式的資料

Google的Bigtable以及Amazon的SimpleDB運作於他們自己的雲端服務上,這兩種也屬於NoSQL資料庫。

  1. 透過NoSQL,我們可以

    • 降低開發階段的包袱
大部份開發階段的時間會花在關聯性資料庫的設計工作上,雖然透過一些物件或UML等開發工具可以減少loading,但針對資料庫的開發設計上還是需要大量的時間;事實上,我們可以根據不同的開發需求來選擇適合的資料庫來降低開發階段花在資料庫的時間;目前大部份專案仍使用傳統資料庫的原因在於開始時就沒有選擇資料庫的念頭,預設就是使用關聯資料庫,而不是基於最好的選擇,導致必須花更多的成本、開發時間、以及執行效能,以及用不到的功能。

    • 橫向擴展資料庫的能力
NoSQL可利用擴充主機的方式,來橫向擴展整體資料庫的空間(大至Petabytes等級)與運算能力,以因應龐大的資料量。


Example:

Guardian(英國衛報 guardian.co.uk)
在新的功能中採用了相當多的MongoDB NoSQL,他們發現MongoDB的文件儲存模式對於內部程式在進行資料交換時更為方便。
  • 降低開發階段的包袱

DNC(民主黨全國委員會)
若使用傳統關聯資料庫,要在超過三億投票人的資訊中搜尋某個人的地址、email、電是相當痛苦的等待,因此DNC使用MongoDB作為其投票人的資料儲存方式。
  • 降低開發階段的包袱 與 橫向擴展資料庫

Danish Health Care(丹麥的健保系統)
    原本所有的藥品處方資料都集中儲存於mySQL資料庫,但有鑑於資料庫的可用性和查詢回應時間,已將資料轉移至Riak資料庫。
  • 橫向擴展資料庫

McLaren(英國麥克拉倫集團,以方程式賽車知名)
    將每場賽車產生的大量資訊記錄至MongoDB以提供後端查詢分析
  • 橫向擴展資料庫

  1. 傳統SQL仍有存在價值


    • 部份功能非傳統的關聯式資料庫不可
相當多的資料類型仍適合使用表格模式的關聯式資料庫,特別是在僅需要提取一部份的數據並且根據不同的目的整合成不同的格式的情況下。

    • ACID類型的交易:
ACID指的是atomicity, consistency, isolation及durability這四大特性,SQL著重於滿足此四個特性,但NoSQL為了滿足橫向擴充的能力,對於ACID無法充分的滿足。

    • 第三方工具程式的支援
長期以來SQL支配著資料庫的使用,因此擁有大量的工具軟體可供使用,但其它種類的資料庫可使用的軟體則相當的少。

    • IT人員的熟稔度
NoSQL對於大部份的資訊人員來說還算是新的資料庫,一般都還不太熟悉它,因此也會避免在專案中使用此類陌生的技術。


  1. Polyglot Persistence多語言堅持


Polyglot Persistence就是同時併用不同的資料儲存技術,依據不同的程式需求來選擇適合的資料庫。例如,若有更合適的選擇,我們有需要在關聯式資料庫中儲存位元類型的圖片檔案嗎?因此,Polyglot Persistence可應用在系統中的多個不同程式,也可以應用在單一程式中需針對不同資料而進行的處理及儲存



下表是一個Web application假設性的案例,針對不同的用途而使用不同資料庫系統




  1. 導入Polyglot Persistence會面臨的挑戰

    • 決策
我們將面臨何種情境需要使用那類型的資料庫,而非與往常一樣僅使用關聯式資料庫。

    • 新技術的支援
NoSQL屬於新的技術,相關的支援與工具也不多,在導入時肯定會面臨到使用新技術的不熟悉、抗拒及無法避免的陷阱等等困境。

    • 組織變革
如果組織或專案中已有資料相關部門,那麼導入對他們的影響性為何?

    • 資料最終一致性的處理
NoSQL無法提供與關聯資料庫一樣的交易性資料變動,因此,如何來處理過時的資料?或者要如何來讓不同的系統之間讀取到一致性的資料?

  1. 那些類型的專案適合Polyglot Persistence?







  1. 結語


  隨著雲端技術的峰起雲湧,各類型的資料庫技術也隨之竄起,以因應各種不同使用情境的需求,以往企業獨尊SQL關聯式資料庫的情況已不適用於目前多樣化的環境。

現今企業面對的,是更為複雜的資訊環璄需求與眾多可供選擇的資料庫技術,傳統上僅使用單一資料庫技術的觀念將無法勝任如此變動的大環境,因此SQL傳統關聯式資料庫與MySQL之間的藩籬應被打破,企業針對不同的需求來選擇適合的資料庫技術,將不同的技術揉合在同一套系統中,這也是資訊部門需要因應環境改變而調整並進化的例子。

1 則留言: