MongoDB 2.6配置副本集,支持端口號修改和用戶登錄認證


mongoDB系列之(二):mongoDB 副本集

Mongodb2.6副本集驗證部署和認證

副本集有以下特點:

1. 最小構成是:primary,secondary,arbiter,一般部署是:primary,2 secondary。

2. 成員數應該為奇數,如果為偶數的情況下添加arbiter,arbiter不保存數據,只投票。

3. 最大50 members,但是只能有 7 voting members,其他是non-voting members。

注意:配置mongo副本集的時候,不能先添加登陸授權用戶,但是可以先修改端口號。

提示:現在每一台從機器上面刪除所有數據庫

show dbs
db.dropDatabase() --數據全部清空
show dbs

今天在做mongoDB主從的時候,遇到了"ipdress has data already, cannot initiate set"的問題,正好看到之前有人也遇到這個問題,說是要把從的數據全部清空。

修改每一台機器的配置文件/etc/mongod.conf,增加副本集名稱

-------------------XShell 5--------------------
sed -i 's/^#replSet=setname/replSet=wangyunpeng/g' /etc/mongod.conf

-------------------Shell--------------------
#replSet=setname replSet=wangyunpeng

然后重起每一台mongo的服務

service mongod stop
service mongod start

此時再通過MongoVUE工具訪問每一個mongo服務器里面的集合,會提示:cannot currently read from this replSet *****錯誤。

在主數據的節點上登陸mongodb數據庫,這里必須選擇主庫進行replSet設置操作:

mongo 127.0.0.1:27017/admin

指定副本集的名字為wangyunpeng和數據節點、仲裁者

config_repl=
{
    "_id" : "wangyunpeng",
    "members" : [
        {
            "_id" : 0,
            "host" : "10.53.0.40:18181",
            "priority" : 10
        },
        {
            "_id" : 1,
            "host" : "10.53.0.41:18181",
            "priority" : 9
        },
        {
            "_id" : 2,
            "host" : "10.53.0.45:18181",
            "priority" : 9 數據節點 (或 "arbiterOnly" : true 仲裁者)
        }
    ]
}
rs.initiate(config_repl);

查看成功之后的主機信息:

1、瞬時的狀態:注意從庫的state是5。並且rs.status();前面是“>”,也表示還沒有創建完成,需要等待一會,如下圖:

2、最終的狀態:注意rs.status();左面的">"是primary,還有syncingTo的機器地址和端口,如下圖:

仲裁者的信息

也可以在每一台從機上登陸mongo,使用rs.status()查看從機狀態,還有syncingTo的機器地址和端口,注意下圖:

配置玩副本集之后開始用戶認證,需要配置兩個用戶(只創建系統用戶也可以),一個是系統用戶,一個是數據庫管理員用戶。配置完之后,配置信息將同步到其他節點。

role:[“root”]表示系統用戶,role:[“useAdminAnyDatabase”]表示數據庫管理員用戶,

db.createUser({user:"sa",pwd:"1234",roles:["root"]});    --創建用戶
db.auth("sa","1234");    --設置用戶登陸權限,密碼一定要和創建用戶時輸入的密碼相同
show users;     --查看創建的用戶

從庫查看登陸用戶是否同步:

db.getMongo().setReadPref('secondaryPreferred');
show users;

配置完用戶驗證之后,停掉副本集(順序:先從從庫停止,最后停主庫),用openssl生成密碼文件,

cd /data
openssl rand -base64 745 > mongodb-keyfile

賦予權限600,文件才能被調用

chmod 400 mongodb-keyfile

保存好文件,修改所有者和所有組,

chown -R mongod:mongod mongodb-keyfile

然后在每一個從機器上的配置文件加入啟動調用認證文件參數 vim /etc/mongod.conf,如:

------------------------------XShell 5--------------------------------
sed -i 's/^#keyFile=\/path\/to\/keyfile/keyFile=\/data\/mongodb-keyfile/g' /etc/mongod.conf

--------------------------Shell------------------------------------
keyFile = /data/mongodb-keyfile

然后將mongodb-keyfile逐一拷貝到每一個從的機器上,然后啟動副本,只用經過密碼文件認證的節點才能加入。數據庫操作也需要密碼認證,大大提高了安全性。

cd /data/
openssl rand -base64 745 > mongodb-keyfile
chmod 400 mongodb-keyfile
chown -R mongod:mongod mongodb-keyfile

vim /etc/mongo.conf
keyFile=/data/mongodb-keyfile

scp /data/mongodb-keyfile root@192.168.1.111:/data/mongo/ (先在主機上寫config文件,把本地的私鑰文件復制到每一台服務器(主、從、仲裁)的~/.ssh/目錄中)

這樣就不用修改/etc/mongod.conf文件的nuauth=false和auth=true也能行了,修改也沒有錯。

都配置完成之后,重起Mongo服務(順序:先主庫,在從庫),登錄的時候記得使用密碼

mongo 127.0.0.1:27017/admin -u用戶名 -p密碼
****:PRIMARY> rs.status(); --查看狀態
注意:arbiter機器登陸不需要指定用戶名和密碼,例如;mongo 127.0.0.1:27017/admin

Failover動作

關閉主庫

db.shutdownServer()   --關閉主庫
mongod -f /etc/mongod.conf  --重起主庫 

庫上查看副本集狀態,可以看到一個從庫升級為主庫

rs.status()

同期動作確認

在主庫上插入一條記錄操作

在從庫上查看數據已經同期,直接查會抱錯,需要使用db.getMongo().setReadPref("secondaryPreferred")命令

wangyunpeng:SECONDARY> use shoespie_website
wangyunpeng:SECONDARY> show collections
2016-01-25T21:02:07.585-0500 error: { "$err" : "not master and slaveOk=false", "code" : 13435 } at src/mongo/shell/query.js:131

wangyunpeng:SECONDARY> db.getMongo().setReadPref("secondaryPreferred")
wangyunpeng:SECONDARY> use shoespie_website
wangyunpeng:SECONDARY> show collections

3. 讀寫分離

主庫,從庫都支持讀操作。但是,默認情況讀也是從主庫來讀。

從庫可以通過設置ReadPreference打開支持讀操作,ReadPreference有幾種模式:

Primary                   #從主的讀,默認

primaryPreferred      #基本上從主的讀,主不可用時,從從的讀

secondary                #從從的讀

secondaryPreferred   #基本上從從的讀,從不可用時,從主的讀

nearest                    #從網絡延遲最小的讀

基本上常用的是,Primary,secondary,nearest

副本集的設定中可以通過Tag把成員歸類,通過下面方法指定讀的類型:

1,程序連接的時候,指定讀的類型ReadPreference

2,用mongo命令連接,只對當前連接有效

wangyunpeng:SECONDARY> db.getMongo().setReadPref('secondaryPreferred')

 


免責聲明!

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



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