什麼是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