MongoDB使用技術點的總結

一:MongoDB內容  

    1)NoSQL的興起:查找網頁

    2)各種nosql數據庫介紹

    3)MongoDB的特點

    4)傳統的數據庫:SQL server ,Oracle,mysql

1. nosql的運動背景:

        web2.0的異軍突起,傳統的關係數據庫爲了保證“通用性”的設計而帶來的功能複雜,性能開銷大,價格昂貴的問題。

        避免不需要的複雜性

        更高的吞吐量,高併發

        在商用硬件上的水平擴展能力

        NOSQL實現了大表的自動分割功能,更好的支持可靠性之間的折中

        雲計算的需求(從中心模式轉到分佈模式)

2.各種nosql數據庫接收-memcached

    1)一個存儲鍵/值對的hashmap

    2)高性能的分佈式內存緩存服務器,用於動態Web應用以減輕數據庫負載

    3)客戶端通過memcache協議與守護進程通信

    4)缺乏認證基於安全管制

    5)協議簡單

    6)基於libevent的時間處理(I/O處理性能好,IO是基於libevent的,是以異步事件處理機制)

    7)內置內存通信的方式

    8)不互相通信的分佈式(服務器之間互補通信,數據是基於客戶端的)

3.各種redis數據庫介紹-redis

    1)一個key-value存儲系統,和Memcached類似

    2)運行異常快

    3)數據都是緩存在內存中,有硬盤存儲支持的內存數據庫

    4)Master-slave複製

    5)value數據庫類型豐富,string(字符串),list(鏈表),set(集合)和zet(有序集合)

    6)支持push/pop,允許用戶實現消息機制

4.各種nosql數據庫介紹-neo4j

1)基於關係的圖形數據庫

2)協議:HTTP/REST

    3) 可獨立使用或嵌入到Java應用程序

    4)圖形的節點和邊都可以帶有元數據

    5)使用多種算法支持路徑搜索

    6)使用鍵值和關係進行搜索

    7)爲讀操作進行優化

    8)支持事物(用java api)

    9)企業版支持在線備份,高級監控及高可靠性

5.各種nosql數據庫介紹-HBase

    1)Hadoop Database,是Google Bigtable的開源實現

    2)分佈式的,面向列的開源數據庫。在Hadoop智商提供了類似於Bigtable的能力

    3)HBase利用Hadoop HDFS作爲其文件存儲系統,利用Hadoop MapReduce來處理HBase中的海數據

    4)採用分佈式架構師Map/ReduceREST,

    5)協議:HTTP/支持thrift

    6)支持數十億行X上百萬列

7)最佳應用場景:使用與偏好BigTable,並且需要對大數據隨機,實時訪問的場合

6)MongoDB特點

    1)社區活躍,文檔豐富,又10gen商業支持,持續性有保障

    2)所用語言:C++

    3)特點:保留了SQL一些友好的特性(查詢,索引)

    4)協議:Custom,binary(BSON—)

    5)  Master/slave複製(支持自動錯誤恢復),使用sets複製)

    6)內建分片機制

    7)支持javascript表達式查詢

    8)可在服務器端執行任意的javascript函數

    9)在數據存儲時採用內存到文件映射

    10)對性能的關注超過對功能的要求

    11)在32位操作系統上,數據庫大小限制在約2.5Gb,64位系統數據庫大小無限制

    12)空數據庫約佔192Mb

    13)採用GridFS存儲大數據或元數據

14)讀寫都比較快

二:Mongodb和HBase的對比

第一點

  1. MongoDB bson文檔型數據庫,整個數據都存在磁盤中,Hbase是列式數據庫,集羣部署時每個familycolumn保存在單獨的hdfs文件中。

第二點

