MongoDB介紹(資源)

MongoDB介紹

 • 官網www.mongodb.com, 當前最新版3.4javascript

C++編寫,基於分佈式的,屬於NoSQL的一種。支持使用 javascript 進行查詢,讀寫性能優越,但不支持事務和錶鏈接。php

在NoSQL中是最像關係型數據庫的html

MongoDB 將數據存儲爲一個文檔,是一個關係型數據庫,數據結構由鍵值(key=>value)對組成。MongoDB 文檔相似於 JSON 對象。字段值能夠包含其餘文檔、數組及文檔數組。
• MongoDB 是一個基於分佈式文件存儲的數據庫。java

• MongoDB 是一個介於關係數據庫和非關係數據庫之間的產品,是非關係數據庫當中功能最豐富,最像關係數據庫的。python

• MySQL 等關係型數據庫時,主鍵都是設置成自增的。但在分佈式環境下,尤爲是在分庫分表之後,單純的自增主鍵會產生衝突,須要考慮如何生成惟一 ID。linux

mongodb 採用了一個稱之爲 ObjectId 的類型來作主鍵,ObjectId 是一個12字節的 BSON 類型字符串。git

MongoDB 很是適用於高併發場景,其對事務性的犧牲換來了數據訪問的低延遲而被普遍稱道。github

mongostat 和 mongotop 兩個命令實現監控MongoDBweb

• MongoDB是一個跨平臺,面向文檔的數據庫,提供高性能,高可用性和易於擴展。MongoDB是工做在集合和文檔上一種概念redis

主從複製副本集兩種主從複製模式,主從複製最大的問題就是沒法自動故障轉移,MongoDB副本集解決了主從模式沒法自動故障轉義的特色,所以是複製的首選。

• 特色:保留了SQL一些友好的特性(查詢,索引)。

• 使用許可: AGPL(發起者: Apache)

• Master/slave複製(支持自動錯誤恢復,使用 sets 複製)

• 內建分片機制

• update-in-place支持比CouchDB更好

• update-in-place支持比CouchDB更好

• MongoDB分片的基本思想就是將集合切分紅小塊。這些塊分散到若干片裏面,每一個片只負責總數據的一部分。 對於客戶端來講,無需知道數據被拆分了,也無需知道服務端哪一個分片對應哪些數據。

• 數據在分片以前須要運行一個路由進程進程名爲mongos。這個路由器知道全部數據的存放位置,知道數據和片的對應關係。對客戶端來講,它僅知道鏈接了一個普通的mongod,在請求數據的過程當中,經過路由器上的數據和片的對應關係,路由到目標數據所在的片上,若是請求有了迴應,路由器將其收集起來回送給客戶端。

• 在32位操做系統上,數據庫大小限制在約2.5Gb

• 空數據庫大約佔 192Mb

• MongoDB 是一個基於分佈式文件存儲的數據庫。由C++語言編寫。旨在爲WEB應用提供可擴展的高性能數據存儲解決方案。

• 在大規模集羣下,用戶每每傾向於選擇 Cassandra 做爲存儲,由於在這樣的應用場景下。

• MongoDB 是一個介於關係數據庫和非關係數據庫之間的產品,是非關係數據庫當中功能最豐富,最像關係數據庫的。他支持的數據結構很是鬆散,是相似json的bson格式,所以能夠存儲比較複雜的數據類型。Mongo最大的特色是他支持的查詢語言很是強大,其語法有點相似於面向對象的查詢語言,幾乎能夠實現相似關係數據庫單表查詢的絕大部分功能,並且還支持對數據創建索引。

MongoDB優勢:

1)更高的寫負載,MongoDB擁有更高的插入速度。

2)處理很大的規模的單表,當數據表太大的時候能夠很容易的分割表。

3)高可用性,設置M-S不只方便並且很快,MongoDB還能夠快速、安全及自動化的實現節點 (數據中心)故障轉移。

4)快速的查詢,MongoDB支持二維空間索引,好比管道,所以能夠快速及精確的從指定位置 獲取數據。MongoDB在啓動後會將數據庫中的數據以文件映射的方式加載到內存中。若是內 存資源至關豐富的話,這將極大地提升數據庫的查詢速度。

5)非結構化數據的爆發增加,增長列在有些狀況下可能鎖定整個數據庫,或者增長負載從而 致使性能降低,因爲MongoDB的弱數據結構模式,添加1個新字段不會對舊錶格有任何影響, 整個過程會很是快速。

 

MongoDB缺點:

1)不支持事務。

2)MongoDB佔用空間過大 。

3)MongoDB沒有成熟的維護工具。

 

MongoDB應用場景

1.)適用於實時的插入、更新與查詢的需求,並具有應用程序實時數據存儲所需的複製及高度伸縮性;

2) 很是適合文檔化格式的存儲及查詢;

3.)高伸縮性的場景:MongoDB 很是適合由數十或者數百臺服務器組成的數據庫。

4.)對性能的關注超過對功能的要求。

 

mongodb用途

通常mongodb部署主從、或者mongodb分片集羣;建議3臺或5臺服務器來部署。MongoDB分片的基本思想就是將集合切分紅小塊。這些塊分散到若干片裏面,每一個片只負責總數據的一部分。  對於客戶端來講,無需知道數據被拆分了,也無需知道服務端哪一個分片對應哪些數據。數據在分片以前須要運行一個路由進程,進程名爲mongos。這個路由器知道全部數據的存放位置,知道數據和片的對應關係。對客戶端來講,它僅知道鏈接了一個普通的mongod,在請求數據的過程當中,經過路由器上的數據和片的對應關係,路由到目標數據所在的片上,若是請求有了迴應,路由器將其收集起來回送給客戶端。

 

