最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

將MongoDB作為Redis式的內(nèi)存數(shù)據(jù)庫的使用方法

 更新時間:2015年06月29日 15:16:41   投稿:goldensun  
這篇文章主要介紹了將MongoDB作為Redis式的內(nèi)存數(shù)據(jù)庫的使用方法,原理其實只是將內(nèi)存虛擬作為磁盤,需要的朋友可以參考下

 基本思想

將MongoDB用作內(nèi)存數(shù)據(jù)庫(in-memory database),也即,根本就不讓MongoDB把數(shù)據(jù)保存到磁盤中的這種用法,引起了越來越多的人的興趣。這種用法對于以下應用場合來講,超實用:

  •     置于慢速RDBMS系統(tǒng)之前的寫操作密集型高速緩存
  •     嵌入式系統(tǒng)
  •     無需持久化數(shù)據(jù)的PCI兼容系統(tǒng)
  •     需要輕量級數(shù)據(jù)庫而且?guī)熘袛?shù)據(jù)可以很容易清除掉的單元測試(unit testing)

如果這一切可以實現(xiàn)就真是太優(yōu)雅了:我們就能夠巧妙地在不涉及磁盤操作的情況下利用MongoDB的查詢/檢索功能??赡苣阋仓?,在99%的情況下,磁盤IO(特別是隨機IO)是系統(tǒng)的瓶頸,而且,如果你要寫入數(shù)據(jù)的話,磁盤操作是無法避免的。

MongoDB有一個非??岬脑O計決策,就是她可以使用內(nèi)存影射文件(memory-mapped file)來處理對磁盤文件中數(shù)據(jù)的讀寫請求。這也就是說,MongoDB并不對RAM和磁盤這兩者進行區(qū)別對待,只是將文件看作一個巨大的數(shù)組,然后按照字節(jié)為單位訪問其中的數(shù)據(jù),剩下的都交由操作系統(tǒng)(OS)去處理!就是這個設計決策,才使得MongoDB可以無需任何修改就能夠運行于RAM之中。

實現(xiàn)方法

這一切都是通過使用一種叫做tmpfs的特殊類型文件系統(tǒng)實現(xiàn)的。在Linux中它看上去同常規(guī)的文件系統(tǒng)(FS)一樣,只是它完全位于RAM中(除非其大小超過了RAM的大小,此時它還可以進行swap,這個非常有用!)。我的服務器中有32GB的RAM,下面讓我們創(chuàng)建一個16GB的 tmpfs:

復制代碼 代碼如下:
# mkdir /ramdata
# mount -t tmpfs -o size=16000M tmpfs /ramdata/
# df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/xvde1             5905712   4973924    871792  86% /
none                  15344936         0  15344936   0% /dev/shm
tmpfs                 16384000         0  16384000   0% /ramdata

接下來要用適當?shù)脑O置啟動MongoDB。為了減小浪費的RAM數(shù)量,應該把smallfiles和noprealloc設置為true。既然現(xiàn)在是基于RAM的,這么做完全不會降低性能。此時再使用journal就毫無意義了,所以應該把nojournal設置為true。

復制代碼 代碼如下:
dbpath=/ramdata
nojournal = true
smallFiles = true
noprealloc = true

MongoDB啟動之后,你會發(fā)現(xiàn)她運行得非常好,文件系統(tǒng)中的文件也正如期待的那樣出現(xiàn)了:

復制代碼 代碼如下:
# mongo
MongoDB shell version: 2.3.2
connecting to: test
> db.test.insert({a:1})
> db.test.find()
{ "_id" : ObjectId("51802115eafa5d80b5d2c145"), "a" : 1 }

# ls -l /ramdata/
total 65684
-rw-------. 1 root root 16777216 Apr 30 15:52 local.0
-rw-------. 1 root root 16777216 Apr 30 15:52 local.ns
-rwxr-xr-x. 1 root root        5 Apr 30 15:52 mongod.lock
-rw-------. 1 root root 16777216 Apr 30 15:52 test.0
-rw-------. 1 root root 16777216 Apr 30 15:52 test.ns
drwxr-xr-x. 2 root root       40 Apr 30 15:52 _tmp

現(xiàn)在讓我們添加一些數(shù)據(jù),證實一下其運行完全正常。我們先創(chuàng)建一個1KB的document,然后將它添加到MongoDB中4百萬次:

復制代碼 代碼如下:
> str = ""

> aaa = "aaaaaaaaaa"
aaaaaaaaaa
> for (var i = 0; i < 100; ++i) { str += aaa; }

> for (var i = 0; i < 4000000; ++i) { db.foo.insert({a: Math.random(), s: str});}
> db.foo.stats()
{
        "ns" : "test.foo",
        "count" : 4000000,
        "size" : 4544000160,
        "avgObjSize" : 1136.00004,
        "storageSize" : 5030768544,
        "numExtents" : 26,
        "nindexes" : 1,
        "lastExtentSize" : 536600560,
        "paddingFactor" : 1,
        "systemFlags" : 1,
        "userFlags" : 0,
        "totalIndexSize" : 129794000,
        "indexSizes" : {
                "_id_" : 129794000
        },
        "ok" : 1
}