2.Mongodb 主鍵是“_id”,主鍵上面可以不建索引,記錄插入的順序和存放的順序一樣,hbase的主鍵就是row key,可以是任意字符串(最大長度是 64KB,實際應用中長度一般爲 10-100bytes),在hbase內部,row key保存爲字節數組。存儲時,數據按照Row key的字典序(byte order)排序存儲。設計key時,要充分排序存儲這個特性,將經常一起讀取的行存儲放到一起。

字典序對int排序的結果是1,10,100,11,12,13,14,15,16,17,18,19,2,20,21,…,9,91,92,93,94,95,96,97,98,99。要保持整形的自然序,行鍵必須用0作左填充。

第三點

3.Mongodb支持二級索引,而hbase本身不支持二級索引

第四點

4.Mongodb支持集合查找,正則查找,範圍查找,支持skip和limit等等,是最像MySQL的nosql數據庫,而hbase只支持三種查找:通過單個row key訪問,通過row key的range,全表掃描

第五點

5.mongodb的update是update-in-place,也就是原地更新,除非原地容納不下更新後的數據記錄。而hbase的修改和添加都是同一個命令:put,如果put傳入的row key已經存在就更新原記錄,實際上hbase內部也不是更新,它只是將這一份數據已不同的版本保存下來而已,hbase默認的保存版本的歷史數量是3。

第六點

6.mongodb的delete會將該行的數據標示爲已刪除,因爲mongodb在刪除記錄時並不是真把記錄從內存或文件中remove,而是將該刪除記錄數據置空(寫0或特殊數字加以標識)同時將該記錄所在地址放到一個list列表“釋放列表”中,這樣做的好就是就是如果有用戶要執行插入記錄操作時,mongodb會首先從該“釋放列表”中獲取size合適的“已刪除記錄”地址返回,這種方法會提升性能(避免了malloc內存操作),同時mongodb也使用了bucket size數組來定義多個大小size不同的列表,用於將要刪除的記錄根據其size大小放到合適的“釋放列表”中。Hbase的delete是先新建一個tombstonemarkers,然後讀的時候會和tombstonemarkers做merge,在 發生major compaction時delete的數據記錄纔會真真刪除。

第七點

7.mongodb和hbase都支持mapreduce,不過mongodb的mapreduce支持不夠強大,如果沒有使用mongodb分片,mapreduce實際上不是並行執行的

第八點

8.mongodb支持shard分片,hbase根據row key自動負載均衡,這裏shard key和row key的選取儘量用非遞增的字段,儘量用分佈均衡的字段,因爲分片都是根據範圍來選擇對應的存取server的,如果用遞增字段很容易熱點server的產生,由於是根據key的範圍來自動分片的,如果key分佈不均衡就會導致有些key根本就沒法切分,從而產生負載不均衡。

第九點

9.mongodb的讀效率比寫高,hbase默認適合寫多讀少的情況,可以通過hfile.block.cache.size配置,該配置storefile的讀緩存佔用Heap的大小百分比,0.2表示20%。該值直接影響數據讀的性能。如果寫比讀少很多,開到0.4-0.5也沒問題。如果讀寫較均衡,0.3左右。如果寫比讀多,果斷默認0.2吧。設置這個值的時候,你同時要參考hbase.regionserver.global.memstore.upperLimit,該值是memstore佔heap的最大百分比,兩個參數一個影響讀,一個影響寫。如果兩值加起來超過80-90%,會有OOM的風險,謹慎設置。

第十點

10.hbase採用的LSM思想(Log-Structured Merge-Tree),就是將對數據的更改hold在內存中,達到指定的threadhold後將該批更改merge後批量寫入到磁盤,這樣將單個寫變成了批量寫,大大提高了寫入速度,不過這樣的話讀的時候就費勁了,需要merge disk上的數據和memory中的修改數據,這顯然降低了讀的性能。mongodb採用的是mapfile+Journal思想,如果記錄不在內存,先加載到內存,然後在內存中更改後記錄日誌,然後隔一段時間批量的寫入data文件,這樣對內存的要求較高,至少需要容納下熱點數據和索引。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章