Mongdb的優點:一、快速!擁有適量級內存的Mongdb的性能是很是迅速的,它將熱數據存儲在物理內存中(而不只僅是索引和少部分數據),使得熱數據的讀寫變得十分快速,從而提升了總體的速度和效率。
二、高擴展性!Mongdb的高可用與集羣架構擁有十分高效的擴展性,經過物理機器的增長,以及sharding的增長,Mongdb的擴展將達到一個十分驚人的地步。
三、自身的Failover!Mongdb的副本集配置中,當主庫遇到問題,沒法繼續提供服務的時候,副本集將選舉出一個新的主庫來繼續提供服務。
四、Json的存儲格式!Mongdb和Bson存儲格式十分適合文檔格式的存儲和查詢。
MongoDB 的劣勢:不支持事務操做(最主要的缺點)、MongoDB 佔用空間過大、MongoDB 沒有如 MySQL 那樣成熟的維護工具。
Redis:內存數據庫,持久化方式:Redis全部數據庫都是放在內存中的,持久化是使用RDB方式或AOF方式。linux
當物理內存夠用的時候,Redis > MongoDB > MySQL
當物理內存不夠用的時候,Redis 和 MongoDB 都會使用虛擬內存。
實際上若是Redis要開始虛擬內存,那很明顯要麼加內存條,要麼你就該換個數據庫了。
可是,MongoDB 不同,只要業務上能保證冷熱數據的讀寫比,使得熱數據在物理內存中 mmap 的交換較少,MongoDB 仍是可以保證性能。有人使用 MongoDB 存儲了上T的數據。
MySQL,MySQL根本就不須要擔憂數據量跟內存下的關係。不過,內存的量跟熱數據的關係會極大地影響性能表現。
當物理內存和虛擬內存都不夠用的時候,估計除了 MySQL 你沒什麼好選擇了。
其實,從數據存儲原理來看,我更傾向於將 MongoDB 歸類爲硬盤數據庫,可是使用了 mmap 做爲加速的手段而已。
MongoDB 與 MySQL 命令對比
傳統的關係數據庫通常由數據庫(database)、表(table)、記錄(record)三個層次概念組成,MongoDB 是由數據庫(database)、集合(collection)、文檔對象(document)三個層次組成。MongoDB對於關係型數據庫裏的表,可是集合中沒有列、行和關係概念,這體現了模式自由的特色。
MongoDB (文檔型數據庫):提供可擴展的高性能數據存儲
一、基於分佈式文件存儲
二、高負載狀況下添加更多節點,能夠保證服務器性能
三、將數據存儲爲一個文檔
MongoDB 與 MySQL 的比較
一、穩定性
二、索引,索引放在內存中,可以提高隨機讀寫的性能。若是索引不能徹底放在內存,一旦出現隨機讀寫比較高的時候,就會頻繁地進行磁盤交換,MongoDB 的性能就會急劇降低
三、佔用的空間很大,由於它屬於典型空間換時間原則的類型。那麼它的磁盤空間比普通數據庫會浪費一些,並且到目前爲止它尚未實如今線壓縮功能,
在 MongoDB 中頻繁的進行數據增刪改時,若是記錄變了,例如數據大小發生了變化,這時候容易產生一些數據碎片,出現碎片引起的結果,一個是索引會出現性能問題,另一個就是在必定的時間後,所佔空間會莫明其妙地增大,因此要按期把數據庫作修復,按期從新作索引,這樣會提高MongoDB 的穩定性和效率。在最新的版本里,它已經在實如今線壓縮,估計應該在2.0版左右,應該可以實如今線壓縮,能夠在後臺執行如今repair DataBase 的一些操做。若是那樣,就解決了目前困擾咱們的大問題。
四、MongoDB 對數據間的事務關係支持比較弱
五、運維不方便
MongoDB 相對於 MySQL 的優點web
MongoDB 更相似 MySQL,支持字段索引、遊標操做,其優點在於查詢功能比較強大,擅長查詢 JSON 數據,能存儲海量數據,可是不支持事務。
MySQL 在大數據量時效率顯著降低,MongoDB 更多時候做爲關係數據庫的一種替代。
內存管理機制
Redis 數據所有存在內存,按期寫入磁盤,當內存不夠時,能夠選擇指定的 LRU 算法刪除數據。
MongoDB 數據存在內存,由 linux系統 mmap 實現,當內存不夠時,只將熱點數據放入內存,其餘數據存在磁盤。
支持的數據結構
Redis 支持的數據結構豐富,包括hash、set、list等。
MongoDB 數據結構比較單一,可是支持豐富的數據表達,索引,最相似關係型數據庫,支持的查詢語言很是豐富。
集羣:MongoDB 集羣技術比較成熟,Redis從3.0開始支持集羣。兩者都可支持持久化。
不適用場景:一、須要使用複雜sql的操做;二、事務性系統;算法
MySQL 是持久化存儲,存放在磁盤裏面,檢索的話,會涉及到必定的 IO,爲了解決這個瓶頸,因而出現了緩存,好比如今用的最多的 memcached(簡稱mc)。首先,用戶訪問mc,若是未命中,就去訪問 MySQL,以後像內存和硬盤同樣,把數據複製到mc一部分。Redis 和mc都是緩存,而且都是駐留在內存中運行的,這大大提高了高數據量web訪問的訪問速度。然而mc只是提供了簡單的數據結構,好比 string存儲;Redis卻提供了大量的數據結構,好比string、list、set、hashset、sorted set這些,這使得用戶方便了好多,畢竟封裝了一層實用的功能,同時實現了一樣的效果,固然用Redis而慢慢捨棄mc。
內存和硬盤的關係,硬盤放置主體數據用於持久化存儲,而內存則是當前運行的那部分數據,CPU訪問內存而不是磁盤,這大大提高了運行的速度,固然這是基於程序的局部化訪問原理。
推理到 Redis + MySQL,它是內存+磁盤關係的一個映射,MySQL 放在磁盤,Redis放在內存,這樣的話,web應用每次只訪問Redis,若是沒有找到想要的數據,纔去訪問 MySQL。
然而 Redis + MySQL 和內存+磁盤的用法最好是不一樣的。
前者是內存數據庫,數據保存在內存中,固然速度快。
後者是關係型數據庫,功能強大,數據訪問也就慢。
像memcache,MongoDB,Redis,都屬於No SQL系列。
不是一個類型的東西,應用場景也不太同樣,仍是要看你的需求來決定。sql
LVS的優勢:抗負載能力強,工做在第4層僅作分發之用,沒有流量產生,這也決定了它在負載均衡軟件裏的性能最強,同時保證了均衡器的IO性能不會受大流量的影響。工做穩定,自身有完整的雙機熱備方案,如LVS+Keepalived和LVS+Hear+Beat;應用範圍廣,能夠對全部應用作負載均衡,配置性能低,不須要太多的接觸,大大減小了人爲出錯的概率。
LVS的缺點:軟件自己不支持正則,不能作動靜分離,若網站應用較龐大,LVS+Keepalived就較複雜。
Nginx的優勢:工做在第7層,能夠針對http應用作一些分流的策略,好比針對域名,目錄結構等,它的正則比Haproxy更強大靈活;對網絡依賴小,理論上能ping通就能進行負載功能,安裝和配置較簡單,測試較方便,能夠承擔高的負載壓力且穩定,通常能支撐超過幾萬次的併發量;能夠經過端口檢測到服務器內部故障,如根據服務器處理網頁返回的狀態碼,超時等等;且會把返回錯誤的請求從新提交到另外一個節點;同時是功能強大的web應用服務器,在處理靜態頁面、抗高併發方面相對Apache有優點。
Nginx的缺點:不支持url來檢測,僅支持http、https和email,好比用戶正在上傳一個文件,而處理該上傳的節點恰好在上傳過程當中出現故障,Nginx會把上傳切到另外一臺服務器從新處理,而LVS就直接斷掉了,若是是上傳一個很大的文件或者很重要的文件的話,用戶可能會所以而不滿。Nginx和Session的保持,Cookie的引導能力較弱。
Haproxy的優勢:一、HAProxy是支持虛擬主機的,能夠工做在四、7層(支持多網段);二、HAProxy的優勢可以補充Nginx的一些缺點,好比支持Session的保持,Cookie的引導;同時支持經過獲取指定的url來檢測後端服務器的狀態。三、HAProxy跟LVS相似,自己就只是一款負載均衡軟件;單純從效率上來說HAProxy會比Nginx有更出色的負載均衡速度,在併發處理上也是優於Nginx的。 四、HAProxy支持TCP協議的負載均衡轉發,能夠對MySQL讀進行負載均衡,對後端的MySQL節點進行檢測和負載均衡,你們能夠用LVS+Keepalived對MySQL主從作負載均衡。
Haproxy的缺點:不支持POP/SMTP協議;不支持HTTP cache功能。如今很多開源的lb項目,都或多或少具有HTTP cache功能; 重載配置的功能須要重啓進程,雖然也是soft restart,但沒有Nginx的reaload更爲平滑和友好;多進程模式支持不夠好。數據庫