偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

把MongoDB當成純內存數(shù)據庫使用

數(shù)據庫 其他數(shù)據庫 數(shù)據庫運維 MongoDB
將MongoDB用作內存數(shù)據庫(in-memory database),也即,根本就不讓MongoDB把數(shù)據保存到磁盤中的這種用法,引起了越來越多的人的興趣。

這種用法對于以下應用場合來講,超實用:

置于慢速RDBMS系統(tǒng)之前的寫操作密集型高速緩存

嵌入式系統(tǒng)

無需持久化數(shù)據的PCI兼容系統(tǒng)

需要輕量級數(shù)據庫而且?guī)熘袛?shù)據可以很容易清除掉的單元測試(unit testing)

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

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

實現(xiàn)方法

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

  1. # mkdir /ramdata 
  2. # mount -t tmpfs -o size=16000M tmpfs /ramdata/ 
  3. # df 
  4. Filesystem           1K-blocks      Used Available Use% Mounted on 
  5. /dev/xvde1             5905712   4973924    871792  86% / 
  6. none                  15344936         0  15344936   0% /dev/shm 
  7. tmpfs                 16384000         0  16384000   0% /ramdata 

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

  1. dbpath=/ramdata 
  2. nojournal = true 
  3. smallFiles = true 
  4. noprealloc = true 

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

  1. # mongo 
  2. MongoDB shell version: 2.3.2 
  3. connecting to: test 
  4. > db.test.insert({a:1}) 
  5. > db.test.find() 
  6. { "_id" : ObjectId("51802115eafa5d80b5d2c145"), "a" : 1 } 
  7. # ls -l /ramdata/ 
  8. total 65684 
  9. -rw-------. 1 root root 16777216 Apr 30 15:52 local.0 
  10. -rw-------. 1 root root 16777216 Apr 30 15:52 local.ns 
  11. -rwxr-xr-x. 1 root root        5 Apr 30 15:52 mongod.lock 
  12. -rw-------. 1 root root 16777216 Apr 30 15:52 test.0 
  13. -rw-------. 1 root root 16777216 Apr 30 15:52 test.ns 
  14. drwxr-xr-x. 2 root root       40 Apr 30 15:52 _tmp 

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

  1. > str = "" 
  2. > aaa = "aaaaaaaaaa" 
  3. aaaaaaaaaa 
  4. > for (var i = 0; i < 100; ++i) { str += aaa; } 
  5. > for (var i = 0; i < 4000000; ++i) { db.foo.insert({a: Math.random(), s: str});} 
  6. > db.foo.stats() 
  7.         "ns" : "test.foo", 
  8.         "count" : 4000000, 
  9.         "size" : 4544000160, 
  10.         "avgObjSize" : 1136.00004, 
  11.         "storageSize" : 5030768544, 
  12.         "numExtents" : 26, 
  13.         "nindexes" : 1, 
  14.         "lastExtentSize" : 536600560, 
  15.         "paddingFactor" : 1, 
  16.         "systemFlags" : 1, 
  17.         "userFlags" : 0, 
  18.         "totalIndexSize" : 129794000, 
  19.         "indexSizes" : { 
  20.                 "_id_" : 129794000 
  21.         }, 
  22.         "ok" : 1 

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

  1. # echo 3 > /proc/sys/vm/drop_caches  
  2. # free 
  3.              total       used       free     shared    buffers     cached 
  4. Mem:      30689876    6292780   24397096          0       1044    5817368 
  5. -/+ buffers/cache:     474368   30215508 
  6. Swap:            0          0          0 

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

  1. > db.foo.find().itcount() 
  2. 4000000 
  3. # free 
  4.              total       used       free     shared    buffers     cached 
  5. Mem:      30689876    6327988   24361888          0       1324    5818012 
  6. -/+ buffers/cache:     508652   30181224 
  7. Swap:            0          0          0 
  8. # ls -l /ramdata/ 
  9. total 5808780 
  10. -rw-------. 1 root root  16777216 Apr 30 15:52 local.0 
  11. -rw-------. 1 root root  16777216 Apr 30 15:52 local.ns 
  12. -rwxr-xr-x. 1 root root         5 Apr 30 15:52 mongod.lock 
  13. -rw-------. 1 root root  16777216 Apr 30 16:00 test.0 
  14. -rw-------. 1 root root  33554432 Apr 30 16:00 test.1 
  15. -rw-------. 1 root root 536608768 Apr 30 16:02 test.10 
  16. -rw-------. 1 root root 536608768 Apr 30 16:03 test.11 
  17. -rw-------. 1 root root 536608768 Apr 30 16:03 test.12 
  18. -rw-------. 1 root root 536608768 Apr 30 16:04 test.13 
  19. -rw-------. 1 root root 536608768 Apr 30 16:04 test.14 
  20. -rw-------. 1 root root  67108864 Apr 30 16:00 test.2 
  21. -rw-------. 1 root root 134217728 Apr 30 16:00 test.3 
  22. -rw-------. 1 root root 268435456 Apr 30 16:00 test.4 
  23. -rw-------. 1 root root 536608768 Apr 30 16:01 test.5 
  24. -rw-------. 1 root root 536608768 Apr 30 16:01 test.6 
  25. -rw-------. 1 root root 536608768 Apr 30 16:04 test.7 
  26. -rw-------. 1 root root 536608768 Apr 30 16:03 test.8 
  27. -rw-------. 1 root root 536608768 Apr 30 16:02 test.9 
  28. -rw-------. 1 root root  16777216 Apr 30 15:52 test.ns 
  29. drwxr-xr-x. 2 root root        40 Apr 30 16:04 _tmp 
  30. # df 
  31. Filesystem           1K-blocks      Used Available Use% Mounted on 
  32. /dev/xvde1             5905712   4973960    871756  86% / 
  33. none                  15344936         0  15344936   0% /dev/shm 
  34. tmpfs                 16384000   5808780  10575220  36% /ramdata 