MongoDB特色

  • 面向集合存儲,易於存儲對象類型的數據

  • 模式自由

  • 支持動態查詢

  • 支持徹底索引,包含內部對象

  • 支持查詢

  • 支持複製和故障恢復

  • 使用高效的二進制數據存儲,包括大型對象(如視頻等)

  • 自動處理碎片,以支持雲計算層次的擴展性

  • 支持 Python,PHP,Ruby,Java,C,C#,Javascript,Perl 及 C++語言的驅動程序

  • 文件存儲格式爲 BSON(一種 JSON 的擴展),文檔型

  • 可經過網絡訪問

面向集合(Collenction-Orented)

  • 意思是數據被分組存儲在數據集中,被稱爲一個集合(Collenction)。每一個集合在數據庫中都有一個惟一的標識名,而且能夠包含無限數目的文檔。集合的概念相似關係型數據庫(RDBMS)裏的表(table),不一樣的是它不須要定義任何模式(schema)

模式自由(schema-free)

  • 意味着對於存儲在 MongoDB 數據庫中的文件,咱們不須要知道它的任何結構定義。提了這麼屢次"無模式"或"模式自由",它到是個什麼概念呢? 例如,下面兩個記錄能夠存在於同一個集合裏面:

    {"welcome" : "Beijing"}

    {"age" : 25}

文檔型數據庫

 •  MongoDB中的記錄是一個文檔,它是由字段和值對組成的數據結構。MongoDB文檔相似於JSON對象。字段的值能夠包括其餘文檔、數組和文檔數組。

•  存儲的數據是鍵-值對的集合,鍵是字符串,值能夠是數據類型集合裏的任意類型,包括數組和文檔. 咱們把這個數據格式稱做 「BSON」 即 「Binary Serialized dOcument Notation.」

使用文件的優勢是:

  • 文檔(即對象)與許多編程語言中的本機數據類型相對應。
  • 嵌入式文檔和數組減小了對昂貴鏈接的需求。
  • 動態架構支持FLUENT多態性。

MongoDB應用場景

適合場景:

1.網站數據,實時的插入,更新與查詢。
2.因爲性能很高,可作持久化緩存層。
3.存儲大尺寸,低價值的數據。
4.高伸縮性的集羣場景。
5.BSON格式很是適合文檔化數據的存儲及查詢。

不適合場景:

1.高度事務性的系統,例如銀行或會計系統。
2.傳統的商業智能應用,針對特定問題的BI數據庫會對產生高度優化的查詢方式。對於此類應用,數據倉庫多是更合適的選擇。

豐富查詢語言

MongoDB支持豐富的查詢語言。讀寫操做(CRUD)以及:

高可用性

MongoDB的複製工具,稱爲複製集,規定:

  • 自動故障轉移和
  • 數據冗餘

關於JSON http://www.w3school.com.cn/json/index.asp

由於基於分佈式,因此很容易擴展

MongoDB手冊內容:https://docs.mongodb.com/manual/contents/

常見問題:https://docs.mongodb.com/manual/faq/?_ga=2.212716946.782092130.1530968130-633546892.1528366727

MongoDB和關係型數據庫對比

關係型數據庫數據結構

Mongodb配置

  1. 創建配置文件目錄
    在mongodb文件夾data 用來存放數據
    data中新建文件夾db 和 logs
    db 用來存放數據
    logs 用來存放日誌

    logs文件夾中mongodb.log文件

  2. 創建配置文件mongodb.conf
    dbpath=D:\soft\Mongodb\data\db #數據存放路徑
    logpath=D:\soft\Mongodb\data\log\mongodb.log #日誌存放路徑
    logappend=true #錯誤日誌採用追加模式
    journal=true #啓用日誌文件,默認啓用
    quiet=true #這個選項能夠過濾掉一些無用的日誌信息,若須要調試使用請設置爲false
    port=27017 #端口號 默認爲27017

MongoDB安裝

• epel自帶的mongodb版本爲2.6,咱們須要安裝3.4版本

• 官方安裝文檔https://docs.mongodb.com/manual/tutorial/install-mongodb-on-red-hat/

• cd /etc/yum.repos.d/

• vim mongodb-org-3.4.repo    //加入以下內容

[mongodb-org-3.4]

name=MongoDB Repository

baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.4/x86_64/

gpgcheck=1

enabled=1

gpgkey=https://www.mongodb.org/static/pgp/server-3.4.asc

• yum list |grep mongodb //能夠看到mongodb相關的rpm包

• cd /usr/local/src

wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.9.tgz 

• yum install -y mongodb-org

下載php-mongodb擴展

wget http://pecl.php.net/get/mongo-1.6.12.tgz

解壓

tar xvzf mongo-1.6.12

在安裝過程當中可能會報如下錯誤

/var/tmp/mongo/contrib/php-ssl.h:33:25: error: openssl/evp.h: No such file or directory

須要安裝openssl-devel

yum install openssl-devel

在php.ini文件中添加extension=mongo.so

extension=mongo.so

重啓Apache 或者Nginx

 

實例:

下載:

1:在線下載
  wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.9.tgz  最新版
2:官網下載
  https://www.mongodb.com/download-center?ct=atlasheader#atlas

配置包管理系統(yum).      -----從官網下載最新的

建立一個/etc/yum.repos.d/mongodb-org-4.0.repo文件,以便您可使用如下方法直接安裝MongoDByum:

[root@localhost 01]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# ls
[root@localhost yum.repos.d]# vim mongodb-org-3.4.repo   //加入以下內容
[mongodb-org-4.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.0.asc


[root@localhost yum.repos.d]# yum list | grep mongo             #查看mongodb相關的rpm包功

安裝包
[root@localhost yum.repos.d# yum install -y mongodb-org
[root@localhost 01]# cd /usr/local/src
[root@localhost src]# wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.9.tgz
[root@localhost src]# tar -zxvf mhttps://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.9.tgz
[root@localhost src]# cd mongodb-linux-x86_64-4.0.9
[root@localhost src]# mkdir log
[root@localhost src]# mkdir db
[root@localhost src]# ./bin/mongod --dbpath=./db --logpath=./log/mongodb.log --fork --auth                  #之後臺運行方式啓動


[root@localhost 01]# cd
[root@localhost 01]# vim /etc/mongod.conf           #查看配置文件
bindIP:127.0.0.1,192.168.2.229    #添加綁定的IP


[root@localhost 01]# systemctl start mongod       #啓動mongod
[root@localhost 01]# ps aux | grep mongo         #查看進程
mongod    13690 33.8  5.1 1067732 50992 ?       Sl   18:44   0:01 /usr/bin/mongod -f /etc/mongod.conf
root      15856  0.0  0.0 112720   972 pts/1    S+   18:44   0:00 grep --color=auto mongo

[root@localhost 01]# netstat -lntp #查看端口,加綁定的IP,有沒有添加成功
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      828/sshd            
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      930/master          
tcp        0      0 192.168.133.133:27017   0.0.0.0:*               LISTEN      13690/mongod        
tcp        0      0 127.0.0.1:27017         0.0.0.0:*               LISTEN      13690/mongod        
tcp6       0      0 :::22                   :::*                    LISTEN      828/sshd            
tcp6       0      0 ::1:25                  :::*                    LISTEN      930/master 

輸入netstat -nalupt | grep mongo

tcp 0 0 0.0.0.0:27017 0.0.0.0:* LISTEN 4623/./bin/mongod

 

MongoDB鏈接

•  systemctl start mongod //啓動服務

• 在本機能夠直接運行命令mongo進入到mongodb shell中

• 若是mongodb監聽端口並非默認的27017,則在鏈接的時候須要加--port 選項,例如

• mongo --port 27018

• 鏈接遠程mongodb,須要加--host,例如

• mongo --host  127.0.0.1

• 若是設置了驗證,則在鏈接的時候須要帶用戶名和密碼

• mongo -uusername -ppasswd --authenticationDatabase db //這個和MySQL挺像

實例:

鏈接

[root@localhost 01]# mongo

鏈接遠程mongodb,須要加--host,例如

[root@localhost 01]# mongo --host  127.0.0.1 --port 27018   #連接127.0.0.1的IP
按ctrl+D,退出來

[root@localhost 01]# mongo --host  192.168.2.229 --port 53   #連接192.168.2.229的IP

MongoDB shell version v4.0.0
connecting to: mongodb://192.168.133.133:27017/
MongoDB server version: 4.0.0
Server has startup warnings: 
2018-07-08T18:44:54.774+0800 I CONTROL  [initandlisten] 
2018-07-08T18:44:54.774+0800 I CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.
2018-07-08T18:44:54.774+0800 I CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.
2018-07-08T18:44:54.774+0800 I CONTROL  [initandlisten] 
2018-07-08T18:44:54.776+0800 I CONTROL  [initandlisten] 
2018-07-08T18:44:54.776+0800 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2018-07-08T18:44:54.776+0800 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2018-07-08T18:44:54.776+0800 I CONTROL  [initandlisten] 
2018-07-08T18:44:54.776+0800 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2018-07-08T18:44:54.776+0800 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2018-07-08T18:44:54.776+0800 I CONTROL  [initandlisten] 
---
Enable MongoDB's free cloud-based monitoring service to collect and display
metrics about your deployment (disk utilization, CPU, operation statistics,
etc).

The monitoring data will be available on a MongoDB website with a unique
URL created for you. Anyone you share the URL with will also be able to
view this page. MongoDB may use this information to make product
improvements and to suggest MongoDB products and deployment options to you.

To enable free monitoring, run the following command:
db.enableFreeMonitoring()
---

>                         #CTRL+D   退出來
bye

 

MongoDB用戶管理

use admin//須要切換到admin庫

db.createUser( { user: "admin", customData: {description: "superuser"}, pwd: "admin122", roles: [ { role: "root", db: "admin" } ] } )          #建立用戶admin

注意:pwd後面是密碼,

user指定用戶,customData爲說明字段,能夠省略,pwd爲密碼,roles指定用戶的角色,db指定庫名

use admin //切換到admin庫

db.system.users.find()  //列出全部用戶,須要切換到admin庫

show users  //查看當前庫下全部的用戶

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

若要用戶生效,還須要編輯啓動腳本vim /usr/lib/systemd/system/mongod.service,在OPTIONS=後面增--auth

重啓服務       systemctl restart mongod

mongo -u "admin" -p "admin122" --authenticationDatabase "admin"

• use db1

• db.createUser( { user: "test1", pwd: "123aaa", roles: [ { role: "readWrite", db: "db1" }, {role: "read", db: "db2" } ] } )

• test1用戶對db1庫讀寫,對db2庫只讀。

• 之因此先use db1,表示用戶在 db1 庫中建立,就必定要db1庫驗證身份,即用戶的信息跟隨隨數據庫。好比上述 test1雖然有 db2 庫的讀取權限,可是必定要先在db1庫進行身份驗證,直接訪問會提示驗證失敗。

• use db2

• db.auth("test1", "123aaa")

實例:

給mongob用戶設置密碼
[root@localhost 01]# mongo     #進入庫裏面    
> use admin//須要切換到admin庫
switched to db admin 
> db.createUser( { user: "admin", customData: {description: "superuser"}, pwd: "admin122", roles: [ { role: "root", db: "admin" } ] } )               #回車
Successfully added user:{
         "user":"admin",
         "customData" :{
                "description" : "superuser"
         },
         "roles" : [
                 {            "role" : "root",
                              "db" : "admin"
                 }
        ]
}
> db.create           #會自動查找相關的命令
db.createCollection  db.createRole(  db.createUser(  db.createView(  
> db.system.users.find()            //列出全部用戶,須要切換到admin庫

> show users       //查看當前庫下全部的用戶
{
	"_id" : "test.admin",
	"user" : "admin",
	"db" : "test",
	"customData" : {
		"description" : "superuser"
	},
	"roles" : [
		{
			"role" : "root",
			"db" : "admin"
		}
	],
	"mechanisms" : [
		"SCRAM-SHA-1",
		"SCRAM-SHA-256"
	]
}
> db.createUser( { user: "aming", pwd: "123456", roles: [ { role: "read", db: "testadb" } ] } )                   建立一個用戶阿明
Successfully added user: {
	"user" : "aming",
	"roles" : [
		{
			"role" : "read",
			"db" : "testadb"
		}
	]
}

> db.dropUser('admin') //刪除用戶
> db.drop
test.drop
> db.dropUser('aming')
true
> show users
> db.createUser( { user: "aming", pwd: "123456", roles: [ { role: "read", db: "testadb" } ] } )
Successfully added user: {
	"user" : "aming",
	"roles" : [
		{
			"role" : "read",
			"db" : "testadb"
		}
	]
}
> show users
{
	"_id" : "admin.aming",           #庫是admin.用戶是aming
	"user" : "aming",
	"db" : "admin",
	"roles" : [
		{
			"role" : "read",
			"db" : "testadb"
		}
	],
	"mechanisms" : [
		"SCRAM-SHA-1",
		"SCRAM-SHA-256"
	]
}

> 


若要用戶生效,還須要編輯啓動腳本
[root@localhost 01]# vim /usr/lib/systemd/system/mongod.service ,在OPTIONS=後面增--auth
OPTIONS=--auth -f

而後啓動服務
[root@localhost ~]# systemctl restart mongod
Warning: mongod.service changed on disk. Run 'systemctl daemon-reload' to reload units.
Job for mongod.service failed because the control process exited with error code. See "systemctl status mongod.service" and "journalctl -xe" for details.


啓動錯誤。緣由:修改了配置文件,按照提示執行systemctl daemon-reload命令
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl restart mongod
[root@localhost ~]# ps aux | grep mongo              #查看auth是否添加成功
mongod    16728 26.5  5.4 1067724 54032 ?       Sl   19:15   0:01 /usr/bin/mongod --auth -f /etc/mongod.conf
root      16759  0.0  0.0 112720   972 pts/1    S+   19:15   0:00 grep --color=auto mongo


測試,沒有受權能不能登陸。
[root@localhost ~]# mongo --host 192.168.133.133 --port 27017
MongoDB shell version v4.0.0
connecting to: mongodb://192.168.133.133:27017/
MongoDB server version: 4.0.0
> use admin
switched to db admin
> show users;
2018-07-08T19:21:53.338+0800 E QUERY    [js] Error: command usersInfo requires authentication :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
DB.prototype.getUsers@src/mongo/shell/db.js:1757:1
shellHelper.show@src/mongo/shell/utils.js:848:9
shellHelper@src/mongo/shell/utils.js:755:15
@(shellhelp2):1:1
>

MongoDB用戶管理

• use db1

• db.createUser( { user: "test1", pwd: "123aaa", roles: [ { role: "readWrite", db: "db1" }, {role: "read", db: "db2" } ] } )

• test1用戶對db1庫讀寫,對db2庫只讀。

• 之因此先use db1,表示用戶在 db1 庫中建立,就必定要db1庫驗證身份,即用戶的信息跟隨隨數據庫。好比上述 test1雖然有 db2 庫的讀取權限,可是必定要先在db1庫進行身份驗證,直接訪問會提示驗證失敗。

• use db2

• db.auth("test1", "123aaa")          #在命令行裏面登陸test用戶(格式>db.auth("test1", "123aaa")    )

實例:

受權登陸
[root@localhost 01]# mongo --host 192.168.133.133 --port=27017 -u "admin" -p "admin122" --authenticationDatabase "admin"
[root@localhost ~]# mongo --host 192.168.133.133 --port=27017 -u "aming" -p "123456" --authenticationDatabase "admin"
MongoDB shell version v4.0.0
connecting to: mongodb://192.168.133.133:27017/
MongoDB server version: 4.0.0
> use admin
>  show users
> use db2 
> db.auth('test1','123aaa')
Error                 #錯誤的緣由:用戶是db1的,在db2下操做因此驗證錯誤

> use db1
> db.auth('test1','123aaa')
1
>

 

MongoDB用戶角色

• Read:容許用戶讀取指定數據庫

• readWrite:容許用戶讀寫指定數據庫

• dbAdmin:容許用戶在指定數據庫中執行管理函數,如索引建立、刪除,查看統計或訪問system.profile

• userAdmin:容許用戶向system.users集合寫入,能夠找指定數據庫裏建立、刪除和管理用戶

• clusterAdmin:只在admin數據庫中可用,賦予用戶全部分片和複製集相關函數的管理權限。

• readAnyDatabase:只在admin數據庫中可用,賦予用戶全部數據庫的讀權限

• readWriteAnyDatabase:只在admin數據庫中可用,賦予用戶全部數據庫的讀寫權限

• userAdminAnyDatabase:只在admin數據庫中可用,賦予用戶全部數據庫的userAdmin權限

• dbAdminAnyDatabase:只在admin數據庫中可用,賦予用戶全部數據庫的dbAdmin權限。

• root:只在admin數據庫中可用。超級帳號,超級權限
實例:

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, 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 (可選)指定封頂集合容許在文件的最大數量。

實例:

建立集合

> db.createCollection("mycol",{capped : ture,autoindexID :true.size : 6142800,max : 10000})               #顯示錯誤,緣由版本比較老
> show tables            #查看集合
> db.createCollection("mycol",{capped : ture,size : 6142800,max : 10000})
> show tables     #查看集合
mycol         #建立成功 了

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()  // 而後查看集合狀態

實例:

 

使用show collections查看集合
> show collections
mycol 

> db.Account.insert({AccountID:1,UserName:"123",password:"123456"})  //若是集合不存在,直接插入數據,則mongodb會自動建立集合,若是存在了。就插入進去
WriteResult({"nINSERTED" : 1})
> show tables
Account 
mycol

> db.Account.insert({AccountID:2,UserName:"zhang",password:"abcde"})
WriteResult({"nINSERTED" : 1})                             #建立集合zhang
> db.Account.update({AccountID:1},{"$set":{"Age":20}})       //更新
> db.Account.find()   //查看全部文檔,查看更新的結果
> db.Account.find({AccountID:1})   //根據條件查詢,查詢集合2
> db.Account.remove({AccountID:1})  //根據條件刪除

> db.Account.find()   //查看全部文檔,查看有沒有刪除成功

> show tables   //查看錶,發現建立的刪除了
mycol 
> db.Account.drop() //刪除全部文檔,即刪除集合
> db.mycol.drop(0
true
> show tables   //查看錶,發現都刪除了


> db.col2.insert({AccountID:1,UserName:"123",oassword:"123456"})       #col2是名字,隨便定義
WriteResult({"nINSERTED" : 1})
> db.printCollectionStats()    // 而後查看集合狀態

PHP鏈接MongoDB-mongodb.so

• cd /usr/local/src/

• git clone https://github.com/mongodb/mongo-php-driver

• cd mongo-php-driver

• git submodule update --init

• /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 = mongodb.so

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

• 你們還能夠到pecl官網上下載mongodb的擴展源碼包,

• cd /usr/local/src/

• wget https://pecl.php.net/get/mongodb-1.3.0.tgz

• tar zxvf mongodb-1.3.0.tgz

• cd mongodb-1.3.0

• /usr/local/php/bin/phpize       

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

• make && make install

• vi /usr/local/php/etc/php.ini //增長 extension = mongodb.so

• /usr/local/php/bin/php -m       #檢測有沒有mongodb的擴展

/etc/init.d/php-fpm restart         #重啓服務

 

• 到pecl官網上下載mongo的擴展源碼包

• cd /usr/local/src/

• wget https://pecl.php.net/get/mongo-1.6.16.tgz

• tar zxvf mongodb-1.6.16.tgz

• cd mongodb-1.6.16

• /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        #檢測有沒有mongodb的擴展

實例:

安裝mongodb的擴展

[root@localhost 01]# cd /usr/local/src/
[root@localhost src]# ls
[root@localhost src]# git clone https://github.com/mongodb/mongo-php-driver   #克隆到目錄裏面

[root@localhost src]# cd mongo-php-driver
[root@localhost mongo-php-driver]# git submodule update --init    #執行抓包
[root@localhost 01]#  /usr/local/php/bin/phpize

[root@localhost 01]# ./configure --with-php-config=/usr/local/php/bin/php-config

[root@localhost 01]#  make && make install

[root@localhost 01]# vi /usr/local/php/etc/php.ini        //在extension=redis.so下面添加,增長 extension = mongodb.so
[root@localhost 01]#  /usr/local/php/bin/php -m

mongodb的擴展源碼包,

[root@localhost 01]# cd /usr/local/src/

[root@localhost src]#  wget https://pecl.php.net/get/mongo-1.6.16.tgz 

[root@localhost src]#  tar zxvf mongodb-1.6.16.tgz
[root@localhost 01]# cd mongodb-1.6.16

[root@localhost mongodb-1.6.16]# /usr/local/php/bin/phpize

[root@localhost mongodb-1.6.16]#  ./configure --with-php-config=/usr/local/php/bin/php-config

[root@localhost mongodb-1.6.16]# make && make install

[root@localhost mongodb-1.6.16]]# ls /usr/local/php-fpm/lib/php/extensions/no-bedug-non-zts-20131343/         #查看是否生成一個mongo.so的文件
memcache.so     mongodb.so  mongo.so  opcache.so   opcache.o   redis.so

[root@localhost mongodb-1.6.16]]# vi /usr/local/php/etc/php.ini     //增長 extension = mongo.so
[root@localhost mongodb-1.6.16]]#  /usr/local/php/bin/php -m         #查看是否添加成功,有mongo.so,說明模塊安裝成功了


[root@localhost mongodb-1.6.16]]# /etc/init.d/php-fpm restart      #重啓服務

 

測試mongo擴展

• 參考文檔 https://docs.mongodb.com/ecosystem/drivers/php/

• http://www.runoob.com/mongodb/mongodb-php.html

• vi /usr/local/apache2/htdocs/1.php //增長
<?php

$m = new MongoClient(); // 鏈接

$db = $m->test; // 獲取名稱爲 "test" 的數據庫

$collection = $db->createCollection("runoob");           runoob集合

echo "集合建立成功";

?>

• curl  localhost/1.php

實例:

[root@localhost 01]# vi /usr/local/apache2/htdocs/1.php
<?php

$m = new MongoClient(); // 鏈接

$db = $m->test; // 獲取名稱爲 "test" 的數據庫

$collection = $db->createCollection("runoob");          

echo "集合建立成功";

?>
[root@localhost 01]# curl  localhost/1.php
集合建立成功

測試是否建立成功
[root@localhost 01]# mongo --host 192.168.2.229 --port 27017 -u admin -p 'admin122' --authenticationDatabase db 
> use test
switched to db test
> show tables
>
>

查看啓動腳本,去掉用戶名和密碼認證
[root@localhost 01]# vim /usr/local/lib/systemd/system/mongodb.service
去掉--auth

[root@localhost 01]# systemctl restart mongod         #重啓服務
[root@localhost 01]# systemctl daemon-reload
[root@localhost 01]# systemctl restart mongod 

[root@localhost 01]# curl  localhost/1.php
集合建立成功
[root@localhost 01]# mongo --host 192.168.2.229 --port 27017
> use test
Switched to db test
> show tables
runoob          #發現建立的集合
>
>

 

數據庫架構:主備+分庫 、主從+讀寫分離

1、數據庫架構原則

  1. 高可用

  2. 高性能

  3. 一致性

  4. 擴展性

2、常見的架構方案

方案一:主備架構,只有主庫提供讀寫服務,備庫冗餘做故障轉移

  1. 高可用分析:高可用,主庫掛了,keepalive(只是一種工具)會自動切換到備庫。這個過程對業務層是透明的,無需修改代碼或配置。

  2. 高性能分析:讀寫都操做主庫,很容易產生瓶頸。大部分互聯網應用讀多寫少,讀會先成爲瓶頸,進而影響寫性能。另外,備庫只是單純的備份,資源利用率50%,這點方案二可解決。

  3. 一致性分析:讀寫都操做主庫,不存在數據一致性問題。

  4. 擴展性分析:沒法經過加從庫來擴展讀性能,進而提升總體性能。

  5. 可落地分析:兩點影響落地使用。第一,性能通常,這點能夠經過創建高效的索引和引入緩存來增長讀性能,進而提升性能。這也是通用的方案。第二,擴展性差,這點能夠經過分庫分表來擴展。

方案二:雙主架構,兩個主庫同時提供服務,負載均衡

  1. 高可用分析:高可用,一個主庫掛了,不影響另外一臺主庫提供服務。這個過程對業務層是透明的,無需修改代碼或配置。

  2. 高性能分析:讀寫性能相比於方案一都獲得提高,提高一倍。

  3. 一致性分析:存在數據一致性問題。請看,一致性解決方案

  4. 擴展性分析:固然能夠擴展成三主循環,但筆者不建議(會多一層數據同步,這樣同步的時間會更長)。若是非得在數據庫架構層面擴展的話,擴展爲方案四。

  5. 可落地分析:兩點影響落地使用。第一,數據一致性問題,一致性解決方案可解決問題第二,主鍵衝突問題,ID統一地由分佈式ID生成服務來生成可解決問題。

方案三:主從架構,一主多從,讀寫分離

  1. 高可用分析:主庫單點,從庫高可用。一旦主庫掛了,寫服務也就沒法提供。

  2. 高性能分析:大部分互聯網應用讀多寫少,讀會先成爲瓶頸,進而影響總體性能。讀的性能提升了,總體性能也提升了。另外,主庫能夠不用索引,線上從庫和線下從庫也能夠創建不一樣的索引(線上從庫若是有多個仍是要創建相同的索引,否則得不償失;線下從庫是平時開發人員排查線上問題時查的庫,能夠建更多的索引)。

  3. 一致性分析:存在數據一致性問題。請看,一致性解決方案

  4. 擴展性分析:能夠經過加從庫來擴展讀性能,進而提升總體性能。(帶來的問題是,從庫越多須要從主庫拉取binlog日誌的端就越多,進而影響主庫的性能,而且數據同步完成的時間也會更長)

  5. 可落地分析:兩點影響落地使用。第一,數據一致性問題,一致性解決方案可解決問題第二,主庫單點問題,筆者暫時沒想到很好的解決方案。

注:思考一個問題,一臺從庫掛了會怎樣?讀寫分離之讀的負載均衡策略怎麼容錯?

方案四:雙主+主從架構,看似完美的方案

  1. 高可用分析:高可用。

  2. 高性能分析:高性能。

  3. 一致性分析:存在數據一致性問題。請看,一致性解決方案

  4. 擴展性分析:能夠經過加從庫來擴展讀性能,進而提升總體性能。(帶來的問題同方案二

  5. 可落地分析:同方案二,但數據同步又多了一層,數據延遲更嚴重

3、一致性解決方案

第一類:主庫和從庫一致性解決方案

注:圖中圈出的是數據同步的地方,數據同步(從庫從主庫拉取binlog日誌,再執行一遍)是須要時間的,這個同步時間內主庫和從庫的數據會存在不一致的狀況。若是同步過程當中有讀請求,那麼讀到的就是從庫中的老數據。以下圖。

  1. 直接忽略,若是業務容許延時存在,那麼就不去管它。

  2. 強制讀主,採用主備架構方案,讀寫都走主庫。用緩存來擴展數據庫讀性能 。有一點須要知道:若是緩存掛了,可能會產生雪崩現象,不過通常分佈式緩存都是高可用的

三、選擇讀主,寫操做時根據庫+表+業務特徵生成一個key放到Cache裏並設置超時時間(大於等於主從數據同步時間)。讀請求時,一樣的方式生成key先去查Cache,再判斷是否命中。若命中,則讀主庫,不然讀從庫。代價是多了一次緩存讀寫,基本能夠忽略。

    四、半同步複製,等主從同步完成,寫請求才返回。就是你們常說的「半同步複製」semi-sync。這能夠利用數據庫原生功能,實現比較簡單。代價是寫請求時延增加,吞吐量下降。

      五、數據庫中間件,引入開源(mycat等)或自研的數據庫中間層。我的理解,思路同選擇讀主。數據庫中間件的成本比較高,而且還多引入了一層。

第二類:DB和緩存一致性解決方案

先來看一下經常使用的緩存使用方式:

第一步:淘汰緩存;

第二步:寫入數據庫;

第三步:讀取緩存?返回:讀取數據庫;

第四步:讀取數據庫後寫入緩存。

若是按照這種方式,圖一,不會產生DB和緩存不一致問題;圖二,會產生DB和緩存不一致問題,即4.read先於3.sync執行。若是不作處理,緩存裏的數據可能一直是髒數據。解決方式以下:

4、我的的一些看法

架構演變

  1. 架構演變一:方案一 -> 方案一+分庫分表 -> 方案二+分庫分表 -> 方案四+分庫分表;

  2. 架構演變二:方案一 -> 方案一+分庫分表 -> 方案三+分庫分表 -> 方案四+分庫分表;

  3. 架構演變三:方案一 -> 方案二 -> 方案四 -> 方案四+分庫分表;

  4. 架構演變四:方案一 -> 方案三 -> 方案四 -> 方案四+分庫分表;

我的看法

  1. 加緩存和索引是通用的提高數據庫性能的方式;

  2. 分庫分錶帶來的好處是巨大的,但一樣也會帶來一些問題,詳見數據庫之分庫分表-垂直?水平?

  3. 無論是主備+分庫分表仍是主從+讀寫分離+分庫分表,都要考慮具體的業務場景。58到家發展四年,絕大部分的數據庫架構仍是採用方案一和方案一+分庫分表,只有極少部分用方案三+讀寫分離+分庫分表。另外,阿里雲提供的數據庫雲服務也都是主備方案,要想主從+讀寫分離須要二次架構。

  4. 記住一句話:不考慮業務場景的架構都是耍流氓。

 

 

 

參考連接:

https://mp.weixin.qq.com/s/PujuYPRZoE809_um8ERiIA

常見問題:

提示要更該內核,不用在乎

二、

答:這個zhang用戶 並無show user的權限。

三、用新建立的用戶能登陸,也能use admin切換到admin,可是show users失敗,請問什麼緣由?

建立用戶如:

db.createUser({user:"zhouxue",pwd:"123",roles:[{role:"read",db:"testdb"}]})

答:用戶 沒有show users的權限。

四、建立集合,還區分第一個字母大小寫?小寫的沒法更新或添加數據,大寫的就能夠,區分大小寫。。

五、Windows不能在本地計算機啓動MongoDB,錯誤代碼 100

Windows不能在本地計算機啓動MongoDB,錯誤代碼 100

解決辦法:

1. MongoDB安裝目錄\data\將此文件夾下的mongod.lock刪除

2. 查看官方文檔或按照上一篇安裝文章檢查是否設置dbpath或logpath等,若是沒有設置,默認是安裝在C盤.

https://blog.csdn.net/qq_20545159/article/details/48653533

六、如何啓動mongodb服務

1,首先找到mongodb安裝位置
2,使用控制檯進入mongodb的bin目錄
3,在bin目錄下輸入 mongod --dbpath 存放mongodb的數據位置
4,在bin目錄下輸入mongo命令,進入mongodb的命令行

 

 

 

參考連接  : 

MongoDB、Hbase、Redis等NoSQL優劣勢、應用場景  : https://mp.weixin.qq.com/s/Ok-T97bNETY-vhiB8oJtbg

 

連接:

linux 下安裝MongoDB 和配置PHP擴展(86_64) : https://www.cnblogs.com/orangegem/p/7129230.html

MongoDB詳解(一) :http://blog.51cto.com/hmtk520/2109487

MongoDB詳解(二) :  http://blog.51cto.com/hmtk520/2113270

MongoDB 自增 id 的生成   :  https://mp.weixin.qq.com/s/KnRsJ4qnb6PA4v1AVFwVNw

Centos6.x 安裝Mongodb 以及Mongodb php擴展 : http://www.voidcn.com/code/p-fnxzhzis-m.html

Mongodb 教程    : http://www.voidcn.com/course/project/bairlz

The Little MongoDB Book 中文版    :    http://www.voidcn.com/course/project/kitwwb

mongodb 3.4 集羣搭建:分片+副本集 : https://mp.weixin.qq.com/s/8_-F36j6FQ0nXLiGqJJtXA

( 易百教程 ) MongoDB教程  : https://www.yiibai.com/mongodb/

MongoDB中文社區  :  http://www.mongoing.com/

mongodb的學習過程  :  http://blog.51cto.com/xiaoluoge/1624732

mongodb的基本語法  :  http://blog.51cto.com/xiaoluoge/1624764

MongoDB之常見操做命令彙總  :https://mp.weixin.qq.com/s/StOhmX8FP9GsKcGAXva2Bw

MongoDB安裝:https://mp.weixin.qq.com/s/GRsj9PRlLPoKFhMuTe-FOw

 MongoDB教程 : https://www.w3cschool.cn/mongodb/

MongoDB基本命令  : https://www.qdfuns.com/article/15571/5a50897c698fa803a47ea96fc07a281f.html

Linux系統安裝MongonDB : https://www.qdfuns.com/article/31238/7845b8244e34014159b284e9cca615e3.html

 

菜鳥 MongoDB 教程 : http://www.runoob.com/mongodb/mongodb-tutorial.html

(劉逾)使用MariaDB數據庫管理系統 : https://www.linuxprobe.com/chapter-18.html

MongoDB經常使用API及優化 :https://blog.csdn.net/paul_wei2008/article/details/19349695

mongodb : https://www.cnblogs.com/xybaby/tag/mongodb/

談談工做中使用mongo遇到的坑   :  https://mp.weixin.qq.com/s/gwcpAUFlQXnInU-vYhnAqA

MongoDB、Hbase、Redis等NoSQL優劣勢、應用場景   : https://mp.weixin.qq.com/s?__biz=MzI0MDQ4MTM5NQ==&mid=2247486785&idx=1&sn=420bbde89e04959bf5662a431d016d2e&chksm=e91b685dde6ce14b594eed1f5151881e4287c6ced79ccdb958d45a285fa5cf28dd29c8fd895e&token=1865724735&lang=zh_CN#rd  

 

mongodb 系列  : https://www.cnblogs.com/xybaby/tag/mongodb/

c#操做MangoDB 之MangoDB CSharp Driver驅動詳解   :  https://www.cnblogs.com/knowledgesea/p/5050969.html

MongoDB高級查詢詳細   :  https://www.cnblogs.com/knowledgesea/p/4634464.html

MongoDB下載安裝與簡單增刪改查  :   https://www.cnblogs.com/knowledgesea/p/4631712.html

Ubuntu安裝mongoDB報錯       :   https://www.jianshu.com/p/e03764a32760

 

MongoDB基於GridFS實現文件的分佈式存儲  :      http://blog.51cto.com/rfyiamcool/1219848

centos7部署MongoDB數據庫複製集(超詳細) 薦          :         http://blog.51cto.com/11638832/2128933

centos7部署Mongodb複製集結合分片(超詳細)        :     http://blog.51cto.com/11638832/2129455

【MongoDB】查看集合是否分片     :http://blog.51cto.com/l0vesql/2151905

【MongoDB】管理命令收集      :  http://blog.51cto.com/l0vesql/2151897

【MongoDB】事務      : http://blog.51cto.com/l0vesql/2134631

【MongoDB】4.0版本事務上手測試             : http://blog.51cto.com/l0vesql/2134532

【NoSQL】mongo_detail.py中均衡器信息的處理思路            :    http://blog.51cto.com/l0vesql/2132662

【NoSQL】拋棄VIP構建MongoDB RepSet +Consul高可用切換系統        : http://blog.51cto.com/l0vesql/2058464

mongoDB副本集的搭建              :           http://blog.51cto.com/l0vesql/1973850

MongoDB複製集及數據分片詳解       :         http://blog.51cto.com/scholar/1673939

MongoDB啓用身份驗證             :   http://blog.51cto.com/ityunwei2017/2052443

 

詳解MongoDB複製集            :      http://blog.51cto.com/13728740/2176550

MongoDB複製集選舉原理及管理詳解      :       http://blog.51cto.com/13728740/2175905

Mongodb分片原理詳解及架構部署      :        http://blog.51cto.com/13728740/2175637

MongoDB在線yum源安裝及基本命令詳解       :    http://blog.51cto.com/13728740/2175395

管理Mongodb 集羣所用到的系統管理及監控        : http://blog.51cto.com/rfyiamcool/1193765

 

 

Linux下Mongodb安裝和啓動配置 薦                :                 http://blog.51cto.com/ityunwei2017/1915871

 

MongoDB(一)     :     http://blog.51cto.com/cuchadanfan/1700711

MongoDB(二) :          http://blog.51cto.com/cuchadanfan/1701135

MongoDB(三)      :  http://blog.51cto.com/cuchadanfan/1701493

MongoDB(四)之副本集    :        http://blog.51cto.com/cuchadanfan/1706723

MongoDB(五)之分片        :          http://blog.51cto.com/cuchadanfan/1708143

 

mongodb 3.4 集羣搭建:分片+副本集       :      https://www.cnblogs.com/ityouknow/p/7344005.html

mongodb 3.4 集羣搭建升級版 五臺集羣           :         https://www.cnblogs.com/ityouknow/p/7566682.html

 

放棄redis使用mongodb作任務隊列支持增刪改管理 薦      : http://blog.51cto.com/rfyiamcool/1404953

Mongodb千萬級數據在python下的綜合壓力測試及應用探討 薦   : http://blog.51cto.com/rfyiamcool/1329351

基於python的REST框架eve測試與mongodb的數據操做 薦    :   http://blog.51cto.com/rfyiamcool/1325511

centos7部署MongoDB數據庫複製集(超詳細)薦   :   http://blog.51cto.com/11638832/2128933

MongoDB安裝及用戶名密碼管理       : http://blog.51cto.com/nanchunle/1701434

MongoDB (31篇) :https://blog.csdn.net/qq_20545159/article/category/5832341

MongoDb優化指南   : https://mp.weixin.qq.com/s/fA4Y69Xi7iZPdF8LwBSayg

 

Ubuntu 18.04下部署MongoDB複製集(副本集 ): https://www.linuxidc.com/Linux/2018-11/155147.htm

MongoDB主從複製和副本集 : https://www.linuxidc.com/Linux/2018-11/155606.htm

MongoDB 副本集配置詳解 : https://www.linuxidc.com/Linux/2018-09/153963.htm

MongoDB集羣架構之副本集架構 :https://www.linuxidc.com/Linux/2018-10/154874.htm

MongoDB 副本集升級方法及注意事項  : https://www.linuxidc.com/Linux/2017-11/148304.htm

MongoDB副本集的經常使用操做及原理 : https://www.linuxidc.com/Linux/2017-05/143913.htm

使用zabbix監控mongodb的方法 :https://www.jb51.net/article/79882.htm

如何利用MongoDB實現高性能,高可用的雙活應用架構? :  https://mp.weixin.qq.com/s/8woD6b5vzFMvMSyyhuKmeA

mongodb  系列 : https://www.cnblogs.com/wangshouchang/category/918600.html

MongoDB操做&&注入漏洞&&未受權訪問漏洞 : https://mp.weixin.qq.com/s/izpkRMPYFZbjfP13r_rLWg

相關文章
相關標籤/搜索