MongoDB 分片集群的用戶和權限一般操作步驟


步驟總結:

  1. 按照mongos路由、配置副本集服務,分片副本集服務的先后順序關閉所有節點服務
  2. 創建副本集認證的key文件,復制到每個服務所在目錄
  3. 修改每個服務的配置文件,增加參數
  4. 啟動每個服務
  5. 創建賬號和認證(存儲在配置副本集中)

另一種操作步驟:

  1. 創建超管賬號和普通用戶賬號
  2. 按照mongos路由、配置副本集服務,分片副本集服務的先后順序關閉所有節點服務
  3. 創建副本集認證的key文件,復制到每個服務所在目錄
  4. 修改每個服務的配置文件,增加參數
  5. 啟動每個服務

關閉已開啟的集群服務(可選)

分片集群環境下的安全認證和副本集環境下基本上一樣。
但分片集群的服務器環境和架構較為復雜,建議在搭建分片集群的時候,直接加入安全認證和服務器間的鑒權,如果之前有數據,可先將之前的數據備份出來,再還原回去。
本文使用之前搭建好的集群服務,因此,先停止之前的集群服務

停止服務的方式有兩種:快速關閉和標准關閉,下面依次說明:
(1)快速關閉方法(快速,簡單,數據可能會出錯)
目標:通過系統的kill命令直接殺死進程:

#通過進程編號關閉節點
kill -2 54410

實際操作命令:

ps -ef|grep "mongod -f "|grep -v grep|cut -c 9-15|xargs kill -9
ps -ef|grep "mongos -f "|grep -v grep|cut -c 9-15|xargs kill -9

依次殺死 mongos路由、配置副本集服務,分片副本集服務,從次節點開始。直到所有成員都離線。
副本集殺的時候,建議先殺仲裁者,再殺副本節點,最后是主節點,以避免潛在的回滾。
殺完要檢查一下,避免有的沒有殺掉。

【補充】
如果一旦是因為數據損壞,則需要進行如下操作(了解):
1)刪除lock文件:

rm -f /home/mongodb/sharded_cluster/myshardrs01_27018/data/db/*.lock \
/home/mongodb/sharded_cluster/myshardrs01_27118/data/db/*.lock \
/home/mongodb/sharded_cluster/myshardrs01_27218/data/db/mongod.lock \
/home/mongodb/sharded_cluster/myshardrs02_27318/data/db/mongod.lock \
/home/mongodb/sharded_cluster/myshardrs02_27418/data/db/mongod.lock \
/home/mongodb/sharded_cluster/myshardrs02_27518/data/db/mongod.lock \
/home/mongodb/sharded_cluster/myconfigrs_27019/data/db/mongod.lock \
/home/mongodb/sharded_cluster/myconfigrs_27119/data/db/mongod.lock \
/home/mongodb/sharded_cluster/myconfigrs_27219/data/db/mongod.lock

2 )依次修復數據:

/usr/bin/mongod --repair --dbpath=/home/mongodb/sharded_cluster/myshardrs01_27018/data/db
/usr/bin/mongod --repair --dbpath=/home/mongodb/sharded_cluster/myshardrs01_27118/data/db
/usr/bin/mongod --repair --dbpath=/home/mongodb/sharded_cluster/myshardrs01_27218/data/db
/usr/bin/mongod --repair --dbpath=/home/mongodb/sharded_cluster/myshardrs02_27318/data/db
/usr/bin/mongod --repair --dbpath=/home/mongodb/sharded_cluster/myshardrs02_27418/data/db
/usr/bin/mongod --repair --dbpath=/home/mongodb/sharded_cluster/myshardrs02_27518/data/db
/usr/bin/mongod --repair --dbpath=/home/mongodb/sharded_cluster/myconfigrs_27019/data/db
/usr/bin/mongod --repair --dbpath=/home/mongodb/sharded_cluster/myconfigrs_27119/data/db
/usr/bin/mongod --repair --dbpath=/home/mongodb/sharded_cluster/myconfigrs_27219/data/db
/usr/bin/mongod --repair --dbpath=/home/mongodb/sharded_cluster/mymongos_27017/data/db
/usr/bin/mongod --repair --dbpath=/home/mongodb/sharded_cluster/mymongos_27117/data/db

(2)標准的關閉方法(數據不容易出錯,但麻煩):
目標:通過mongo客戶端中的shutdownServer命令來依次關閉各個服務
關閉分片服務器副本集中的服務,建議依次關閉仲裁節點、副本節點、主節點。主要的操作步驟參考如下:

//客戶端登錄服務,注意,這里通過localhost登錄,如果需要遠程登錄,必須先登錄認證才行。
mongo --port 27018
//告知副本集說本機要下線
rs.stepDown()
//#切換到admin庫
use admin
//關閉服務
db.shutdownServer()

關閉配置服務器副本集的服務,建議依次關閉副本節點、主節點。主要的操作步驟參考如下:

//客戶端登錄服務,注意,這里通過localhost登錄,如果需要遠程登錄,必須先登錄認證才行。
mongo --port 27019
//告知副本集說本機要下線
rs.stepDown()
//#切換到admin庫
use admin
//關閉服務
db.shutdownServer()

關閉路由服務器的服務,建議依次關閉兩個路由節點。主要的操作步驟參考如下:

//客戶端登錄服務,注意,這里通過localhost登錄,如果需要遠程登錄,必須先登錄認證才行。
mongo --port 27017
//告知副本集說本機要下線
rs.stepDown()
//#切換到admin庫
use admin
//關閉服務
db.shutdownServer()

創建副本集認證的key文件

第一步:生成一個key文件到當前文件夾中。
可以使用任何方法生成密鑰文件。例如,以下操作使用openssl生成密碼文件,然后使用chmod來更改文件權限,僅為文件所有者提供讀取權限

# cd /home/mongodb/sharded_cluster
# openssl rand -base64 90 -out ./mongo.keyfile
# chmod 400 ./mongo.keyfile
# ll mongo.keyfile
-r--------. 1 root root 122 8月  14 14:23 mongo.keyfile

提示:所有副本集節點都必須要用同一份keyfile,一般是在一台機器上生成,然后拷貝到其他機器上,且必須有讀的權限,否則將來會報錯: permissions on /home/mongodb/replica_sets/myrs_27017/mongo.keyfile are too open

一定要保證密鑰文件一致,文件位置隨便。但是為了方便查找,建議每台機器都放到一個固定的位置,都放到和配置文件一起的目錄中。這里將該文件分別拷貝到多個目錄中:

echo '/home/mongodb/sharded_cluster/myshardrs01_27018/mongo.keyfile
/home/mongodb/sharded_cluster/myshardrs01_27118/mongo.keyfile
/home/mongodb/sharded_cluster/myshardrs01_27218/mongo.keyfile
/home/mongodb/sharded_cluster/myshardrs02_27318/mongo.keyfile
/home/mongodb/sharded_cluster/myshardrs02_27418/mongo.keyfile
/home/mongodb/sharded_cluster/myshardrs02_27518/mongo.keyfile
/home/mongodb/sharded_cluster/myconfigrs_27019/mongo.keyfile
/home/mongodb/sharded_cluster/myconfigrs_27119/mongo.keyfile
/home/mongodb/sharded_cluster/myconfigrs_27219/mongo.keyfile
/home/mongodb/sharded_cluster/mymongos_27017/mongo.keyfile
/home/mongodb/sharded_cluster/mymongos_27117/mongo.keyfile' | xargs -n 1 cp -v /home/mongodb/sharded_cluster/mongo.keyfile

修改配置文件指定keyfile

分別編輯幾個服務的mongod.conf文件,添加相關內容:

# vim /home/mongodb/sharded_cluster/myshardrs01_27018/mongod.conf
security:
  #KeyFile鑒權文件
  keyFile: /home/mongodb/sharded_cluster/myshardrs01_27018/mongo.keyfile
  #開啟認證方式運行
  authorization: enabled

其他配置文件參考上面的添加,注意mongo.keyfile文件路徑別寫錯了

mongos使用的mongod.conf添加如下相關內容:

# /home/mongodb/sharded_cluster/mymongos_27117/mongos.conf
security:
  #KeyFile鑒權文件
  keyFile: /home/mongodb/sharded_cluster/mymongos_27117/mongo.keyfile

mongos 比mongod少了authorization:enabled的配置。
原因是,副本集加分片的安全認證需要配置兩方面的,副本集各個節點之間使用內部身份驗證,用於內部各個mongo實例的通信,只有相同keyfile才能相互訪問。所以都要開啟 keyFile:/mongodb/sharded_cluster/mymongos_27117/mongo.keyfile 。
然而對於所有的mongod,才是真正的保存數據的分片。
mongos只做路由,不保存數據。所以所有的mongod開啟訪問數據的授權authorization:enabled。這樣用戶只有賬號密碼正確才能訪問到數據。

重新啟動節點

必須依次啟動配置節點、分片節點、路由節點:

/home/mongodb/sharded_cluster # /usr/bin/mongod -f /home/mongodb/sharded_cluster/myconfigrs_27019/mongod.conf                               
about to fork child process, waiting until server is ready for connections.
forked process: 8753
child process started successfully, parent exiting
------------------------------------------------------------------------------------------------------------------------------------------------------------
/home/mongodb/sharded_cluster # /usr/bin/mongod -f /home/mongodb/sharded_cluster/myconfigrs_27119/mongod.conf                               
about to fork child process, waiting until server is ready for connections.
forked process: 8862
child process started successfully, parent exiting
------------------------------------------------------------------------------------------------------------------------------------------------------------
/home/mongodb/sharded_cluster # /usr/bin/mongod -f /home/mongodb/sharded_cluster/myconfigrs_27219/mongod.conf                               
about to fork child process, waiting until server is ready for connections.
forked process: 8974
child process started successfully, parent exiting
------------------------------------------------------------------------------------------------------------------------------------------------------------
/home/mongodb/sharded_cluster # /usr/bin/mongod -f /home/mongodb/sharded_cluster/myshardrs01_27018/mongod.conf                              
about to fork child process, waiting until server is ready for connections.
forked process: 9115
child process started successfully, parent exiting
------------------------------------------------------------------------------------------------------------------------------------------------------------
/home/mongodb/sharded_cluster # /usr/bin/mongod -f /home/mongodb/sharded_cluster/myshardrs01_27118/mongod.conf                              
about to fork child process, waiting until server is ready for connections.
forked process: 9243
child process started successfully, parent exiting
------------------------------------------------------------------------------------------------------------------------------------------------------------
/home/mongodb/sharded_cluster # /usr/bin/mongod -f /home/mongodb/sharded_cluster/myshardrs01_27218/mongod.conf                              
about to fork child process, waiting until server is ready for connections.
forked process: 9384
child process started successfully, parent exiting
------------------------------------------------------------------------------------------------------------------------------------------------------------
/home/mongodb/sharded_cluster # /usr/bin/mongod -f /home/mongodb/sharded_cluster/myshardrs02_27318/mongod.conf                              
about to fork child process, waiting until server is ready for connections.
forked process: 9493
child process started successfully, parent exiting
------------------------------------------------------------------------------------------------------------------------------------------------------------
/home/mongodb/sharded_cluster # /usr/bin/mongod -f /home/mongodb/sharded_cluster/myshardrs02_27418/mongod.conf                              
about to fork child process, waiting until server is ready for connections.
forked process: 9633
child process started successfully, parent exiting
------------------------------------------------------------------------------------------------------------------------------------------------------------
/home/mongodb/sharded_cluster # /usr/bin/mongod -f /home/mongodb/sharded_cluster/myshardrs02_27518/mongod.conf                              
about to fork child process, waiting until server is ready for connections.
forked process: 9804
child process started successfully, parent exiting
------------------------------------------------------------------------------------------------------------------------------------------------------------
/home/mongodb/sharded_cluster # /usr/bin/mongos -f /home/mongodb/sharded_cluster/mymongos_27017/mongos.conf                                 
about to fork child process, waiting until server is ready for connections.
forked process: 9895
child process started successfully, parent exiting
------------------------------------------------------------------------------------------------------------------------------------------------------------
/home/mongodb/sharded_cluster # /usr/bin/mongos -f /home/mongodb/sharded_cluster/mymongos_27117/mongos.conf                                
about to fork child process, waiting until server is ready for connections.
forked process: 9963

注意:
這里有個非常特別的情況,就是啟動順序。先啟動配置節點,再啟動分片節點,最后啟動路由節點。
如果先啟動分片節點,會卡住,提示:

about to fork child process, waiting until server is ready for connections

這也許是個 bug。原因未知。

創建帳號和認證

客戶端mongo,通過localhost登錄任意一個mongos路由,

# mongo --port 27017

提示:相當於一個后門,只能在 admin下添加用戶。

創建一個管理員帳號:

mongos> use admin
switched to db admin

mongos>  db.createUser({user:"myroot",pwd:"123456",roles:["root"]})
Successfully added user: { "user" : "myroot", "roles" : [ "root" ] }

提示:如果在開啟認證之前已經創建了管理員賬號,這里可以忽略

創建一個普通權限帳號:

mongos> use admin
switched to db admin

mongos> db.auth("myroot","123456")
1

mongos> use articledb
switched to db articledb

mongos> db.createUser({user: "bobo", pwd: "123456", roles: [{ role: "readWrite",db: "articledb" }]})

mongos> db.auth("bobo","123456")
1

提示:通過mongos添加的賬號信息,只會保存到配置節點的服務中,具體的數據節點不保存賬號信息,因此,分片中的賬號信息不涉及到同步問題。

mongo客戶端登錄mongos路由,用管理員帳號登錄可查看分片情況:

mongos> use admin
switched to db admin
mongos>  db.auth("myroot","123456")
1
mongos> sh.status()

退出連接,重新連接服務,使用普通權限帳號訪問數據:

# mongo --host=192.168.0.253 --port=27017

mongos> use articledb
switched to db articledb
mongos> db.auth("bobo","123456")
1
mongos> show collections
comment
comment2
mongos> db.comment.count()
10001


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM