mongodb介紹和配置

Mongodb介紹

mongodb官網:www.mongodb.com 

c++編寫,基於分佈式,屬於NoSQL的一種

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

mongodb是將數據存儲爲一個文檔,數據結構由鍵值(key=>value)對組成。mongodb文檔類似於json對象。字段值可以包含其他文檔、數組及文檔數組

關於json

JSON:JavaScript 對象表示法(JavaScript Object Notation)。

JSON 是存儲和交換文本信息的語法。類似 XML。

JSON 比 XML 更小、更快,更易解析。

每一章中用到的實例

 

{
"employees": [
{ "firstName":"Bill" , "lastName":"Gates" },
{ "firstName":"George" , "lastName":"Bush" },
{ "firstName":"Thomas" , "lastName":"Carter" }
]
}

這個 employee 對象是包含 3 個員工記錄(對象)的數組。

因爲基於分佈式,所以很容易擴展



mongodb能夠記錄非關係型數據庫記錄不了的鍵值,如用戶訂單信息,包含商品和訂單號,這樣的記錄是非關係型數據庫memcached、redis記錄不了的

mongodb和關係型數據庫語句/概念對比

SQL術語/概念Mongodb術語/概念解釋說明
databasedatabase數據庫
tablecollection數據庫表/集合
rowdocument記錄數據行/文檔
columnfield數據字段/域
indexindex索引
table joins
表連接,Mongodb不支持
primary key primary key  主鍵,Mongodb自動將_id字段設置爲主鍵


Mongodb數據結構

圖片.png



mongodb安裝

從官網找yum安裝源的文件配置內容

https://docs.mongodb.com/manual/tutorial/

複製yum文件的內容存到yum.repos.d目錄下。配置文件名字自定義,但結尾後綴必須以repo結尾。如

 

[root@nfs1 ~]# vim /etc/yum.repos.d/mongodb.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

保存這個yum源配置文件後執行yum install的命令來安裝Mongodb

首先查看Mongodb的yum安裝包,這裏安裝Mongodb-org的mongodb最新版本

 

[root@nfs1 ~]# yum list |grep mongodb
Trying other mirror.
collectd-write_mongodb.x86_64           5.8.1-1.el7                    epel
mongodb.x86_64                          2.6.12-6.el7                   epel
mongodb-org.x86_64                      4.0.4-1.el7                    mongodb-org-4.0
mongodb-org-mongos.x86_64               4.0.4-1.el7                    mongodb-org-4.0
mongodb-org-server.x86_64               4.0.4-1.el7                    mongodb-org-4.0
mongodb-org-shell.x86_64                4.0.4-1.el7                    mongodb-org-4.0
mongodb-org-tools.x86_64                4.0.4-1.el7                    mongodb-org-4.0
mongodb-server.x86_64                   2.6.12-6.el7                   epel
mongodb-test.x86_64                     2.6.12-6.el7                   epel
nodejs-mongodb.noarch                   1.4.7-1.el7                    epel
php-mongodb.noarch                      1.0.4-1.el7                    epel
php-pecl-mongodb.x86_64                 1.1.10-1.el7                   epel
poco-mongodb.x86_64                     1.6.1-3.el7                    epel
syslog-ng-mongodb.x86_64                3.5.6-3.el7                    epel
[root@nfs1 ~]# yum install -y  mongodb-org
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfileInstalled:
  mongodb-org.x86_64 0:4.0.4-1.el7

Dependency Installed:
  mongodb-org-mongos.x86_64 0:4.0.4-1.el7     mongodb-org-server.x86_64 0:4.0.4-1.el7     mongodb-org-shell.x86_64 0:4.0.4-1.el7     mongodb-org-tools.x86_64 0:4.0.4-1.el7

Complete!
 * elrepo: mirrors.tuna.tsinghua.edu.cn
 * epel: mirrors.yun-idc.com
--------------安裝過程略
Installed:
  mongodb-org.x86_64 0:4.0.4-1.el7

Dependency Installed:
  mongodb-org-mongos.x86_64 0:4.0.4-1.el7     mongodb-org-server.x86_64 0:4.0.4-1.el7     mongodb-org-shell.x86_64 0:4.0.4-1.el7     mongodb-org-tools.x86_64 0:4.0.4-1.el7

Complete!

至此,yum安裝Mongodb完成



鏈接Mongodb

首先我們配置一下mongodb的配置文件,指定日誌、數據存儲和啓動文件的路徑,並修改監聽地址,多個地址使用逗號分隔

 

[root@nfs1 ~]# vim /etc/mongod.conf
systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongod.log

storage:
  dbPath: /var/lib/mongo
  journal:
    enabled: true

processManagement:
  fork: true # fork and run in background
  pidFilePath: /var/run/mongodb/mongod.pid # location of pidfile
  timeZoneInfo: /usr/share/zoneinfo

net:
  port: 27017
  bindIp: 127.0.0.1,192.168.1.234

啓動mongodb,並查看啓動監聽的端口

 