可以看出,其中的document平均大小為1136字節(jié),數(shù)據(jù)總共占用了5GB的空間。_id之上的索引大小為130MB?,F(xiàn)在我們需要驗證一件 非常重要的事情:RAM中的數(shù)據(jù)有沒有重復,是不是在MongoDB和文件系統(tǒng)中各保存了一份?還記得MongoDB并不會在她自己的進程內(nèi)緩存任何數(shù)據(jù),她的數(shù)據(jù)只會緩存到文件系統(tǒng)的緩存之中。那我們來清除一下文件系統(tǒng)的緩存,然后看看RAM中還有有什么數(shù)據(jù):

復制代碼 代碼如下:
# echo 3 > /proc/sys/vm/drop_caches
# free
             total       used       free     shared    buffers     cached
Mem:      30689876    6292780   24397096          0       1044    5817368
-/+ buffers/cache:     474368   30215508
Swap:            0          0          0

可以看到,在已使用的6.3GB的RAM中,有5.8GB用于了文件系統(tǒng)的緩存(緩沖區(qū),buffer)。為什么即使在清除所有緩存之后,系統(tǒng)中仍然還有5.8GB的文件系統(tǒng)緩存??其原因是,Linux非常聰明,她不會在tmpfs和緩存中保存重復的數(shù)據(jù)。太棒了!這就意味著,你在RAM只有一份數(shù)據(jù)。下面我們訪問一下所有的document,并驗證一下,RAM的使用情況不會發(fā)生變化:

復制代碼 代碼如下:
> db.foo.find().itcount()
4000000

# free
             total       used       free     shared    buffers     cached
Mem:      30689876    6327988   24361888          0       1324    5818012
-/+ buffers/cache:     508652   30181224
Swap:            0          0          0
# ls -l /ramdata/
total 5808780
-rw-------. 1 root root  16777216 Apr 30 15:52 local.0
-rw-------. 1 root root  16777216 Apr 30 15:52 local.ns
-rwxr-xr-x. 1 root root         5 Apr 30 15:52 mongod.lock
-rw-------. 1 root root  16777216 Apr 30 16:00 test.0
-rw-------. 1 root root  33554432 Apr 30 16:00 test.1
-rw-------. 1 root root 536608768 Apr 30 16:02 test.10
-rw-------. 1 root root 536608768 Apr 30 16:03 test.11
-rw-------. 1 root root 536608768 Apr 30 16:03 test.12
-rw-------. 1 root root 536608768 Apr 30 16:04 test.13
-rw-------. 1 root root 536608768 Apr 30 16:04 test.14
-rw-------. 1 root root  67108864 Apr 30 16:00 test.2
-rw-------. 1 root root 134217728 Apr 30 16:00 test.3
-rw-------. 1 root root 268435456 Apr 30 16:00 test.4
-rw-------. 1 root root 536608768 Apr 30 16:01 test.5
-rw-------. 1 root root 536608768 Apr 30 16:01 test.6
-rw-------. 1 root root 536608768 Apr 30 16:04 test.7
-rw-------. 1 root root 536608768 Apr 30 16:03 test.8
-rw-------. 1 root root 536608768 Apr 30 16:02 test.9
-rw-------. 1 root root  16777216 Apr 30 15:52 test.ns
drwxr-xr-x. 2 root root        40 Apr 30 16:04 _tmp
# df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/xvde1             5905712   4973960    871756  86% /
none                  15344936         0  15344936   0% /dev/shm
tmpfs                 16384000   5808780  10575220  36% /ramdata

果不其然! :)

復制(replication)呢?

既然服務器在重啟時RAM中的數(shù)據(jù)都會丟失,所以你可能會想使用復制。采用標準的副本集(replica set)就能夠獲得自動故障轉(zhuǎn)移(failover),還能夠提高數(shù)據(jù)讀取能力(read capacity)。如果有服務器重啟了,它就可以從同一個副本集中另外一個服務器中讀取數(shù)據(jù)從而重建自己的數(shù)據(jù)(重新同步,resync)。即使在大量數(shù)據(jù)和索引的情況下,這個過程也會足夠快,因為索引操作都是在RAM中進行的 :)

有一點很重要,就是寫操作會寫入一個特殊的叫做oplog的collection,它位于local數(shù)據(jù)庫之中。缺省情況下,它的大小是總數(shù)據(jù)量的5%。在我這種情況下,oplog會占有16GB的5%,也就是800MB的空間。在拿不準的情況下,比較安全的做法是,可以使用oplogSize這個選項為oplog選擇一個固定的大小。如果備選服務器宕機時間超過了oplog的容量,它就必須要進行重新同步了。要把它的大小設置為1GB,可以這樣:

復制代碼 代碼如下:
oplogSize = 1000

分片(sharding)呢?

既然擁有了MongoDB所有的查詢功能,那么用它來實現(xiàn)一個大型的服務要怎么弄?你可以隨心所欲地使用分片來實現(xiàn)一個大型可擴展的內(nèi)存數(shù)據(jù)庫。配置服務器(保存著數(shù)據(jù)塊分配情況)還還是用過采用基于磁盤的方案,因為這些服務器的活動數(shù)量不大,老從頭重建集群可不好玩。
注意事項

RAM屬稀缺資源,而且在這種情況下你一定想讓整個數(shù)據(jù)集都能放到RAM中。盡管tmpfs具有借助于磁盤交換(swapping)的能力,但其性能下降將非常顯著。為了充分利用RAM,你應該考慮:

  •     使用usePowerOf2Sizes選項對存儲bucket進行規(guī)范化
  •     定期運行compact命令或者對節(jié)點進行重新同步(resync)
  •     schema的設計要相當規(guī)范化(以避免出現(xiàn)大量比較大的document)

結(jié)論

寶貝,你現(xiàn)在就能夠?qū)ongoDB用作內(nèi)存數(shù)據(jù)庫了,而且還能使用她的所有功能!性能嘛,應該會相當驚人:我在單線程/核的情況下進行測試,可以達到每秒20K個寫入的速度,而且增加多少個核就會再增加多少倍的寫入速度。

相關文章

  • Redis限流的幾種實現(xiàn)

    Redis限流的幾種實現(xiàn)

    面對越來越多的高并發(fā)場景,限流顯示的尤為重要,限流有許多種實現(xiàn)的方式,Redis具有很強大的功能,本文就詳細的介紹幾種方式,感興趣的可以了解一下
    2021-12-12
  • redis連接被拒絕的解決方案

    redis連接被拒絕的解決方案

    這篇文章主要介紹了redis連接被拒絕的解決方案,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • 使用redis獲取自增序列號實現(xiàn)方式

    使用redis獲取自增序列號實現(xiàn)方式

    這篇文章主要介紹了使用redis獲取自增序列號實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Redis 哨兵機制及配置實現(xiàn)

    Redis 哨兵機制及配置實現(xiàn)

    本文主要介紹了Redis 哨兵機制及配置實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 深入理解Redis哈希槽

    深入理解Redis哈希槽

    Redis哈希槽是RedisCluster中實現(xiàn)數(shù)據(jù)分片和負載均衡的核心機制,本文就來介紹一下Redis哈希槽,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-11-11
  • Redis的RDB持久化與AOF持久化詳解

    Redis的RDB持久化與AOF持久化詳解

    這篇文章主要介紹了Redis的RDB持久化與AOF持久化詳解,Redis是許多公司都在使用的一款高性能、非關系型數(shù)據(jù)庫,其中最為重要的一個特性就是它支持持久化,本文將深入介紹Redis持久化原理,包括RDB和AOF兩種方式的實現(xiàn),需要的朋友可以參考下
    2023-07-07
  • redis實現(xiàn)排行榜的簡單方法

    redis實現(xiàn)排行榜的簡單方法

    這篇文章主要給大家介紹了關于redis實現(xiàn)排行榜的簡單方法,文中通過示例代碼介紹的非常詳細,對大家學習或者使用redis具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-08-08
  • Redis高并發(fā)情況下并發(fā)扣減庫存項目實戰(zhàn)

    Redis高并發(fā)情況下并發(fā)扣減庫存項目實戰(zhàn)

    本文主要介紹了Redis高并發(fā)情況下并發(fā)扣減庫存項目實戰(zhàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-04-04
  • 關于Redis未授權(quán)訪問的問題

    關于Redis未授權(quán)訪問的問題

    這篇文章主要介紹了Redis未授權(quán)訪問的問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-07-07
  • SpringBoot 集成Redis 過程

    SpringBoot 集成Redis 過程

    redis是一個開源的、使用C語言編寫的、支持網(wǎng)絡交互的、可基于內(nèi)存也可持久化的Key-Value數(shù)據(jù)庫。本文給大家介紹SpringBoot 集成Redis 過程,感興趣的朋友一起看看吧
    2021-06-06

最新評論

铁岭县| 都兰县| 金华市| 甘泉县| 本溪市| 全南县| 宜州市| 耒阳市| 延长县| 安远县| 太原市| 海晏县| 滨州市| 建宁县| 白城市| 额济纳旗| 大冶市| 安吉县| 武强县| 福贡县| 长垣县| 青岛市| 手机| 霍邱县| 岳阳市| 林口县| 永兴县| 林芝县| 拜泉县| 唐河县| 三河市| 石棉县| 昂仁县| 封开县| 旬邑县| 威宁| 当雄县| 安庆市| 闻喜县| 诸暨市| 晋城|