單機MySQL的美好時代
初期架構 | centerhtml
若是知足了上述1 or 3個,則須要進化..java
後來,隨着訪問量的上升,幾乎大部分使用MySQL架構的網站在數據庫上都開始出現了性能問題,web程序再也不僅僅專一在功能上,同時也在追求性能。程序員們開始大量的使用緩存技術來緩解數據庫的壓力,優化數據庫的結構和索引。開始比較流行的是經過文件緩存來緩解數據庫壓力,可是當訪問量繼續增大的時候,多臺web機器經過文件緩存不能共享,大量的小文件緩存也帶了了比較高的IO壓力。mysql
在這個時候,Memcached就天然的成爲一個很是時尚的技術產品。nginx
Memcached
做爲一個獨立的分佈式的緩存服務器,爲多個web服務器提供了一個共享的高性能緩存服務,在Memcached服務器上,又發展了根據
hash
算法來進行多臺
Memcached
緩存服務的擴展,而後又出現了
一致性hash
來解決增長或減小緩存服務器致使從新
hash
帶來的大量緩存失效的弊端
Memcached
做爲一個獨立的分佈式的緩存服務器,爲多個web服務器提供了一個共享的高性能緩存服務,在Memcached服務器上,又發展了根據
hash
算法來進行多臺
Memcached
緩存服務的擴展,而後又出現了
一致性hash
來解決增長或減小緩存服務器致使從新
hash
帶來的大量緩存失效的弊端
Mysql主從讀寫分離
Memcached
只能緩解數據庫的讀取壓力。讀寫集中在一個數據庫上讓數據庫不堪重負,大部分網站開始使用主從複製技術來達到讀寫分離,以提升讀寫性能和讀庫的可擴展性。Mysql
的master-slave
模式成爲這個時候的網站標配了。 爲了容災備份,爲了混存數據,主從複製:主庫插一條數據,從庫也立刻插一條,讀寫分離:分表分庫+水平拆分+mysql集羣
在Memcached
的高速緩存,MySQL
的主從複製,讀寫分離的基礎之上,這時MySQL
主庫的寫壓力開始出現瓶頸,而數據量的持續猛增,因爲MyISAM
使用表鎖,在高併發下會出現嚴重的鎖問題,大量的高併發MySQL
應用開始使用InnoDB
引擎代替MyISAM。
程序員
同時,開始流行使用分表分庫(就是儘量的緊耦合把業務相關的分在一塊兒,好比說用戶的身份證號碼。註冊信息都是長期補變的,這些數據都是一些趨於冷的冷數據,因此通常狀況下這些長期不變的數據放在一塊兒庫,而一些高度活躍的數據放在一個庫,分表指的是一部分表和分庫是同樣的原理)來緩解寫壓力和數據增加的擴展問題。這個時候,分表分庫成了一個熱門技術,是面試的熱門問題也是業界討論的熱門技術問題。也就在這個時候,MySQL
推出了還不太穩定的表分區,這也給技術實力通常的公司帶來了但願。雖然MySQL
推出了MySQL Cluster(這個單詞就是集羣的意思)
集羣,但性能也不能很好知足互聯網的要求,只是在高可靠性上提供了很是大的保證web
MySQL的擴展性瓶頸
MySQL
數據庫也常常存儲一些大文本字段,致使數據庫表很是的大,在作數據庫恢復的時候就致使很是的慢,不容易快速恢復數據庫。好比1000
萬4KB
大小的文本就接近40GB
的大小,若是能把這些數據從MySQL
省去,MySQL
將變得很是的小。關係數據庫很強大,可是它並不能很好的應付全部的應用場景。MySQL
的擴展性差(須要複雜的技術來實現),大數據下IO
壓力大,表結構更改困難,正是當前使用MySQL
的開發人員面臨的問題。今天是什麼樣子
NoSQL(NoSQL = Not Only SQL )
,意即「不只僅是SQL」,
泛指非關係型的數據庫。隨着互聯網
web2.0
網站的興起,傳統的關係數據庫在應付
web2.0
網站,特別是超大規模和高併發的
SNS
類型的
web2.0
純動態網站已經顯得力不從心,暴露了不少難以克服的問題,而非關係型的數據庫則因爲其自己的特色獲得了很是迅速的發展。
NoSQL
數據庫的產生就是爲了解決大規模數據集合多重數據種類帶來的挑戰,尤爲是大數據應用難題。
大數據量高性能:NoSQL數據庫都具備很是高的讀寫性能(有一個數據是一秒鐘讀8萬,寫10萬),尤爲在大數據量下,一樣表現優秀。這得益於它的無關係性,數據庫的結構簡單。通常MySQL使用Query Cache(查詢緩存)
,每次表的更新Cache
就失效,是一種大粒度的Cache
,在針對web2.0
的交互頻繁的應用,Cache
性能不高。而NoSQL
的Cache
是記錄級的,是一種細粒度的Cache
,因此NoSQL
在這個層面上來講就要性能高不少了面試
多樣靈活的數據模型:NoSQL無需事先爲要存儲的數據創建字段,隨時能夠存儲自定義的數據格式。而在關係數據庫裏,增刪字段是一件很是麻煩的事情()。若是是很是大數據量的表,增長字段簡直就是一個噩夢,字段就是表的索引,由於在mysql中是表結構,而Nosql是字典結構。redis
NoSQL的
3V+3高(這個怎麼記憶,v描述的是數據多,高描述的是性能好,)想像一下的如今的數據是 類型多,數量大,實時性高(實時性不太容易想起來),性能表示的是高併發,高擴展,高性能。海量數據的應用(淘寶,微信,等等)
大數據時代的3V:算法
Volume、Variety、Velocity
。這3V
代表大數據的三方面特質:量大、多樣、實時。對,不光是數據量大了。對TB、PB數據級的處理,已經成爲基本配置。還能處理多樣性的數據類型,結構化數據和非結構化數據,能處理Web數據,能處理語音數據甚至是圖像、視頻數據。實時。之前的決策支持時代,能夠用批量處理的方式,隔夜處理數據,等決策者次日上班,能夠看到昨天的經營數據。但如今的互聯網時代,業務在24小時不間斷運營,決策已經不是次日上班才作出,而是在客戶每次瀏覽頁面,每次下訂單的過程當中都存在,都會須要對用戶進行實時的推薦,決策已經變得實時。sql
5代開發的緣由:爲了開放,讓用戶參與進來
NoSQL數據模型簡介
Tokyo Cabinet/Tyrant, Redis
, Voldemort, Oracle BDB
.CouchDB, MongoDb
. 國內也有文檔型數據庫SequoiaDB
,已經開源。Cassandra, HBase, Riak
.Neo4J, InfoGrid, Infinite Graph
.
SQL 和 NoSQL在分佈式數據庫中CAP原理CAP+BASE
SQL特性介紹
Rollback
)到事務開始前的狀態,就像這個事務歷來沒有執行過同樣。NoSQL特性介紹
CAP的3進2
CAP理論就是說在分佈式存儲系統中,最多隻能實現上面的兩點。
而因爲當前的網絡硬件確定會出現延遲丟包等問題,因此分區容忍性是咱們必須須要實現的。(這個是Nosql必須具有的)
因此咱們只能在一致性和可用性之間進行權衡,沒有NoSQL系統能同時保證這三點。
注:分佈式架構的時候必須作出取捨。一致性和可用性之間取一個平衡。多餘大多數web應用,其實並不須要強一致性。 所以犧牲C換取P,這是目前分佈式數據庫產品的方向。
一致性與可用性的決擇
經典CAP圖
BASE理論
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
擴起來的這些話來自 百度百科或者是維基百科,忘了
最終一致性根據更新數據後各進程訪問到數據的時間和方式的不一樣,又能夠區分爲:
- 因果一致性。若是進程A通知進程B它已更新了一個數據項,那麼進程B的後續訪問將返回更新後的值,且一次寫入將保證取代前一次寫入。與進程A無因果關係的進程C的訪問遵照通常的最終一致性規則。
- 「讀己之所寫(read-your-writes)」一致性。當進程A本身更新一個數據項以後,它老是訪問到更新過的值,毫不會看到舊值。這是因果一致性模型的一個特例。
- 會話(Session)一致性。這是上一個模型的實用版本,它把訪問存儲系統的進程放到會話的上下文中。只要會話還存在,系統就保證「讀己之所寫」一致性。若是因爲某些失敗情形令會話終止,就要創建新的會話,並且系統的保證不會延續到新的會話。
- 單調(Monotonic)讀一致性。若是進程已經看到過數據對象的某個值,那麼任何後續訪問都不會返回在那個值以前的值。
- 單調寫一致性。系統保證來自同一個進程的寫操做順序執行。要是系統不能保證這種程度的一致性,就很是難以編程了。
上述最終一致性的不一樣方式能夠進行組合,例如單調讀一致性和讀己之所寫一致性就能夠組合實現。而且從實踐的角度來看,這二者的組合,讀取本身更新的數據,和一旦讀取到最新的版本不會再讀取舊版本,對於此架構上的程序開發來講,會少不少額外的煩惱。
從服務端角度,如何儘快將更新後的數據分佈到整個系統,下降達到最終一致性的時間窗口,是提升系統的可用度和用戶體驗很是重要的方面。對於分佈式數據系統:
若是W+R>N,寫的節點和讀的節點重疊,則是強一致性。例如對於典型的一主一備同步複製的關係型數據庫,N=2,W=2,R=1,則無論讀的是主庫仍是備庫的數據,都是一致的。
若是W+R<=N,則是弱一致性。例如對於一主一備異步複製的關係型數據庫,N=2,W=1,R=1,則若是讀的是備庫,就可能沒法讀取主庫已經更新過的數據,因此是弱一致性。
對於分佈式系統,爲了保證高可用性,通常設置N>=3。不一樣的N,W,R組合,是在可用性和一致性之間取一個平衡,以適應不一樣的應用場景。
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
分佈式+集羣簡介
Rpc/Rmi
之間通訊和調用,對外提供服務和組內協做。