[root@nfs1 ~]# netstat -ntlp |grep mongo
tcp        0      0 192.168.1.234:27017     0.0.0.0:*               LISTEN      2187/mongod
tcp        0      0 127.0.0.1:27017         0.0.0.0:*               LISTEN      2187/mongod
[root@nfs1 ~]# ps -aux |grep mongo
mongod     2187  2.7  3.0 1070084 57192 ?       Sl   23:24   0:00 /usr/bin/mongod -f /etc/mongod.conf
root       2216  0.0  0.0 112704   960 pts/0    R+   23:25   0:00 grep --color=auto mongo

鏈接mongodb使用mongo命令,默認連接本機的mongodb

也可以指定連接遠程的mongodb主機和端口進行連接

 

[root@nfs1 ~]# mongo --host 127.0.0.1 --port 27017
MongoDB shell version v4.0.4
connecting to: mongodb://127.0.0.1:27017/

如果mongodb配置有密碼,那麼需要在連接時指定下用戶名和密碼,格式爲:

 

mongo --host 127.0.0.1 --port 27017 -uusername -ppasswd

在針對mongodb連接時驗證用戶密碼是針對某個庫來的,這樣的情況就需要在指定用戶名密碼的時候同時指定庫名稱來操作

執行命令格式爲:

 

mongo  -uusername -ppasswd  --authenticationDatabase db



mongodb用戶管理

創建管理用戶首先需要登入mongodb並切換到admin庫中進行操作

授權語句中的格式:

user指定用戶。customData爲說明字段,可以省略。pwd爲密碼。roles指定用戶角色。db指定授權庫的名稱

 

> use admin                      切換到admin庫中
switched to db admin
> db.createUser({ user:"admin",customData:{dascription:"superuser"},pwd:"admin123",roles:[{role:"root",db:"admin"}]})
Successfully added user: {
 "user" : "admin",
 "customData" : {
  "dascription" : "superuser"
 },
 "roles" : [
  {
   "role" : "root",
   "db" : "admin"
  }
 ]
}

列出所有用戶、查看當前庫下的所有用戶,需要切換到那個庫中才能進行操作

 

> db.sysconfig.users.find()
> show users
{
    "_id" : "test.admin",
    "user" : "admin",
    "db" : "test",
    "customData" : {
        "dascription" : "superuser"
    },
    "roles" : [
        {
            "role" : "root",
            "db" : "admin"
        }
    ],
    "mechanisms" : [
        "SCRAM-SHA-1",
        "SCRAM-SHA-256"
    ]
}
{
    "_id" : "test.linux",
    "user" : "linux",
    "db" : "test",
    "customData" : {
        "dascription" : "superuser"
    },
    "roles" : [
        {
            "role" : "root",
            "db" : "admin"
        }
    ],
    "mechanisms" : [
        "SCRAM-SHA-1",
        "SCRAM-SHA-256"
    ]
}

刪除一個授權用戶,刪除後在執行查看用戶則爲空了

 

> db.dropUser('admin')
true
> show users
{
    "_id" : "test.linux",
    "user" : "linux",
    "db" : "test",
    "customData" : {
        "dascription" : "superuser"
    },
    "roles" : [
        {
            "role" : "root",
            "db" : "admin"
        }
    ],
    "mechanisms" : [
        "SCRAM-SHA-1",
        "SCRAM-SHA-256"
    ]
}

在一個庫中查詢一個授權用戶,查詢授權用戶必須先要切換到授權庫當中,然後執行查詢操作

 

> use admin
switched to db admin
> db.system.users.find()
{ "_id" : "test.linux", "user" : "linux", "db" : "test", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "9Oj9a9ZQHc7HDZKAfzTR+g==", "storedKey" : "i4F70HK7OUvA0L1Yw3uOjwMxMcw=", "serverKey" : "cLtXMoPnqmyAhVytgkBhmUeKfNE=" }, "SCRAM-SHA-256" : { "iterationCount" : 15000, "salt" : "CgtK7ceZTeJHAvXr4yA/cy1jbyklsr3ZuC5WOg==", "storedKey" : "lN1xymxwGQ6FA2AybYz0xvTXAXXN0LbERWv/PIv9cKI=", "serverKey" : "yaKBor03hu08x2GAtS+f/Jz0iJ/VD8T5rL7HTIm9dIY=" } }, "customData" : { "dascription" : "superuser" }, "roles" : [ { "role" : "root", "db" : "admin" } ] }

生效用戶,授權用戶後是不生效的,需要配置一下啓動腳本,找到OPTIONS的那行,增加一個啓動選項:--auth

 

[root@nfs1 ~]# vim /usr/lib/systemd/system/mongod.service

[Unit]
Description=MongoDB Database Server
After=network.target
Documentation=https://docs.mongodb.org/manual

[Service]
User=mongod
Group=mongod
Environment="OPTIONS=--auth -f /etc/mongod.conf"

重新啓動mongodb服務,讓配置文件加載生效

 

