什麼是MongoDB
1:MongoDB是有C++語言編寫的,是一個基於分佈式文件存儲的開源數據庫系統,屬於NOSQL。
2:在高負載的情況下,可以添加更多的節點,可以保證服務器性能。
3:MongnDB旨在爲WEB應用提供可擴展的高性能數據存儲解決方案。
4:MongnDB將數據存儲爲一個文檔,數據結構由鍵值(key=>value)對組成。MongoDB文檔類似於JSON對象。字段值可以包含其他文檔,數組及文檔數組。
和關係型數據庫對比
SQL術語/概念 MongnDB術語/概念 解釋說明
database database 數據庫
table collection 數據庫表/集合
row document 數據記錄行/文檔
column field 數據字段/域
index index 索引
table joins 表連接,MongnDB不支持
primary key primary key 主鍵,MongnDB自動將_id字段設置爲主鍵
關係型數據庫數據結構
MongoDB數據結構
MongoDB安裝
搭建yum源:
1:如果安裝epel擴展源,可以安裝mongodb2.4版本,但這次我們要安裝3.0版本,官方提供的源只支持64位系統
2:vim /etc/yum.repos.d/mongodb-org-3.2.repo //加入如下內容
[mongodb-org-3.2]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.2/x86_64/
gpgcheck=0
enabled=1
然後直接yum install mongodb-org
啓動腳本:/etc/init.d/mongod
配置文件:/etc/mongod.conf
日誌文件:/var/log/mongodb/mongod.log
數據庫目錄:/var/lib/mongo/
vim /etc/mongod.conf
pidFilePath: /var/run/mongodb/mongod.pid # location of pidfile 修改成
pidFilePath: /var/run/mongodb/mongod.pid
否則重啓會有錯誤
fork: true # fork and run in background 修改成
fork: true
bindIP這一行爲綁定IP,不指定IP就把後面的全刪掉
啓動:/etc/init.d/mongod start
啓動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
如果yum源安裝不成功也可以解壓安裝:
1.下載mongodb
wget http://downloads.mongodb.org/linux/mongodb-linux-x86_64-3.2.1.tgz
2.解壓縮tar文件
# tar zxf mongodb-linux-x86_64-3.2.1.tgz
# mv mongodb-linux-x86_64-3.2.1/ /usr/local/mongodb-3.2
3. 創建數據文件和日誌文件
#mkdir -p /usr/local/mongodb-3.2/data
#mkdir /usr/local/mongodb-3.2/logs
#touch /usr/local/mongodb-3.2/logs/mongod.log
4.在安裝mongodb的用戶下添加如下環境變量,以便直接使用mongodb bin目錄下的命令
export PATH=$PATH:/usr/local/mongodb-3.2/bin/
5.啓動mongodb
mongod --dbpath=/usr/local/mongodb-3.2/data --logpath=/usr/local/mongodb-3.2/logs/mongod.log --logappend --port=27017&
6.檢查端口是否啓動,端口爲:27017
# netstat -nlp | grep 27017
tcp 0 0 0.0.0.0:27017 0.0.0.0:* LISTEN 1897/mongod
unix 2 [ ACC ] STREAM LISTENING 11098 1897/mongod /tmp/mongodb-27017.sock
啓動成功。
7.連接數據庫
# mongo
> use test
8.設置mongodb自動啓動(無權限)
將如下命令添加到 /etc/rc.local
mongod --dbpath=/usr/local/mongodb-3.2/data --logpath=/usr/local/mongodb-3.2/logs/mongod.log --logappend --port=27017&
9.設置mongodb自動啓動(有權限)
將如下命令添加到 /etc/rc.local
mongod --dbpath=/usr/local/mongodb-3.2/data --logpath=/usr/local/mongodb-3.2/logs/mongod.log --logappend --port=27017& -auth
10.添加用戶
> use test (不存在會自動創建)
> db.createUser({user:"admin",pwd:"123456",roles:[{role:'dbOwner',db:'userdb'}]})
> use admin 切換到 admin 庫下
> db.system.users.find() 查看有哪些用戶
MongoDB連接和用戶管理
1)連接MongoDB:
1:在本機可以直接運行命令mongo進入到MongoDB shell中
2:如果MongoDB監聽端口並不是默認的27017,則在連接的時候需要加 --port選項,例如
mongo --port 27018
3:連接遠程mongodb,需要加--host,例如
mongo --host 127.0.0.1
4:如果設置了驗證,則在連接的時候需要帶用戶名和密碼
mongo -uusername -ppasswd //這個和MySQL挺像
2)MongoDB用戶管理
1:首先mongodb用戶是針對庫來的,建立用戶時要先進入到對應的庫裏
2:use test //切換到test庫下
3:db.createUser({user:"admin",pwd:"123456",roles:[{role:'dbOwner',db:'userdb'}]})
4:use admin //切換到admin庫
5:db.system.users.find() // 列出所有用戶,需要切換到admin庫
6:show users //查看當前庫下所有的用戶
7:db.dropUser('admin') //刪除用戶
8:關於用戶角色,參考文檔http://bbs.51cto.com/thread-1146654-1.html
3)數據庫管理
#查看版本
db.version()
#顯示當前的庫 db
# 切換/創建庫
use userdb //如果庫存在就切換,不存在就創建
#此時show dbs 看不到userdb,需要我們創建一個集合
db.createCollection('clo1')
再show dbs就有userdb了。
#查看所有數據庫
show dbs
#刪除數據庫 mydb
use mydb //先切換到該庫下,然後再刪除
db.dropDatabase()
4)數據管理
創建集合
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 (可選)指定封頂集合允許在文件的最大數量。
查看集合
show collections
在集合中添加文檔
db.Account.insert({AccountID:2,UserName:"123",password:"123456"}) //如果集合不存在,直接插入數據,則mongodb會自動創建集合
修改
db.Account.update({AccountID:2},{"$set":{"Age":20}})
查看
db.Account.find() //查看所有文檔
db.Account.find({AccountID:2}) //根據條件查詢
刪除
db.Account.remove({AccountID:2}) //根據條件刪除
要刪除整個文檔
db.Account.drop()
查看集合的狀態
use dbname //先進入對應的庫,然後查看集合狀態
db.printCollectionStats()
5)數據庫性能
db.stats() //查看當前庫的信息
db.serverStatus() //查看mongodb服務器的狀態
4. Mongodb 副本集(repl set)介紹
早期版本使用master-slave,一主一從和MySQL類似,但slave在此架構中只爲讀,當主庫宕機後,從庫不能自動切換爲主。
目前已經淘汰master-slave模式,改爲副本集,這種模式下有一個主(primary),和多個從(secondary),只讀。支持給他們設置權重,當主宕掉後,權重最高的從切換爲主。
在此架構中還可以建立一個仲裁(arbiter)的角色,它只負責裁決,而不存儲數據,在此架構中,讀寫數據都是在主上,要想實現負責均衡的目的需要手動指定讀庫的目標server。
兩臺機器:
mast: 192.168.31.112
slave:192.168.31.113
首先安裝前面我們介紹的步驟安裝好mongodb
主上編輯啓動腳本
vim /etc/init.d/mongod
把OPTIONS=" -f $CONFIGFILE"改爲OPTIONS="--master -f $CONFIGFILE"
從上編輯啓動腳本
vim /etc/init.d/mongod
把OPTIONS=" -f $CONFIGFILE"改爲OPTIONS="--slave --source 172.7.15.111:27017 -f $CONFIGFILE"
分別重啓主和從
測試:
在主上新建庫,新建集合
>use newdb
>db.createCollection('newcol')
>show dbs
從上查看
>show dbs
如果有報錯
QUERY Error: listDatabases failed:{ "note" : "from execCommand", "ok" : 0, "errmsg" : "not master" }
解決辦法:
>rs.slaveOk()
>show dbs;
發現有newdb庫了
5. mongodb集羣(replication)
1) 集羣中有三個角色,一個主兩個從
2) 還可以增加一個角色arbiter(仲裁),它只負責仲裁,不會存儲任何數據
3) 壞掉主後,其中一個從會接管主的角色
MongoDB副本集搭建
三臺機器: 172.7.15.111(primary) 172.7.15.112(secondary) 172.7.15.101(secondary)
編輯三臺機器的配置文件,增加:
replication:
##oplog大小
oplogSizeMB: 20 //需要空格
##複製集名稱
replSetName: aminglinux
分別重啓後,連接primary機器
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") //狀態顯示3個說你已成功,不需要執行此步
查看狀態:
>rs.status()
{
"set" : "aminglinux",
"date" : ISODate("2015-10-19T06:32:09.200Z"),
"myState" : 1,
"members" : [
{
"_id" : 0,
"name" : "localhost.localdomain:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 1381,
"optime" : Timestamp(1445235074, 1),
"optimeDate" : ISODate("2015-10-19T06:11:14Z"),
"electionTime" : Timestamp(1445234949, 1),
"electionDate" : ISODate("2015-10-19T06:09:09Z"),
"configVersion" : 3,
"self" : true
},
{
"_id" : 1,
"name" : "172.7.15.112:27017",
"health" : 1,
"state" : 0,
"stateStr" : "STARTUP",
"uptime" : 1268,
"optime" : Timestamp(0, 0),
"optimeDate" : ISODate("1970-01-01T00:00:00Z"),
"lastHeartbeat" : ISODate("2015-10-19T06:32:07.764Z"),
"lastHeartbeatRecv" : ISODate("1970-01-01T00:00:00Z"),
"pingMs" : 1,
"configVersion" : -2
},
{
"_id" : 2,
"name" : "172.7.15.101:27017",
"health" : 1,
"state" : 0,
"stateStr" : "STARTUP",
"uptime" : 1255,
"optime" : Timestamp(0, 0),
"optimeDate" : ISODate("1970-01-01T00:00:00Z"),
"lastHeartbeat" : ISODate("2015-10-19T06:32:07.930Z"),
"lastHeartbeatRecv" : ISODate("1970-01-01T00:00:00Z"),
"pingMs" : 1,
"configVersion" : -2
}
],
"ok" : 1
}
這個狀態是不對的,正常從節點上應該是SECONDARY,而不是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()
發現狀態好了
MongoDB副本集測試
主上建庫,建集合
>use mydb
>db.createCollection('testc')
>show dbs
從上測試
>show dbs //也出現mydb庫了。
如果出現提示error:listdatabases failed:{"note":"from execCommand","ok":0,"errmsg":"not master"}因爲從上沒有權限
解決辦法 輸入命令:rs.slaveok()
更改primary和secondary的權重,會引起主從切換 //狀態裏health 爲1說明是正常的
在主上執行:
cfg = rs.conf()
cfg.members[0].priority = 3
cfg.members[1].priority = 2
cfg.members[2].priority = 1
rs.reconfig(cfg) //重新加載
這樣第二個機器會自動切換到主,權重最高的機器會擔任主角色。
在生成環境中,我們需要找一個從節點作爲自動切換節點,當主節點宕機後,它會自動接管主的服務,成爲主節點,當主恢復後還會自動切換回原來的身份。所以,我們應該這樣配置:
cfg = rs.conf()
cfg.members[0].priority = 3
cfg.members[1].priority = 2
cfg.members[2].priority = 1
rs.reconfig(cfg)這樣的話,第二個節點將會成爲候選主節點。
把主宕機,查看第二臺機器,按下回車,看看是否變爲主,查看rs.status()
6. mongodb 備份與恢復
1) 備份指定庫
mongodump -h ip -d dbname -o dir //-h後面跟服務器ip,-d後面跟database名字,不加則備份所有庫,-o後面指定備份到哪裏,它是一個目錄 -u 用戶名 -p 密碼 --port
2)備份所有庫
mongodump -h ip -o dir
3) 備份指定集合
mongodump -d mydb -c testc -o /tmp/testc //用-c指定集合名字
4)恢復所有庫
mongorestore --drop dir/ //其中dir是備份所有庫的目錄名字,其中--drop可選,意思是當恢復之前先把之前的數據刪除,不建議使用
5) 恢復指定庫
mongorestore -d mydb dir/ //-d跟要恢復的庫名字,dir就是該庫備份時所在的目錄
6)恢復集合
mongorestore -d mydb -c testc dir/mydb/testc.bson // -c後面跟要恢復的集合名字,dir是備份mydb庫時生成文件所在路徑,這裏需要跟一個bson文件的路徑
7)導出集合爲json文件
mongoexport -d mydb -c testc -o /tmp/testc.json
8)導入集合
mongoimport -d mydb -c testc --file /tmp/testc.json
7. php連接mongodb
wget http://pecl.php.net/get/mongo-1.4.5.tgz
cd /usr/local/src/
tar -zxvf mongo-1.4.5.tgz
cd mongo-1.4.5
/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 selected";
?>
訪問 curl localhost/1.php 如果輸出
Connection to database successfullyDatabase mydb selected
說明正確。
更多測試訪問http://www.runoob.com/mongodb/mongodb-php.html
擴展: mongodb分片 http://www.lanceyan.com/tech/arch/mongodb_shard1.html