MongoDB的介紹與部署

什麼是MongoDB


MongoDB 是由C++語言編寫的,是一個基於分佈式文件存儲的開源數據庫系統,屬於NoSQL。

在高負載的情況下,可以添加更多的節點,可以保證服務器性能。

MongoDB 旨在爲WEB應用提供可擴展的高性能數據存儲解決方案。(不能完全取代傳統型數據,只能取代一小部分的功能)

MongoDB 將數據存儲爲一個文檔,數據結構由鍵值(key=>value)對組成。MongoDB 文檔類似於 JSON 對象。字段值可以包含其他文檔,數組及文檔數組。


MongoDB安裝


使用epel的擴展源去安裝mongoDB,安裝的是2.4版本的。

我們搭建自己yum源去安裝的是3.0,官方提供的源只支持64位系統,它支持新的數據引擎wire tiger,高效節省空間。


搭建yum源(測試機需要64位)


vim /etc/yum.repos.d/mongodb-org-3.0.repo //加入如下內容

[mongodb-org-3.0]


name=MongoDB Repository


baseurl=http://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.0/x86_64/


gpgcheck=0


enabled=1


安裝和配置MongoDB



安裝很簡單  yum install -y mongodb-org

編輯配置文件  vim /etc/mongod.conf

fork: true

pidFilePath: /var/run/mongodb/mongod.pid

把這兩行後面#開頭的註釋刪掉,否則重啓的時候會有問題

要想綁定多個ip,在bind_ip 後寫多個ip,中間用逗號分隔,監聽全部ip留空即可


#配置文件在/etc/mongo.conf

#日誌文件在/var/log/mongodb/

#數據庫文件在/var/lib/mongo/


啓動MongoDB(啓動時,會提示我們去更改一些配置,這裏我們先行更改。)

echo never > /sys/kernel/mm/transparent_hugepage/enabled

echo never > /sys/kernel/mm/transparent_hugepage/defrag

vim /etc/security/limits.conf //最後追加上

mongod soft nofile 64000

mongod hard nofile 64000

mongod soft nproc 32000

mongod hard nproc 32000

保存退出


啓動:service mongod start

#啓動的過程會比較慢,這是它在寫數據 /var/lib/mongo

#

#當啓動出錯的時候,我們無法在日誌中去查看錯誤,也不會提示錯誤,這時候我們使用命令mongod -f /etc/mongod.conf去啓動,然後根據錯誤提示去更改我們的配置文件


MongoDB使用:


連接MongoDB:

在本機可以直接運行命令mongo進入到mongodb shell中


如果mongodb監聽端口並不是默認的27017,則在連接的時候需要加--port 選項,例如

mongo --port 27018

連接遠程mongodb,需要加--host,例如

mongo --host  127.0.0.1

如果設置了驗證,則在連接的時候需要帶用戶名和密碼

mongo -uusername -ppasswd  //這個和MySQL挺像


MongoDB用戶管理


首先mongodb用戶是針對庫來的,建立用戶時要先進入到對應的庫裏

use test  //切換到test庫下

db.createUser({user:"admin",pwd:"123456",roles:[{role:'dbOwner',db:'userdb'}]}) 

use admin //切換到admin庫

db.system.users.find()  //列出所有用戶,需要切換到admin庫

show users  //查看當前庫下所有的用戶

db.dropUser('admin') //刪除用戶

關於用戶角色,參考文檔http://bbs.51cto.com/thread-1146654-1.html



MongoDB庫管理


db.version()  //查看版本

use userdb  //如果庫存在就切換,不存在就創建

show dbs //查看庫,此時userdb並沒有出現,這是因爲該庫是空的,還沒有任何集合,只需要創建一個集合就能看到了 

db.createCollection('clo1') //創建集合clo1,在當前庫下面創建

db.dropDatabase() //刪除當前庫,要想刪除某個庫,必須切換到那個庫下

db.stats()  //查看當前庫的信息

db.serverStatus()   //查看mongodb服務器的狀態




MongoDB創建集合


db.createCollection("mycol", { capped : true, autoIndexID : true, size : 6142800, max : 10000 } )  //語法:db.createCollection(name,options)

name就是集合的名字,options可選,用來配置集合的參數,參數如下:

capped true/false (可選)如果爲true,則啓用封頂集合。封頂集合是固定大小的集合,當它達到其最大大小,會自動覆蓋最早的條目。如果指定true,則也需要指定尺寸參數。

autoindexID  true/false (可選)如果爲true,自動創建索引_id字段的默認值是false。

size (可選)指定最大大小字節封頂集合。如果封頂如果是 true,那麼你還需要指定這個字段。單位B

max (可選)指定封頂集合允許在文件的最大數量。



MongoDB數據管理


show collections //查看集合,或者使用show  tables

db.Account.insert({AccountID:1,UserName:"123",password:"123456"})  //如果集合不存在,直接插入數據,則mongodb會自動創建集合

