mongo複製集的部署 & 複製集認證

建立mongo複製集 & 複製集的認證

-_-以前可視化編輯器的太醜了,因此刪了原來的,拿markdown重寫了一遍mongodb

本文講述如何搭建最簡單的1主2從的mongo複製集 以及 如何進行復制集的認證shell

關於什麼是mongo複製集和大多數原則的理論知識就不講了,這裏只講部署上的完整步驟及每一步的細節json

我給的示例是所有的主從結點都放在了本機上,固然生產環境下建議把每一個結點放到獨立的機子上面
而且一般狀況下,生產環境下的一個複製集每每是集羣中的一個分片數組

環境版本 : 3.2.4markdown

一. 複製集的架構

複製集的架構爲1個主結點,2個從結點  
    
    三個結點都部署在本地(固然主機充足的話,你也能夠部署在不一樣機子上)  
    
    主結點的端口號爲28001,從結點的端口號爲28002和28003

二. 結點28001的配置文件 28001.conf

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的等級  
            由於,慢日誌一般用在內測時候,真正上線後爲了性能,是不會開啓慢日誌的,或者說是不會長期開着的  
            通常是每隔一段時間,動態地開啓一段時間來獲取線上測試狀況

三. 其餘兩個結點的配置文件 28002.conf 28003.conf

和 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  
    
            再次查看該庫下的集合列表,此次成功了
相關文章
相關標籤/搜索