1)創建密鑰文件
openssl rand -base64 756 > <密鑰文件路徑>
chmod 400 <密鑰文件路徑>
這裏我存放的位置是:
/home/data/mongodb
2)將密鑰文件複製到分片羣集中的每個組件。
承載分片羣集的mongod
或mongos
組件的每個服務器必須包含密鑰文件的副本。
將密鑰文件複製到託管分片集羣成員的每個服務器。確保運行mongod
或mongos
實例的用戶是文件的所有者,並且可以訪問密鑰文件。
避免存儲關於可從託管的硬件來容易地斷開連接的存儲介質的密鑰文件mongod
或mongos
實例,諸如USB驅動器或網絡連接的存儲設備。
備註:這裏有一點要注意,我有2個服務器62,69我是在62上創建的,然後把密鑰文件複製到69上以後,最好在執行一次
chmod 400 <密鑰文件路徑> 命令
3)禁用平衡器。
連接到mongos上以後
sh.stopBalancer ()
如果正在進行遷移,則平衡器可能不會立即停止。該sh.stopBalancer()
方法將阻塞外殼,直到平衡器停止。
使用sh.getBalancerState()
驗證平衡器已停止。
sh.getBalancerState ()
4)關閉mongos集
羣集中的所有mongos集羣實例
5)關閉配置服務器mongod
實例。
6)閉分片副本集mongod
實例
7)在配置文件內添加keyFile=<密鑰文件路徑>
下面是我其中一個配置信息,其他配置信息請看上一篇 mongodb3.4版本 副本集+分片配置
mongod_27100.conf配置
dbpath=/home/data/mongodb/data/27100
logpath=/home/data/mongodb/log/27100/mongodb.log
port=27100
logappend=1
nojournal=true
profile = 1 # 開啓Profiling和設置 日誌級別
slowms = 500 #多久以上纔會記錄
replSet = rs0
shardsvr=true
fork=1
auth=true
keyFile=/home/data/mongodb/mongodb-keyfile
配置好以後啓動服務器實例,這裏需要注意的是,先啓動所有的confServer(配置服務器副本集),然後在啓動分片集羣,最後在啓動mongos集羣
8)連接mongos
mongos -f mongod_30000.conf
mongo -port=30000
9)創建用戶管理員
創建第一個用戶後,localhost異常不再可用。
第一個用戶必須具有創建其他用戶(例如具有的用戶)的特權userAdminAnyDatabase
。這樣可以確保您可以在Localhost Exception 關閉後創建其他用戶。
如果至少一個用戶就不能有權限創建用戶,一旦本地主機異常關閉您不能創建或修改用戶,因此可能無法進行必要的操作。
用戶中權限的說明
權限 |
說明 |
Read |
允許用戶讀取指定數據庫 |
readWrite |
允許用戶讀寫指定數據庫 |
dbAdmin |
允許用戶在指定數據庫中執行管理函數,如索引創建、刪除,查看統計或訪問system.profile |
userAdmin |
允許用戶向system.users集合寫入,可以找指定數據庫裏創建、刪除和管理用戶 |
clusterAdmin |
只在admin數據庫中可用,賦予用戶所有分片和複製集相關函數的管理權限。 |
readAnyDatabase |
只在admin數據庫中可用,賦予用戶所有數據庫的讀權限 |
readWriteAnyDatabase |
只在admin數據庫中可用,賦予用戶所有數據庫的讀寫權限 |
userAdminAnyDatabase |
只在admin數據庫中可用,賦予用戶所有數據庫的userAdmin權限 |
dbAdminAnyDatabase |
只在admin數據庫中可用,賦予用戶所有數據庫的dbAdmin權限。 |
root |
只在admin數據庫中可用。超級賬號,超級權限 |
用戶創建語法
{ user: "<name>", pwd: "<cleartext password>", customData: { <any information> }, roles: [ { role: "<role>", db: "<database>" } | "<role>", ... ] }
語法說明:
user字段:用戶的名字;
pwd字段:用戶的密碼;
cusomData字段:爲任意內容,例如可以爲用戶全名介紹;
roles字段:指定用戶的角色,可以用一個空數組給新用戶設定空角色;
roles 字段:可以指定內置角色和用戶定義的角色。
admin = db.getSiblingDB("admin")
admin.createUser(
{
user: "fred",
pwd: "changeme1",
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
}
)
10)以用戶管理員身份驗證
db.getSiblingDB("admin").auth("fred", "changeme1" )
可替代地,連接新的mongo
使用外殼到目標副本集部件,和參數。您必須使用Localhost Exception才能連接到。-u <username>
-p <password>
--authenticationDatabase "admin"
mongos
備註:上面的意思是,我們可以使使用mongo命令連接mongos的時候直接指定用戶名密碼
mongo -u "fred" -p "changeme1" --authenticationDatabase "admin"
11)啓動平衡器
sh.startBalancer()
參考文檔:https://docs.mongodb.com/v3.4/reference/configuration-options/