果不其然! :)

復制(replication)呢?

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

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

oplogSize = 1000

分片(sharding)呢?

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

注意事項

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

使用usePowerOf2Sizes選項對存儲bucket進行規(guī)范化

定期運行compact命令或者對節(jié)點進行重新同步(resync)

schema的設計要相當規(guī)范化(以避免出現(xiàn)大量比較大的document)

結論

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

原文鏈接:http://www.oschina.net/translate/how-to-use-mongodb-as-a-pure-in-memory-db-redis-style

【編輯推薦】

1.MeayunDB嵌入式極速內存數(shù)據庫介紹

責任編輯:彭凡 來源: OSCHINA
相關推薦

2014-02-27 10:08:33

NoSQL

2019-08-15 07:00:54

SQLite數(shù)據庫內存數(shù)據庫

2025-01-03 08:13:08

2011-03-17 13:20:43

Java數(shù)據庫Derby

2022-04-05 11:24:17

CyberDB內存數(shù)據庫Python

2011-04-14 09:38:55

內存數(shù)據庫

2011-04-14 09:27:37

內存數(shù)據庫

2022-12-07 18:45:22

內存數(shù)據庫Redis

2011-03-03 13:13:51

DelphiSQLite加密

2020-07-06 14:20:43

MongoDB數(shù)據庫安全

2011-03-23 17:10:41

ACCESSSQL數(shù)據庫

2011-08-24 13:10:48

MongoDBUpdate

2019-08-20 14:02:07

MongoDB數(shù)據庫恢復數(shù)據

2021-08-04 09:00:53

Python數(shù)據庫Python基礎

2019-11-04 12:51:48

mysql數(shù)據庫nnodb

2022-03-10 09:08:43

數(shù)據庫Mongodb數(shù)據庫轉

2011-03-23 11:11:17

圖片數(shù)據庫

2010-05-26 09:44:41

MySQL數(shù)據庫使用

2015-12-21 16:59:16

2010-07-28 11:27:10

DB2數(shù)據庫
點贊
收藏

51CTO技術棧公眾號