[root@nfs1 ~]# systemctl restart mongod
Warning: mongod.service changed on disk. Run 'systemctl daemon-reload' to reload units.
[root@nfs1 ~]# systemctl daemon-reload
[root@nfs1 ~]# systemctl restart mongod

在正常登錄下(沒有用戶授權的情況下),mongodb是不能允許進行命令操作的。

會出現如下提示:Error: command usersInfo requires authentication

 

[root@nfs1 ~]# mongo --host 127.0.0.1 --port 27017
MongoDB shell version v4.0.4
connecting to: mongodb://127.0.0.1:27017/
Implicit session: session { "id" : UUID("beff9fe6-6c04-4391-94fd-79478f1393a7") }
MongoDB server version: 4.0.4
> use admin
switched to db admin
> show users;
2018-11-17T01:48:58.860+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:1763:1
shellHelper.show@src/mongo/shell/utils.js:859:9
shellHelper@src/mongo/shell/utils.js:766:15
@(shellhelp2):1:1

在沒有授權的情況下不能執行某些操作,那麼我們指定下授權用戶和密碼來登入操作

在指定了授權用戶和指定庫後能夠登錄到mongodb進行查看授權用戶信息

登入格式:mongo --host 127.0.0.1 --port 27017 -u linux -p 'admin123' --authenticationDatabase "admin"

登入時必須針對這個庫來操作

 

[root@nfs1 ~]# mongo --host 127.0.0.1 --port 27017 -u linux -p 'admin123' --authenticationDatabase "admin"
MongoDB shell version v4.0.4
connecting to: mongodb://127.0.0.1:27017/
Implicit session: session { "id" : UUID("7c8c31e0-e685-433d-b61a-3c3c514ee6a9") }
MongoDB server version: 4.0.4
Server has startup warnings:
2018-11-17T01:43:59.402+0800 I CONTROL [initandlisten]
2018-11-17T01:43:59.402+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2018-11-17T01:43:59.402+0800 I CONTROL [initandlisten] ** We suggest setting it to 'never'
2018-11-17T01:43:59.403+0800 I CONTROL [initandlisten]
2018-11-17T01:43:59.403+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2018-11-17T01:43:59.403+0800 I CONTROL [initandlisten] ** We suggest setting it to 'never'
2018-11-17T01:43:59.403+0800 I CONTROL [initandlisten]
---
Enable MongoDB's free cloud-based monitoring service, which will then receive 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 accessible to you
and anyone you share the URL with. 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()
To permanently disable this reminder, run the following command: db.disableFreeMonitoring()
---

> use admin
switched to db admin
> show users
{
 "_id" : "admin.linux",
 "user" : "linux",
 "db" : "admin",
 "customData" : {
  "dascription" : "superuser"
 },
 "roles" : [
  {
   "role" : "root",
   "db" : "admin"
  }
 ],
 "mechanisms" : [
  "SCRAM-SHA-1",
  "SCRAM-SHA-256"
 ]
}

用戶訪問授權,讓user1用戶對db1庫有讀寫權限,對db2庫只讀權限

授權命令如:

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

 

> db.createUser({user:"user1",pwd:"123abc",roles:[{role:"readWrite",db:"db1"},{role:"read",db:"db2"}]})
Successfully added user: {
 "user" : "user1",
 "roles" : [
  {
   "role" : "readWrite",
   "db" : "db1"
  },
  {
   "role" : "read",
   "db" : "db2"
  }
 ]
}

驗證過程:

user1對db1庫有讀寫權限,對db2只有只讀權限。

之所以先use db1,表示用戶在db1庫中創建,一定就需要db1庫來驗證身份,用戶信息是跟隨數據庫的。比如上述user1用戶雖然有db2的訪問權限,但是一定要在db1上進行身份驗證,直接訪問db2會提示驗證失敗

 

> use db1
switched to db db1
> db.auth('user1','123abc')
1

認證成功後就可以在db2下的數據庫中創建數據了



mongodb的授權用戶類別和權限類別

 

Read:允許用戶讀取指定數據庫
readWrite:允許用戶讀寫指定數據庫
dbAdmin:允許用戶在指定數據庫中執行管理函數,如索引創建、刪除,查看統計或訪問system.profile.
userAdmin:允許用戶向system.users集合寫入,可以找指定數據庫裏創建、刪除和管理用戶
clusterAdmin:只在admin數據庫中可用,賦予用戶所有分片和複製集相關函數的管理權限。
readAnyDatabase:只在admin數據庫中可用,賦予用戶所有數據庫的讀權限
readWriteAnyDatabase:只在admin數據庫中可用,賦予用戶所有數據庫的讀寫權限
userAdminAnyDatabase :只在admin數據庫中可用,賦予用戶所有數據庫的userAdmin權限
dbAdminAnyDatabase;只在admin數據庫中可用,賦予用戶所有數據庫的dbAdmin權限。
root:只在admin數據庫中可用。超級賬號,超級權限



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