• 官網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最大的特色是他支持的查詢語言很是強大,其語法有點相似於面向對象的查詢語言,幾乎能夠實現相似關係數據庫單表查詢的絕大部分功能,並且還支持對數據創建索引。
1)更高的寫負載,MongoDB擁有更高的插入速度。
2)處理很大的規模的單表,當數據表太大的時候能夠很容易的分割表。
3)高可用性,設置M-S不只方便並且很快,MongoDB還能夠快速、安全及自動化的實現節點 (數據中心)故障轉移。
4)快速的查詢,MongoDB支持二維空間索引,好比管道,所以能夠快速及精確的從指定位置 獲取數據。MongoDB在啓動後會將數據庫中的數據以文件映射的方式加載到內存中。若是內 存資源至關豐富的話,這將極大地提升數據庫的查詢速度。
5)非結構化數據的爆發增加,增長列在有些狀況下可能鎖定整個數據庫,或者增長負載從而 致使性能降低,因爲MongoDB的弱數據結構模式,添加1個新字段不會對舊錶格有任何影響, 整個過程會很是快速。
1)不支持事務。
2)MongoDB佔用空間過大 。
3)MongoDB沒有成熟的維護工具。
1.)適用於實時的插入、更新與查詢的需求,並具有應用程序實時數據存儲所需的複製及高度伸縮性;
2) 很是適合文檔化格式的存儲及查詢;
3.)高伸縮性的場景:MongoDB 很是適合由數十或者數百臺服務器組成的數據庫。
4.)對性能的關注超過對功能的要求。
通常mongodb部署主從、或者mongodb分片集羣;建議3臺或5臺服務器來部署。MongoDB分片的基本思想就是將集合切分紅小塊。這些塊分散到若干片裏面,每一個片只負責總數據的一部分。 對於客戶端來講,無需知道數據被拆分了,也無需知道服務端哪一個分片對應哪些數據。數據在分片以前須要運行一個路由進程,進程名爲mongos。這個路由器知道全部數據的存放位置,知道數據和片的對應關係。對客戶端來講,它僅知道鏈接了一個普通的mongod,在請求數據的過程當中,經過路由器上的數據和片的對應關係,路由到目標數據所在的片上,若是請求有了迴應,路由器將其收集起來回送給客戶端。
面向集合存儲,易於存儲對象類型的數據
模式自由
支持動態查詢
支持徹底索引,包含內部對象
支持查詢
支持複製和故障恢復
使用高效的二進制數據存儲,包括大型對象(如視頻等)
自動處理碎片,以支持雲計算層次的擴展性
支持 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.」
使用文件的優勢是:
適合場景:
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
logs文件夾中mongodb.log文件
• 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
• 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
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 >
• 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 >
• Read:容許用戶讀取指定數據庫
• readWrite:容許用戶讀寫指定數據庫
• dbAdmin:容許用戶在指定數據庫中執行管理函數,如索引建立、刪除,查看統計或訪問system.profile
• userAdmin:容許用戶向system.users集合寫入,能夠找指定數據庫裏建立、刪除和管理用戶
• clusterAdmin:只在admin數據庫中可用,賦予用戶全部分片和複製集相關函數的管理權限。
• readAnyDatabase:只在admin數據庫中可用,賦予用戶全部數據庫的讀權限
• readWriteAnyDatabase:只在admin數據庫中可用,賦予用戶全部數據庫的讀寫權限
• userAdminAnyDatabase:只在admin數據庫中可用,賦予用戶全部數據庫的userAdmin權限
• dbAdminAnyDatabase:只在admin數據庫中可用,賦予用戶全部數據庫的dbAdmin權限。
• root:只在admin數據庫中可用。超級帳號,超級權限
實例:
• db.version() //查看版本
• use userdb //若是庫存在就切換,不存在就建立
• show dbs //查看庫,此時userdb並無出現,這是由於該庫是空的,尚未任何集合,只須要建立一個集合就能看到了
• db.createCollection('clo1') //建立集合clo1,在當前庫下面建立
• db.dropDatabase() //刪除當前庫,要想刪除某個庫,必須切換到那個庫下
• db.stats() //查看當前庫的信息
• db.serverStatus() //查看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 #建立成功 了
• 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() // 而後查看集合狀態
• 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 #重啓服務
• 參考文檔 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 #發現建立的集合 > >
高可用
高性能
一致性
擴展性
高可用分析:高可用,主庫掛了,keepalive(只是一種工具)會自動切換到備庫。這個過程對業務層是透明的,無需修改代碼或配置。
高性能分析:讀寫都操做主庫,很容易產生瓶頸。大部分互聯網應用讀多寫少,讀會先成爲瓶頸,進而影響寫性能。另外,備庫只是單純的備份,資源利用率50%,這點方案二可解決。
一致性分析:讀寫都操做主庫,不存在數據一致性問題。
擴展性分析:沒法經過加從庫來擴展讀性能,進而提升總體性能。
可落地分析:兩點影響落地使用。第一,性能通常,這點能夠經過創建高效的索引和引入緩存來增長讀性能,進而提升性能。這也是通用的方案。第二,擴展性差,這點能夠經過分庫分表來擴展。
高可用分析:高可用,一個主庫掛了,不影響另外一臺主庫提供服務。這個過程對業務層是透明的,無需修改代碼或配置。
高性能分析:讀寫性能相比於方案一都獲得提高,提高一倍。
一致性分析:存在數據一致性問題。請看,一致性解決方案。
擴展性分析:固然能夠擴展成三主循環,但筆者不建議(會多一層數據同步,這樣同步的時間會更長)。若是非得在數據庫架構層面擴展的話,擴展爲方案四。
可落地分析:兩點影響落地使用。第一,數據一致性問題,一致性解決方案可解決問題。第二,主鍵衝突問題,ID統一地由分佈式ID生成服務來生成可解決問題。
高可用分析:主庫單點,從庫高可用。一旦主庫掛了,寫服務也就沒法提供。
高性能分析:大部分互聯網應用讀多寫少,讀會先成爲瓶頸,進而影響總體性能。讀的性能提升了,總體性能也提升了。另外,主庫能夠不用索引,線上從庫和線下從庫也能夠創建不一樣的索引(線上從庫若是有多個仍是要創建相同的索引,否則得不償失;線下從庫是平時開發人員排查線上問題時查的庫,能夠建更多的索引)。
一致性分析:存在數據一致性問題。請看,一致性解決方案。
擴展性分析:能夠經過加從庫來擴展讀性能,進而提升總體性能。(帶來的問題是,從庫越多須要從主庫拉取binlog日誌的端就越多,進而影響主庫的性能,而且數據同步完成的時間也會更長)
可落地分析:兩點影響落地使用。第一,數據一致性問題,一致性解決方案可解決問題。第二,主庫單點問題,筆者暫時沒想到很好的解決方案。
注:思考一個問題,一臺從庫掛了會怎樣?讀寫分離之讀的負載均衡策略怎麼容錯?
高可用分析:高可用。
高性能分析:高性能。
一致性分析:存在數據一致性問題。請看,一致性解決方案。
擴展性分析:能夠經過加從庫來擴展讀性能,進而提升總體性能。(帶來的問題同方案二)
可落地分析:同方案二,但數據同步又多了一層,數據延遲更嚴重。
第一類:主庫和從庫一致性解決方案
注:圖中圈出的是數據同步的地方,數據同步(從庫從主庫拉取binlog日誌,再執行一遍)是須要時間的,這個同步時間內主庫和從庫的數據會存在不一致的狀況。若是同步過程當中有讀請求,那麼讀到的就是從庫中的老數據。以下圖。
直接忽略,若是業務容許延時存在,那麼就不去管它。
強制讀主,採用主備架構方案,讀寫都走主庫。用緩存來擴展數據庫讀性能 。有一點須要知道:若是緩存掛了,可能會產生雪崩現象,不過通常分佈式緩存都是高可用的。
三、選擇讀主,寫操做時根據庫+表+業務特徵生成一個key放到Cache裏並設置超時時間(大於等於主從數據同步時間)。讀請求時,一樣的方式生成key先去查Cache,再判斷是否命中。若命中,則讀主庫,不然讀從庫。代價是多了一次緩存讀寫,基本能夠忽略。
四、半同步複製,等主從同步完成,寫請求才返回。就是你們常說的「半同步複製」semi-sync。這能夠利用數據庫原生功能,實現比較簡單。代價是寫請求時延增加,吞吐量下降。
五、數據庫中間件,引入開源(mycat等)或自研的數據庫中間層。我的理解,思路同選擇讀主。數據庫中間件的成本比較高,而且還多引入了一層。
第二類:DB和緩存一致性解決方案
先來看一下經常使用的緩存使用方式:
第一步:淘汰緩存;
第二步:寫入數據庫;
第三步:讀取緩存?返回:讀取數據庫;
第四步:讀取數據庫後寫入緩存。
若是按照這種方式,圖一,不會產生DB和緩存不一致問題;圖二,會產生DB和緩存不一致問題,即4.read先於3.sync執行。若是不作處理,緩存裏的數據可能一直是髒數據。解決方式以下:
架構演變一:方案一 -> 方案一+分庫分表 -> 方案二+分庫分表 -> 方案四+分庫分表;
架構演變二:方案一 -> 方案一+分庫分表 -> 方案三+分庫分表 -> 方案四+分庫分表;
架構演變三:方案一 -> 方案二 -> 方案四 -> 方案四+分庫分表;
架構演變四:方案一 -> 方案三 -> 方案四 -> 方案四+分庫分表;
加緩存和索引是通用的提高數據庫性能的方式;
分庫分錶帶來的好處是巨大的,但一樣也會帶來一些問題,詳見數據庫之分庫分表-垂直?水平?
無論是主備+分庫分表仍是主從+讀寫分離+分庫分表,都要考慮具體的業務場景。58到家發展四年,絕大部分的數據庫架構仍是採用方案一和方案一+分庫分表,只有極少部分用方案三+讀寫分離+分庫分表。另外,阿里雲提供的數據庫雲服務也都是主備方案,要想主從+讀寫分離須要二次架構。
記住一句話:不考慮業務場景的架構都是耍流氓。
參考連接:
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
解決辦法:
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
Centos6.x 安裝Mongodb 以及Mongodb php擴展 : http://www.voidcn.com/code/p-fnxzhzis-m.html
mongodb 3.4 集羣搭建:分片+副本集 : https://mp.weixin.qq.com/s/8_-F36j6FQ0nXLiGqJJtXA
mongodb的學習過程 : http://blog.51cto.com/xiaoluoge/1624732
mongodb的基本語法 : http://blog.51cto.com/xiaoluoge/1624764
MongoDB之常見操做命令彙總 :https://mp.weixin.qq.com/s/StOhmX8FP9GsKcGAXva2Bw
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
(劉逾)使用MariaDB數據庫管理系統 : https://www.linuxprobe.com/chapter-18.html
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
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
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
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