前言
前面我們講了一些關於系統設計指標的一些基本概念,即可靠性,擴充套件性,易維護性。後面幾篇本文將從資料庫這個角度去介紹一些分布式系統的相關概念,主要介紹常用的一些資料庫相關的內容,包括單機的,分布式的,介紹一些他們各自的設計特性,設計模式等等。
關於資料庫
想象一下,如果你是乙個開發者,你面對乙個真實的世界,你需要做的就是將這個真實的世界結構化,如花,草,河流,大廈, 可以直接轉變為資料模型,像json, xml, kv, **關係,然後如何去選擇乙個合適的資料模型呢?然後如果作為乙個資料庫工程師,需要去想怎麼將這些資料模型在記憶體中,磁碟中,或則是在網路中進行呈現,而且還需要去允許這些資料用多種方式進行搜尋,查詢。乙個複雜的應用程式可能是有多個層次組成,他們通過api, 介面,驅動進行乙個各自的呼叫,隱藏了底層的實現的複雜性,不過他們的乙個核心觀點是需要乙個資料模型匹配。
資料 模型
sql vs nosql
sql這個資料模型第一次提出是在2023年,當時這還是一種理論觀點,人們都懷疑,這種資料模型的實現是否高效,最開始應用的是一些主要是在商業化的領域(銀行,航空公司),其實運用主要是應用事務。然後到了2023年中期,關係型資料庫已經成為大多數人選擇去儲存結構化資料庫的選擇,到目前為止關係型資料庫的優勢已經持續了30-40年,目前它依舊是最廣為人知的資料模型。
sql 資料模型(行資料模式):
sql資料庫: 關係如下,每個關係是乙個**,由多個行構成,每行包含多個屬性。
sql 在於有兩個非常重要的特性,事務和索引,索引是為了減少sql執行過程掃瞄的資料量,提高讀取效能,資料庫事務規定了各個資料庫操作的acid特性。
nsql出生
隨著社會的進步,社交,電商,物聯網慢慢應用到生活中,需要記錄的資料也是越來越多,面對的應用場景也越趨複雜,這對我們的系統提出了更多的挑戰,需要解決擴充套件性,併發,效能,資料模型嚴格等等問題,這時候大而全的關係型資料庫顯得有一些力不從心,我們不得不去考慮一些其他的資料模型和儲存系統,終於在2023年,nosql被提出來。
在提出來之後,開源社群已經產生了很多nosql資料庫,如hbase, mongdb,redis等等,他們有比關係性資料庫更好的擴充套件性,更容易儲存大量的資料集,和更高的寫入效能,以及弱化了資料庫正規化,當然並不是所有方面都優於關係型資料庫, 例如他們在事務支援,資料可靠性方面就低於mysql,oracle等關係型資料庫。
nosql資料庫: 大量使用的簡直模型,每行記錄由主鍵和值組成。不支援多表連線查詢,很多系統不支援二級索引。
其實,整體來說nosql只是對sql特性的一種取捨吧,使得sql能更好的面對海量資料,兩者的優勢都是不斷融合的,不存在取代的關係,對我們來說關係型資料庫很通用,是業界標準,但是存在一定場景的可擴充套件性和效能問題,這時nosql就有永無之地了,從學習來講我們應該更關注關係型資料庫的原理和nosql系統的高可用。
文件型資料庫
文件型資料庫設計去儲存,管理文件類似的半結構化資料,文件型資料庫也是nosql中的一種,還有一種xml資料庫,是屬於用xml格式儲存的文件型資料庫,目前文件型資料庫也越來越火,它可以去儲存json, xml。
文件型資料庫底層也是kv,它和其他kv不同在於,它的資料是經過處理的,然後儲存引擎在儲存的時候會去儲存一些meta資訊去優化資料的訪問。所有說文件型資料庫會對開發世界更友好,提供更好的資料模型。和關係型資料除了nosql相關差異,還有就是sql型資料庫會將不同的資料放到不同的資料表中,而文件性會是將所有資料都儲存在乙個collection中,每個物件都是不同的,這對於面對物件的語言開發會比較方便,然後文件資料庫最核心的就是文件,它功能是把接收到的資料進行乙個編碼,持久化,然後可以有多種儲存方式進行編碼,(感覺像是多種儲存引擎) 比如xml, yaml, json,bson,甚至是pdf,像mongdb這樣的更是實現了檔案儲存。
在關係型資料庫中處理多對多關係和join連線非常容易,但是文件型資料庫和nosql都重新開啟了乙個爭論,就是如何去解決這個問題,這個問題甚至比nosql出現更早,事實上,這相當於是回到了更早的計算機系統,不過現在的一些文件性資料庫已經盡力去解決這些問題了,像mongdb支援了reference, 再乙個就是大資料處理方面更是支援了如map-reduce的操作,可以在操作上更好的支援olap(online analytic processing)
文件型資料庫: 例如xml和json
列型資料庫
傳統的行式資料庫都是將完整的乙個個資料儲存在資料頁中,如果查詢需要用到大量的列,這種方式在oltp(online transactions processing )方式比較應用方便,但是在olap中,乙個資料庫查詢可能需要查詢幾百萬甚至是幾十億條資料行,而查詢往往是關心少數的列,比如說我想要查詢今年,銷售最好的幾款產品,那麼你就需要時間,商品名,和銷售量,而其他的像商品**,商品分類,規格資料列就沒有意義了,列資料庫將通乙個資料列放入一起,插入資料時,會放到不同的資料列中,然後資料查詢只需要查詢到需要查詢的幾個字段即可,其實就是走更少的資料頁,因此在olap場景中,大大的提高的查詢效率。
其實還有一些特性,像列資料庫會有很多的重複字段,像性別,年齡等等,列資料庫會把這些容易字段進行乙個壓縮,優化,這一點其實非常關鍵,一方面是加快查詢速度,第二是節省了儲存空間。(其實在關係型資料庫中,對這種很多重複字段,加索引其實很多時候是無用的,還會拖慢資料庫,像mysql優化器會直接走表掃瞄,而不是索引)
列資料庫:
其實資料如果說要join,就需要行儲存,如果需要進行聚合計算,就可以用列儲存。以前機器很貴,所有表需要把錶拆開,防止冗餘,現在機器更便宜了,資料多了就可以多買機器,然後join慢了就用半結構化資料,併發慢就用非同步複製,非強一致性的資料庫,現在甚至還有mapreduce的框架進行大資料計算了。
cassadra和hbase都是代表性的列式儲存,他們都是從google bigtable獲取靈感。
例:
關係型:
mysql , postgress, oracle, microsoft sql server, db2
非關係型:
k-v : memcached, redis, memcachedb
column-oriented: cassandra, hbase
document-oriented: mongdb, couchdb
graph-oriented: neo4j, inforgird
newsql :
spanner, tidb複製**
形形色色的排序
對於桶排序,其實非常簡單,只是需要用乙個一維陣列便可以解決。比如,我們需要對一串1 100範圍內的數進行排序,現在給出這樣的一串數 2,30,25,11,25 如果要對這五個數進行排序,我們首先就要開始構建出裝這些資料的桶,因為開始說了範圍為 1 100 所以我們需要 100個桶,但是為了方便桶的序...
形形色色的頂帖理由
小朋友 不頂是小狗!小學生 不頂進不了重點中學!初中生 不頂只有去念職高!高中生 不頂考不上好大學!大學生 不頂找不到好工作!碩士生 不頂只有去當博士!博士生 不頂只有去博物館!幼稚園阿姨 不頂只有去當服務員!小學老師 不頂只有去當幼稚園阿姨!中學老師 不頂不能帶重點班!大學助教 不頂評不上講師!大...
認識生活中形形色色感測器
生活中,有許多的感測器,我們會見到,不知不覺中,我們就在他們身邊,只是你不經心而已。好吧,來說說,都有啥吧。室內的溫濕度顯示表盤 儀盤等 當前溫度 濕度 這裡面有就有溫濕度感測器 廚房內,我們的煤氣洩漏報警器,有 有害氣體 危險氣體 感測器 當煤氣洩漏,他就會報警,滴滴滴。室外的,視窗或者觀測站,有...