如何設置一個可擴展的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做爲一個虛擬機進行設置,這樣你能夠在之後擴展RAM和CPU內核。應該分配的CPU內核和RAM的大小取決於你的基礎設施的需求以及預算。less
3. 優化
最有用的技巧是優化你的數據庫查詢:
· 給經常使用的搜索查詢和分類查詢添加索引。
· 使用MongoDB的explain()命令。
· 限制搜索結果,限制返回結果的字段。
出於測試目的,咱們來看一下這3個droplet:
安裝
這一過程在mongodb1,mongodb2,mongodb3上都是同樣的。
在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
Mongodb2和mongodb3會被設置爲副服務器。
添加 「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" }
你應該能在mongodb2和mongodb3上看到相同的入口(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" }
一旦達到了當前設置的最大容量,你能夠將數據庫分片,這方面咱們會在之後的文章中詳解。