-_-以前可視化編輯器的太醜了,因此刪了原來的,拿markdown重寫了一遍mongodb
本文講述如何搭建最簡單的1主2從的mongo複製集 以及 如何進行復制集的認證shell
關於什麼是mongo複製集和大多數原則的理論知識就不講了,這裏只講部署上的完整步驟及每一步的細節json
我給的示例是所有的主從結點都放在了本機上,固然生產環境下建議把每一個結點放到獨立的機子上面
而且一般狀況下,生產環境下的一個複製集每每是集羣中的一個分片數組
環境版本 : 3.2.4markdown
複製集的架構爲1個主結點,2個從結點 三個結點都部署在本地(固然主機充足的話,你也能夠部署在不一樣機子上) 主結點的端口號爲28001,從結點的端口號爲28002和28003
port=28001 該結點的端口號 bind_ip=127.0.0.1 該結點的綁定ip dbpath=/home/seven/program/mongodb/data/db28001/ 該結點的數據目錄(絕對路徑) logpath=/home/seven/program/mongodb/log/28001.log 該結點的日誌文件路徑(絕對路徑) pidfilepath=/home/seven/program/mongodb/data/db28001/28001.pid 該結點的pid文件路徑(絕對路徑) logappend=true 日誌是不是追加方式(建議開啓) fork=true 是否之後臺進程方式運行(建議開啓) replSet=warringstates 複製集的名稱(同一個複製集下的主從結點的該值應相同) profile=1 只在操做時間超過slowms時,才記錄慢日誌 profile=0表示永不記錄,profile=1表示只記錄慢日誌,profile=2表示全部日誌都記錄 slowms=100 慢日誌的時間閥值是100ms 另外,這兩項配置推薦在全部結點上都進行配置 而且能夠經過db.getProfilingStatus()這條命令來查看慢日誌的配置信息 其實,不推薦經過配置文件的方式強制開啓慢日誌 相反,推薦使用db.setProfilingLevel(int)的方式動態調整profile的等級 由於,慢日誌一般用在內測時候,真正上線後爲了性能,是不會開啓慢日誌的,或者說是不會長期開着的 通常是每隔一段時間,動態地開啓一段時間來獲取線上測試狀況
和 28001.conf 類似 修改 : 端口,IP,數據目錄,日誌目錄,pid目錄
init.sh :架構
禁用hugepage,不然啓動mongod進程的時候會有warning 另外這個腳本要以root方式運行,因此權限最好設置爲700,所屬組設置爲root:root echo never > /sys/kernel/mm/transparent_hugepage/enabled echo never > /sys/kernel/mm/transparent_hugepage/defrag
mongo28001.sh : 啓動結點28001的mongod進程的腳本,這個腳本最好不要以root身份運行app
cd /home/seven/program/mongodb/bin 進入mongo的bin目錄 ./mongod -f ../conf/28001.conf 啓動mongod實例,-f後面跟上該結點的配置文件的路徑 "../conf/28001.conf"是一個相對路徑,即上面的28001.conf這個配置文件的路徑
mongo28002.sh : 啓動結點28002的mongod進程的腳本,這個腳本最好不要以root身份運行編輯器
cd /home/seven/program/mongodb/bin 進入mongo的bin目錄 ./mongod -f ../conf/28002.conf 啓動mongod實例,-f後面跟上該結點的配置文件的路徑 "../conf/28002.conf"是一個相對路徑,即上面的28002.conf這個配置文件的路徑
mongo28003.sh : 啓動結點28003的mongod進程的腳本,這個腳本最好不要以root身份運行性能
cd /home/seven/program/mongodb/bin 進入mongo的bin目錄 ./mongod -f ../conf/28003.conf 啓動mongod實例,-f後面跟上該結點的配置文件的路徑 "../conf/28003.conf"是一個相對路徑,即上面的28003.conf這個配置文件的路徑
su root 切換爲root身份,以便運行init.sh腳原本禁用hugepage ./init.sh 禁用hugepage,(固然這裏你須要進到你本身機子上存放該腳本的目錄) exit 退出root身份,以便啓動mongod實例 ./mongo28001.sh 啓動結點28001進程(固然這裏你須要進到你本身機子上存放該腳本的目錄) ./mongo28002.sh 啓動結點28002進程(固然這裏你須要進到你本身機子上存放該腳本的目錄) ./mongo28003.sh 啓動結點28003進程(固然這裏你須要進到你本身機子上存放該腳本的目錄)
mongo 127.0.0.1:28001/admin 進入結點28001(其實隨便進哪一個結點都行)的shell,並指定一開始進入admin庫 rs.status() 查看複製集狀態 發現返回值是相似"run rs.initiate(...) if not yet done for the set" 說明還須要手動地初始化複製集 config = { _id : "warringstates", members : [ { _id : 0, host : "127.0.0.1:28001" }, { _id : 1, host : "127.0.0.1:28002" }, { _id : 2, host : "127.0.0.1:28003" } ] } 建立複製集配置對象,其中id=warringstates是表示複製集的名稱 且應該和配置文件中的一致 以後的一個數組中的每個json對象都表示一個結點的id和地址和端口 rs.initiate(config) 使剛纔的配置對象生效 過一會,敲回車鍵,會發現當前shell的提示符變成了"warringstates:PRIMARY>", 或者先變成"warringstates:SECONDARY"後變成"warringstates:PRIMARY", 則表示複製集初始化成功 rs.status() 再次查看複製集的狀態,會發現多了不少內容 rs.conf() 查看複製集的配置
use mydb 在主結點上建立名爲mydb的庫 它只是進入,並不會真的當即建立庫 只有在真正有數據的時候,纔會建立庫 db.students.insert({"name":"lvyang","age":20}) 在主結點上的mydb庫中的students集合中插入一條數據 db.students.insert({"name":"shangyang","age":44}) 在主結點上的mydb庫中的students集合中插入一條數據 db.students.insert({"name":"yingji","age":72}) 在主結點上的mydb庫中的students集合中插入一條數據 show tables 查看主結點上的當前庫下的集合列表 db.students.find() 查看主結點上的當前庫下的students集合中的全部數據
use mydb 在從結點上進入mydb庫 show tables 在從結點上查看mydb下的集合列表。發現報錯,提示未開啓slaveOk rs.slaveOk(true) 開啓從結點的slaveOk,每次想要進到從結點的shell裏查看數據,都要開啓slaveOk db.students.find() 在從結點上查看mydb庫下的students集合裏的數據,此時可以查到數據了
openssl rand -base64 64 > keyfile.dat 生成64字節的密鑰文件 chmod 600 keyfile.dat 建議把密鑰文件的權限設置爲600(針對啓動mongo實例的那個用戶) 接着須要把這個密鑰文件拷貝到每一個複製集結點上(包括主結點和從結點)
mongo 127.0.0.1:28001/admin 進入主結點(我這裏此時28001是主結點)的admin庫 你可能配的時候28001不是主結點,請進你的主結點 注 : 主結點在任一時刻是惟一的,可是是可變的,即隨着時間推移,可能換了一個結點成了主結點 db.createUser( { user : your username of this admin庫, pwd : your password, roles : [ { role : "root", db : "admin" } ] } ) 建立admin庫的用戶(身份爲全部庫的用戶的管理者) use 新庫 進入你以前建立的新庫 db.createUser( { user : your username of this 新庫, pwd : your password, roles : [ { role : "dbOwner", db : 此庫 } ] } ) 建立這個庫的用戶(身份爲此庫的擁有者) 注意,只須要在主結點上建立這兩個用戶 因爲複製集的關係,每一個從結點會自動建立這兩個相同的用戶
keyFile=path/keyfile.dat 在每一個結點(主結點,從結點)的配置文件中加入keyFile的配置項 auth=true 在每一個結點(主結點,從結點)的配置文件中加入auth=true的配置項 db.shutdownServer() 關閉原先的集羣 注意,最好按照 從結點 -> 主結點 的順序,依次關閉各結點的進程 在關閉某個進程時,須要先進入admin庫,而後執行這條命令 從新啓動集羣,命令同第五步
mongo 127.0.0.1:28001/admin 進入主結點(我這裏是28001,你可能主結點不是28001,由於主結點時刻可能變化)的admin庫 show users 查看admin庫中的用戶 發現查到了用戶,說明覆制集環境下,查用戶是不須要認證的 show collections 查看admin庫中的集合列表 發現報錯,提示未進行認證,說明查集合和查數據之類的操做,是須要認證的 db.auth(admin庫的用戶,此用戶的密碼) 進行認證 show collections 再次查看admin庫下的集合列表,此次成功了 use 新庫 進入你以前建立的那個新庫 db.auth(該庫的用戶,此用戶的密碼) 進行認證 show collections 查看這個庫下的集合列表 db.某集合.find() 查看該庫下的某個集合中的數據
mongo 127.0.0.1:28002/admin 進入從結點28002的admin庫 固然你也能夠進入28003這個從結點 db.auth(admin庫的用戶,該用戶的密碼) 進行認證 use 新庫 切換到你以前建立的那個新庫中 db.auth(該庫的用戶,該用戶的密碼) 進行認證 show collections 查看該庫下的集合列表 發現報錯,咦,明明認證成功了,爲什麼會如此 ? 記起來了吧,從結點上查數據,須要 rs.slaveOk這條命令 rs.slaveOk(true) 容許該從結點讀數據 show collections 再次查看該庫下的集合列表,此次成功了