db.Account.update({AccountID:1},{"$set":{"Age":20}}) //更新

db.Account.find()   //查看所有文檔

db.Account.find({AccountID:1})   //根據條件查詢

db.Account.remove({AccountID:1})  //根據條件刪除

db.Account.drop() //刪除所有文檔,即刪除集合

use dbname  //先進入對應的庫

db.printCollectionStats()  // 然後查看集合狀態





MongoDB 副本集



MongoDB 副本集(repl set)介紹


早期版本使用master-slave,一主一從和MySQL類似,但slave在此架構中爲只讀,當主庫宕機後,從庫不能自動切換爲主

目前已經淘汰master-slave模式,改爲副本集,這種模式下有一個主(primary),和多個從(secondary),只讀。支持給它們設置權重,當主宕掉後,權重最高的從切換爲主

在此架構中還可以建立一個仲裁(arbiter)的角色,它只負責裁決,而不存儲數據

再此架構中讀寫數據都是在主上,要想實現負載均衡的目的需要手動指定讀庫的目標server



MongoDB副本集搭建


三臺機器: 172.7.15.111(primary)   172.7.15.112(secondary)    172.7.15.101(secondary) 

編輯三臺機器的配置文件,增加:

replication:

##oplog大小

  oplogSizeMB: 20

##複製集名稱

  replSetName: aminglinux //自定義名稱,千萬記住格式是空兩格!

保存退出


分別重啓三臺機器

連接主,在主上運行命令mongo 

>use admin


>config={_id:"aminglinux",members:[{_id:0,host:"172.7.15.111:27017"},{_id:1,host:"172.7.15.112:27017"},{_id:2,host:"172.7.15.101:27017"}]}


>rs.initiate(config)  //初始化配置


>rs.add("172.7.15.112")  


>rs.add("172.7.15.101")

>

rs.status() //查看狀態


如果兩個從上的狀態爲"stateStr" : "STARTUP", 則需要進行如下操作


> var config={_id:"aminglinux",members:[{_id:0,host:"172.7.15.111:27017"},{_id:1,host:"172.7.15.112:27017"},{_id:2,host:"172.7.15.101:27017"}]}


>rs.reconfig(config)


此時再次查看rs.status()會發現從的狀態變爲SECONDARY




MongoDB副本集測試

主上建庫,建集合


>use mydb


>db.acc.insert({AccountID:1,UserName:"123",password:"123456"})


>show dbs


從上查看


>show dbs   

若出現錯誤Error: listDatabases failed:{ "note" : "from execCommand", "ok" : 0, "errmsg" : "not master" },需要執行

>rs.slaveok()




在生成環境中,我們需要找一個從節點作爲自動切換節點,當主節點宕機後,它會自動接管主的服務,成爲主節點,當主恢復後還會自動切換回原來的身份。所以,我們應該這樣配置:


cfg = rs.conf()

cfg.members[0].priority = 3

cfg.members[1].priority = 2

cfg.members[2].priority = 1

rs.reconfig(cfg)  //重新加載

這樣的話,第二個節點將會成爲候選主節點。

rs.config()  //可以查看到權重狀態


主上執行 iptables -I INPUT -p tcp --dport 27017 -j DROP //模擬實際情況中的宕機,也可以直接停掉mongod服務



弊端:我們沒辦法實現 讓用戶的訪問由原來的主,切換到現在的主,不過我們可以通過腳本實現手動切換



MongoDB備份恢復


備份指定庫

mongodump -h ip -d dbname -o dir //-h後面跟服務器ip,-d後面跟database名字,不加則備份所有庫,-o後指定備份到哪裏,它是一個目錄

備份所有庫

mongodump -h ip -o dir

備份指定集合

mongodump -d mydb -c testc -o /tmp/testc //-c指定集合名字 


導出集合爲json文件

mongoexport -d mydb -c testc -o /tmp/testc.json // -o後面跟的是一個文件名字



MongoDB結合php


wget 'https://codeload.github.com/mongodb/mongo-php-driver/zip/master' -O /usr/local/src/mong_php.zip

cd /usr/local/src/

unzip mong_php.zip

cd mongo-php-driver-master/

/usr/local/php/bin/phpize

./configure --with-php-config=/usr/local/php/bin/php-config

make

make install

vi /usr/local/php/etc/php.ini    //增加 extension = mongo.so

/usr/local/php/bin/php -m

重啓apache,重新加載php


測試:

vi /usr/local/apache2/htdocs/1.php  //增加

<?php

// 連接到mongodb

$m = new MongoClient();

echo "Connection to database successfully";

// 選擇一個數據庫

$db = $m->mydb;

echo "Database mydb sel ected";

?>


訪問  curl localhost/1.php   如果輸出

Connection to database successfullyDatabase mydb selected

說明正確。


參考 http://www.runoob.com/mongodb/mongodb-php.html 





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