Ubuntu16.04下mongodb的安裝、使用者配置、遠端連線
一、安裝mongodb
安裝過程,參考:https://www.cnblogs.com/hupeng1234/p/7000499.html
版本更新可以及時跟蹤官網:
https://docs.mongodb.com/master/tutorial/install-mongodb-on-ubuntu/
1.匯入包管理系統使用的公鑰
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 0C49F3730359A14518585931BC711F9BA15703C6
2.為MongoDB建立一個列表檔案
根據版本建立/etc/apt/sources.list.d/mongodb-org-3.4.list 列表檔案
Ubuntu 14.04
echo "deb [ arch=amd64 ] http://repo.mongodb.org/apt/ubuntu trusty/mongodb-org/3.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.4.list
Ubuntu 16.04
echo "deb [ arch=amd64,arm64 ] http://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.4.list
3.更新本地包資料庫
sudo apt-get update
4.安裝最新版本的MongoDB
sudo apt-get install -y mongodb-org
5.檢視配置檔案,留意下security這個引數,接下來的使用者身份驗證會用到。
配置檔案mongod.conf所在路徑: /etc/mongod.conf
# mongod.conf
# for documentation of all options, see:
# http://docs.mongodb.org/manual/reference/configuration-options/
# Where and how to store data.
storage:
dbPath: /var/lib/mongodb #資料庫儲存路徑
journal:
enabled: true
# engine:
# mmapv1:
# wiredTiger:
# where to write logging data.
systemLog:
destination: file
logAppend: true #以追加的方式寫入日誌
path: /var/log/mongodb/mongod.log #日誌檔案路徑
# network interfaces
net:
port: 27017
bindIp: 127.0.0.1 #繫結監聽的ip 127.0.0.1只能監聽本地的連線,可以改為0.0.0.0
#processManagement:
#security:
#operationProfiling:
#replication:
#sharding:
## Enterprise-Only Options:
#auditLog:
#snmp:
6.啟動和關閉MongoDB
sudo service mongod start # 啟動
sudo service mongod stop # 關閉
ps aux | grep mongod # 檢視守護程序mongod的執行狀態
二、配置使用者
安裝完成後的MongoDB預設是沒有開啟使用者驗證的,也就是說任何人登陸進去都有超級管理員許可權,我們需要啟動訪問控制,對使用者身份進行驗證。在啟動訪問控制前,我們先建立一個超級使用者root,以後可以通過超級使用者進行其他使用者的新增和更改等操作,root使用者是超級使用者,擁有所有許可權,如果只想有一個可以設定所有使用者角色許可權的使用者,也可以將roles設定為userAdminAnyDatabase,該角色可以在所有資料庫裡建立、刪除和管理使用者。建立使用者的程式碼如下:
> use databasename
switched to db databasename
> db.createUser(
... {
... user: "dba",
... pwd: "dba",
... roles: [ { role: "root", db: " databasename" } ]
... }
... )
成功會提示
Successfully added user: {
"user" : "dba",
"roles" : [
{
"role" : "root",
"db" : " databasename "
}
]
}
上述指令中,user和pwd引數是使用者名稱和密碼,我們著重說一下roles引數,這個引數決定了新增使用者的許可權。MongoDB有一些內建角色如下:
1. 資料庫使用者角色:read、readWrite;
2. 資料庫管理角色:dbAdmin、dbOwner、userAdmin;
3. 叢集管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
4. 備份恢復角色:backup、restore;
5. 所有資料庫角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
6. 超級使用者角色:root
// 這裡還有幾個角色間接或直接提供了系統超級使用者的訪問(dbOwner 、userAdmin、userAdminAnyDatabase)
7. 內部角色:__system(不建議使用)
Read:允許使用者讀取指定資料庫
readWrite:允許使用者讀寫指定資料庫
dbAdmin:允許使用者在指定資料庫中執行管理函式,如索引建立、刪除,檢視統計或訪問system.profile
userAdmin:允許使用者向system.users集合寫入,可以找指定資料庫裡建立、刪除和管理使用者
clusterAdmin:只在admin資料庫中可用,賦予使用者所有分片和複製集相關函式的管理許可權。
readAnyDatabase:只在admin資料庫中可用,賦予使用者所有資料庫的讀許可權
readWriteAnyDatabase:只在admin資料庫中可用,賦予使用者所有資料庫的讀寫許可權
userAdminAnyDatabase:只在admin資料庫中可用,賦予使用者所有資料庫的userAdmin許可權
dbAdminAnyDatabase:只在admin資料庫中可用,賦予使用者所有資料庫的dbAdmin許可權。
root:只在admin資料庫中可用。超級賬號,超級許可權
概括來說,就是user有關的,如userAdmin、userAdminAnyDatabase是操作使用者的,可以進行使用者的建立刪除修改,不能操作資料庫物件和資料庫讀寫;db有關的,如dbAdmin、dbAdminAnyDatabase是操作資料庫物件的,不能操作使用者和資料庫讀寫;與read、write有關的,是進行讀寫等操作的,不能操作使用者和資料庫物件。對於單個數據庫,還有一個dbOwner角色,它擁有該資料的所有許可權,包括dbAdmin,readWrite,userAdmin。
MongoDB使用者許可權分配的操作是針對某個庫來說的,所以可以看到上述建立角色的過程中,roles裡面有一個數據庫db引數。即使是一些對所有資料庫有許可權的角色如userAdminAnyDatabase,也要在新增的時候指定db引數為“admin”
root使用者建立成功後,修改/etc/mongod.conf檔案,將security的值設定為authorization: enable
重啟mongod服務:service mongod restart
我們開啟了使用者驗證後,不做登入限制的情況下,雖然任何人都可以進入mongodb服務,但是沒有進行使用者驗證就不能進行資料庫操作。
使用者驗證有兩種方式
1、先連線再驗證,先進入mongod服務,然後到使用者所在的資料庫下,執行db.auth(“username”,”pwd”)進行使用者身份驗證,返回1表示成功
2、在連線過程中驗證,語法是:
mongo --port 27017 -u "username" -p "pwd" --authenticationDatabase "dbname"
之後我們就可以通過root使用者新增其他使用者,命令和之前的一樣。
新增使用者成功後,我們到使用者所在的資料庫下,進行使用者身份認證,就可以以該使用者的身份進行對應許可權的資料庫操作。
驗證使用者身份的指令之一db.auth(“username”,”pwd”)
也可以在mongodb內切換使用者,但是我在具體實踐過程中發現,從root使用者切換到另一個coffee使用者,雖然身份認證成功了,但是許可權並沒有及時更新,建議需要切換資料庫使用者的時候,先退出mongod,再進去用另一個使用者進行驗證操作。
還有,使用者在哪裡建立就在哪裡驗證比如你在admin資料庫下建立了test1資料庫下的user1和test2資料庫下的user2,需要先在admin資料庫下驗證使用者,再去對應的資料庫進行操作。
如果需要變更使用者的資訊,用有許可權的使用者賬號登入操作
修改使用者指令(不支援更改使用者名稱)
db.updateUser(
"username",
{ pwd: "newPass",
roles: [{ role: “newRole”, db: “dbName”}]
}
)
總結一下,使用者配置的過程
安裝mongodb預設不開啟使用者認證 ——> 建立一個root超級使用者 ——> 修改配置檔案,開啟使用者認證,重啟mongod服務 ——> 用root使用者新增其他使用者 ——> 其他使用者連線驗證進行資料庫操作
三、遠端連線
1、修改配置檔案
vim /etc/mongod.conf
把bindIp: 127.0.0.1,改成bindIpAll: true表示對所有ip開放訪問許可權
2、重啟mongod服務
service mongod restart
3、防火牆開放27017埠
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 27017 -j ACCEPT
4、接下來我們就可以進行遠端連線了
有兩種方式驗證
(1)用視覺化工具,我用的是Studio 3T(MongoChef),新建連線輸入對應的ip和使用者資訊,驗證連線成功
(2)用另一臺伺服器登入
mongo xx.xx.xx.xx(ip地址):27017
這個登陸到的是mongodb/test資料庫
用特定使用者登入
mongo xx.xx.xx.xx:27017/admin –u username -p
關於bindIp的配置,我用的mongo4.0.1,自己試了一下,測試的結果是bindIp:0.0.0.0和bindIpAll: true可以實現遠端連線,直接註釋掉bingdIp不能實現遠端連線,注意,引數值前要有空格,否則無法生效
四、遇到的問題
記錄一些安裝過程中出現的問題,連線問題請務必確保在阿里雲(或你的伺服器平臺)上配置了安全組規則,開放了27017埠
1、啟動mongo服務(service mongod start)的時候報錯Failed to start mongod.service: Unit not found
解決方法:
(1)建立配置檔案
sudo nano /etc/systemd/system/mongodb.service
(2)新增文字
[Unit]
Description=High-performance, schema-free document-oriented database
After=network.target
[Service]
User=mongodb
ExecStart=/usr/bin/mongod --quiet --config /etc/mongod.conf
[Install]
WantedBy=multi-user.target
(3)Ctrl + X 退出
(4)啟動服務
sudo systemctl start mongodb
sudo systemctl status mongodb
2、啟動mongo(mongo --bind_ip "" --port 27017 -u "username" -p "pwd" --authenticationDatabase "dbname")的時候報錯
解決方法
(1)檢視儲存資料庫的目錄是否存在
ls -ld /data/db
如果提示目錄不存在的話就要在根目錄下建立一個
sudo mkdir /data/db
(2)啟動MongoDB的同時指定資料庫儲存在什麼地方
mongod --dbpath /data/db
指令執行完成後,我們就可以正常啟動mongo了
參考資料:https://www.cnblogs.com/alan2kat/p/7771635.html
http://blog.51cto.com/ovcer/1416906
https://www.cnblogs.com/jinxiao-pu/p/7121307.html