MongoDB筆記

什麼是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字段設置爲主鍵

關係型數據庫數據結構

wKioL1eokSbTGyuyAAIYDwv9AEs726.png-wh_50

MongoDB數據結構

wKioL1eokaXBH5VKAAIezxyMjII104.png-wh_50



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


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