如何設置一個可擴展的MongoDB數據庫?

如何設置一個可擴展的MongoDB數據庫?php

 

MongoDB是一款NoSQL數據庫,功能強大,諸如複製和內置分片,你能夠經過給服務器分佈內容,將數據庫擴展至任意多的服務器。前端

 

安裝與MongoDB有關的任何東西以前,咱們須要確認選擇了正確的硬件,並調試好了軟件。web

 

1.     硬盤驅動mongodb

若是你能夠選擇即將用到的硬件驅動,能夠將企業級雙SSD升級爲RAID1。正如咱們以前提到的,它性能卓越,節省費用。shell

 

Linux編輯你的/etc/fstab文件,並確保在將要和MongoDB使用的掛載點禁用「訪問時間logging」(access time logging)。在第4欄添加noatime 數據庫

 

從新掛接分區:安全

[root@mongodb1 ~]# mount -o remount /

 

驗證新的設置生效:服務器

[root@mongodb1 ~]# mount
/dev/sda on / type ext4 (rw,noatime)

 

2.     CPU和內存網絡

在一個虛擬機監視器上,將MongoDB做爲一個虛擬機進行設置,這樣你能夠在之後擴展RAMCPU內核。應該分配的CPU內核和RAM的大小取決於你的基礎設施的需求以及預算。less

 

3.     優化

最有用的技巧是優化你的數據庫查詢:

·         給經常使用的搜索查詢和分類查詢添加索引。

·         使用MongoDBexplain()命令。

·         限制搜索結果,限制返回結果的字段。

出於測試目的,咱們來看一下這3droplet

 

安裝

這一過程在mongodb1mongodb2mongodb3上都是同樣的。

CentOS上安裝MongoDB很是簡單。

 

編輯下面的命令添加庫:

/etc/yum.repos.d/10gen.repo
[10gen]
name=10gen
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64
gpgcheck=0
enabled=1

 

如今安裝包

[root@mongodb1 ~]# yum -y install mongo-10gen mongo-10gen-server

 

MongoDB在電腦重啓以後啓動,並啓動服務器:

[root@mongodb1 ~]# chkconfig mongod on && service mongod start
Starting mongod: forked process: 1387
all output going to: /var/log/mongo/mongod.log
child process started successfully, parent exiting
                                                           [  OK  ]


如今你應該看一下http://SERVER:28017/上的統計


 

創建一個Master-Slave副本集

咱們將把mongodb1做爲一個主服務器,添加「master = true」/etc/mongod.conf 而後執行

service mongod restart

Mongodb2mongodb3會被設置爲副服務器。

添加 「slave=true」, 「source = mongodb1」 /etc/mongod.conf 而後執行

service mongod restart


 

如今咱們應該讓這個數據庫更安全,設置一個密碼或添加ip信息包過濾系統(iptables)規則到27017端口(MongoDB)和28017端口(網絡界面)。

 

建立一個用戶和密碼:

> use test

> db.addUser('admin', 'password');
{
        "user" : "admin",
        "readOnly" : false,
        "pwd" : "90f500568434c37b61c8c1ce05fdf3ae",
        "_id" : ObjectId("50eaae88790af41ffffdcc58")
}

咱們一樣應該添加防火牆規則來限制其餘的MongoDB服務器,咱們的IP,並保存:

[root@mongodb1 ~]# iptables -N MongoDB
[root@mongodb1 ~]# iptables -I INPUT -s 0/0 -p tcp --dport 27017 -j MongoDB
[root@mongodb1 ~]# iptables -I INPUT -s 0/0 -p tcp --dport 28017 -j MongoDB
[root@mongodb1 ~]# iptables -I MongoDB -s 127.0.0.1 -j ACCEPT
[root@mongodb1 ~]# iptables -I MongoDB -s 192.34.57.64 -j ACCEPT
[root@mongodb1 ~]# iptables -I MongoDB -s 192.34.56.123 -j ACCEPT
[root@mongodb1 ~]# iptables -I MongoDB -s 192.34.57.162 -j ACCEPT
[root@mongodb1 ~]# iptables -A MongoDB -s 0/0 -j DROP
[root@mongodb1 ~]# /etc/init.d/iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[  OK  ]

 

在其餘的MongoDB服務器上(mongodb2, mongodb3)重複這一步驟。若是你是在前端使用PHP,須要給PHP安裝MongoDB模塊:

[root@webserver ~]# pecl install mongo
[root@webserver ~]# echo extension=mongo.so >> `php -i | grep /php.ini | awk '{print $5}'`
[root@webserver ~]# service httpd restart

 

用數據填充數據庫

如今咱們能夠開始測試咱們的新設置了,你能夠在命令編輯器(command shell)輸入mongo,進入到數據庫:

[root@mongodb1 ~]# mongo

 

MongoDB shell 版本:2.2.2鏈接到:測試

咱們如今進入紐約時報暢銷書排行榜的數據庫,來進行測試:

 

> db.books.save( { title: 'Safe Haven', author: 'Nicholas Sparks' } )
> db.books.save( { title: 'Gone Girl', author: 'Gillian Flynn' } )
> db.books.save( { title: 'The Coincidence Of Callie And Kayden', author: 'Jessica Sorensen' } )
> db.books.save( { title: 'Fifty Shades of Grey', author: 'E.L. James' } )
> db.books.save( { title: 'Hopeless', author: 'Colleen Hoover' } )


顯示全部結果:

> db.books.find()
{ "_id" : ObjectId("50eaaa4b633625147f205994"), "title" : "Safe Haven", "author" : "Nicholas Sparks" }
{ "_id" : ObjectId("50eaaa62633625147f205995"), "title" : "Gone Girl", "author" : "Gillian Flynn" }
{ "_id" : ObjectId("50eaaa8d633625147f205996"), "title" : "The Coincidence Of Callie And Kayden", "author" : "Jessica Sorensen" }
{ "_id" : ObjectId("50eaaaa0633625147f205997"), "title" : "Fifty Shades of Grey", "author" : "E.L. James" }
{ "_id" : ObjectId("50eaaab3633625147f205998"), "title" : "Hopeless", "author" : "Colleen Hoover" }

 

你應該能在mongodb2mongodb3上看到相同的入口(entries),由於他們是一個副本集:

你能夠進入這些書的全部數據值,好比發行者名字,ISBN號,平均客戶評價,書寫語言等等。爲了能優化你的查詢,最好限制一下結果數量和返回的字段數量。

例如,只返回兩個結果咱們會在最後用到limit():

> db.books.find( {}, { title : 1 , author: 1 } ).sort( { timestamp : -1 } ).limit(2)
{ "_id" : ObjectId("50eaaa4b633625147f205994"), "title" : "Safe Haven", "author" : "Nicholas Sparks" }
{ "_id" : ObjectId("50eaaa62633625147f205995"), "title" : "Gone Girl", "author" : "Gillian Flynn" }

 

一旦達到了當前設置的最大容量,你能夠將數據庫分片,這方面咱們會在之後的文章中詳解。

相關文章
相關標籤/搜索