建立mongodb副本集操做實例

一:概念html

相關概念及圖片引用自這裏linux

mongodb副本集: 副本集是一組服務器,其中一個是主服務器,用於處理客戶請求;還有多個備份服務器,用於保存主服務器的數據副本。若是主服務器崩潰了,備份服務器自動將其中一個成員升級爲新的主服務器。 因而可知副本集對於應對災難性事件是多麼的合適。之前的mongo主從模式其實就是一個單副本的應用,沒有很好的擴展性和容錯性。而mongodb副本集具備多個副本保證了高性能,數據的一致性,容錯性,就算一個副本掛掉了還有不少副本存在,而且解決了上面第一個問題「主節點掛掉了,整個集羣內會自動切換」。mongodb

由圖能夠看到客戶端鏈接到整個副本集,不關心具體哪一臺機器是否掛掉。主服務器負責整個副本集的讀寫,副本集按期同步數據備份,一但主節點掛掉,副本節點就會選舉一個新的主服務器,這一切對於應用服務器不須要關心。咱們看一下主服務器掛掉後的架構:bash

副本集中的副本節點在主節點掛掉後經過心跳機制檢測到後,就會在集羣內發起主節點的選舉機制,自動選舉一位新的主服務器。服務器

其餘關於選舉等詳細概念能夠看這裏架構


官方推薦的副本集機器數量爲至少3個,那咱們也按照這個數量配置測試。app

所以先準備3臺虛擬機用於測試:ssh

系統均爲:Linux Debian ,分別爲:tcp

已分配好的可登陸用戶分別是:root,user1ide

二:安裝mongodb

如下記錄在安裝mongodb過程當中遇到的問題:

1.在ip爲84的虛擬機上,root用戶沒有開放遠程登陸權限,用root帳號登陸時報錯:Access denied (網上查到是由於sshd的設置不容許root用戶用密碼遠程登陸的緣由)

解決辦法:user1用戶登陸後

   su        // 切換到管理員帳號

  輸入 nano /etc/ssh/sshd_config 回車              //nano是用記事本打開,也可使用 vi 打開
  找到 # Authentication: LoginGraceTime 120 PermitRootLogin without passwd StrictModes yes
  把「PermitRootLogin without passwd」改爲「PermitRootLogin yes」
  按「ctrl+o」保存再退出,退出後記得要重啓一下才生效!

  reboot   //重啓

2. root用戶目錄下安裝mongodb

  root 登陸 

  cd /root    //在root目錄下安裝

  mkdir mongodb   

  拖動 mongodb-linux-x86_64-3.0.1.tgz 到mongodb目錄

  解壓縮到當前目錄:tar zxvf mongodb-linux-x86_64-3.0.1.tgz

3. 配置mongodb啓動的配置文件 mongodb.conf

    

 解釋一下參數名稱:

  • dbpath: db數據文件存放位置
  • logpath:db的日誌文件存放位置
  • logappend: 日誌是否以追加方式寫入
  • fork: 後臺運行
  • port: 訪問端口      //默認27017
  • noauth: 無認證訪問(此處是爲測試方便,請勿效仿)
  • replSet:副本集核心參數,副本集的名稱,這個參數是必須的,並且必須三臺機器徹底同樣
  • 更多參數能夠根據須要添加

4. 設置環境變量

  vi ~/.bashrc     //    ~/ 表示打開當前用戶目錄下面的.bashrc文件
  拷貝如下設置到文件保存便可
    export MONGOHOME=/root/mongodb/mongodb-linux-x86_64-3.0.1
    export PATH=$MONGOHOME/bin:$PATH

5. 設置服務開機自啓動:

  cd /etc/init.d        //進入啓動項目文件夾下

  touch mongodb  建立mongodb文件,將如下內容拷貝到文件並保存

#!/bin/sh
### BEGIN INIT INFO
# Provides: mongod
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start/stop
### END INIT INFO

# Source function library.
. /lib/lsb/init-functions

retval=0
pidfile=`ps -ef | grep 'mongod' | grep -v grep | awk '{print $2}'`

CONFIG="/root/mongodb/mongodb.conf"
PROGRAM="/root/mongodb/mongodb-linux-x86_64-3.0.1/bin/mongod"
MONGOPID=`ps -ef | grep 'mongod' | grep -v grep | awk '{print $2}'`

test -x $PROGRAM || exit 0

case "$1" in
start)
ulimit -n 3000
log_begin_msg "Starting MongoDB server"
$PROGRAM -f $CONFIG &
log_end_msg 0
;;
stop)
log_begin_msg "Stopping MongoDB server"
if [ ! -z "$MONGOPID" ]; then
kill -15 $MONGOPID
fi
log_end_msg 0
;;
status)
;;
*)
log_success_msg "Usage: /etc/init.d/mongodb {start|stop|status}"
exit 1
esac

exit 0

(在mongodb文件存在的狀況下,可將mongodb的啓動文件拖動到 /etc/init.d文件夾下)

   覈對:啓動項目位置及配置文件位置

    CONFIG="/root/mongodb/mongodb.conf"
    PROGRAM="/root/mongodb/mongodb-linux-x86_64-3.0.1/bin/mongod"
    MONGOPID=`ps -ef | grep 'mongod' | grep -v grep | awk '{print $2}'`


6. 配置好後reboot 重啓系統

檢測是否能進入mongo:

mongo -v  或者 mongo 命令。

 注意項:

  由於mongodb是安裝在root用戶下(Linux系統默認所安裝的軟件只能在當前用戶下有使用權限,換一個用戶就沒有權限訪問),當user用戶登陸後使用mongo命令時,會報錯沒有權限訪問,這是咱們須要設置user用戶的訪問mongodb的權限。

1:user用戶登陸

在user用戶目錄下 加入環境變量,指向mongo安裝的文件夾:
vi ~/.bashrc 進入當前用戶下面的.bashrc文件
  拷貝如下設置保存便可
  export MONGOHOME=/root/mongodb/mongodb-linux-x86_64-3.0.1
  export PATH=$MONGOHOME/bin:$PATH

2:mongodb的安裝目錄(root目錄)訪問權限

給mongodb的安裝目錄 :root目錄設置訪問權限(須要在root管理員用戶下設置) 在root當存目錄

cd /root
chmod 777 root (讀寫執行權限都有了)

chmod -R 777 root(文件的讀寫,建立文件夾等)
chmod a+x root  執行權限

設置完這兩部,在user帳號下,就能啓動mongodb了。

若是在啓動mongodb時報如下鏈接不上的mask錯誤,試試如下命令:

systemctl unmask mongodb
systemctl enable mongodb
systemctl start mongodb

3:在user用戶下,判斷開機啓動項下面的mongodb文件是否有執行權限 

  cd /etc/init.d/ 進入這個啓動項目錄
  ls -al mongodb 查看mongodb啓動文件的權限 (./mongo) 按tab鍵不全 則是沒有執行權限
  chmod a+x mongodb 給mongodb文件賦予執行權限   (須要在管理員權限下設置)

systemctl enable mongodb 對mongodb文件設置可用

systemctl start mongodb.service 啓動服務

4: 其餘可能涉及的命令:

若是系統開放了防火牆,還須要開放防火牆的端口,可使得3臺機器相互之間能訪問,不會被牆掉。

列出INPUT 鏈全部的規則
iptables -L INPUT --line-numbers

#固然,本身不能被擋在外面,給本身開個後門
iptables -I INPUT -s 127.0.0.1 -p tcp --dport 27017 -j ACCEPT(出於業務邏輯的須要,有時還須要對服務器的公網IP受權)

iptables -I INPUT -s 172.16.9.241 -p tcp --dport 27017 -j ACCEPT
iptables -I INPUT -s 172.16.9.240 -p tcp --dport 27017 -j ACCEPT
iptables -I INPUT -s 172.16.9.85 -p tcp --dport 27017 -j ACCEPT

列出全部的服務,查看全部服務
systemctl list-units --type=service

df -h 查看磁盤空間

 手動從配置文件啓動服務 :mongod -config ./mongodb-3.2.18/mongodb.conf(配置文件路徑)

 

三:設置副本集

在3個虛擬機上啓動mongo服務都沒有問題時,開始配置副本集。

隨便選擇某一臺服務器作副本集初始化配置便可。

輸入mongo命令,啓動mongo   

config={  
     _id:"testrepl",
    members:[
        {_id:0,host:"172.16.9.241:27017"},        
        {_id:1,host:"172.16.9.240:27017"},
        {_id:2,host:"172.16.9.84:27017"}]
    }  

rs.initiate(config) 

##########################
"_id": 副本集的名稱
"members": 副本集的服務器列表
  "_id": 服務器的惟一ID
  "host": 服務器主機
  "priority": 是優先級,默認爲1,優先級0爲被動節點,不能成爲活躍節點。優先級不位0則按照有大到小選出活躍節點。
  "arbiterOnly": 仲裁節點,只參與投票,不接收數據,也不能成爲活躍節點。

第一次初始化時報如下錯誤:

replSetInitiate quorum check failed because not all proposed set members responded affirmatively: 172.16.9.85:27017 failed with Failed attempt to connect to 172.16.9.85:27017; couldn't connect to server 172.16.9.85:27017 (172.16.9.85), connection attempt failed    code:74

 經查證發現root磁盤空間小了,副本集至少要求好幾G空間,以用來交互數據使用。從新分配虛擬機空間後解決問題。

若初始化成功,會返回如下代碼:

{
    "ok" : 1
}

查看副本集狀態: rs.status()  命令

注意事項:

1.只須要選擇其中某一節點作初始化配置

2. 在副本集初始化的時候,通常都是copy不一樣的數據至各個結點,以後啓動結點,添加至集羣,以後查詢狀態會發現是  STARTUP2,這是由於集羣初始化在同步數據,同步完數據以後,狀態就變正常了

3. 在副本節點讀取數據報錯:
Error: error: { "ok" : 0, "errmsg" : "not master and slaveOk=false", "code" : 13435 }

由於241爲主副本集,mongodb默認是從主節點讀寫數據的,而副本節點上不容許讀數據,所以在從服務器上須要作如下設置,須要設置副本節點能夠讀。

repset:SECONDARY>db.getMongo().setSlaveOk();   執行這句讓副本集能夠讀

其實:有兩種方法實現從機的查詢:
第一種方法:db.getMongo().setSlaveOk();
第二種方法:rs.slaveOk();

上面兩行命令即容許此鏈接從副本讀取.

可是這種方式有一個缺點就是,下次再經過mongo進入實例的時候,查詢仍然會報錯,爲此能夠經過下列方式
vi ~/.mongorc.js
增長一行rs.slaveOk();
之後每次經過mongo命令進入均可以查詢了。

 

 能夠測試當主節點掛掉,副本節點就會選舉一個新的主服務器

 

 當再次啓動241服務器的mongo時,會恢復其primary身份。

 到這裏,副本集就已經配置完成。

 

對於切換日誌的操做,

>use admin

> db.runCommand({logRotate:1})

 

參考文檔1;文檔2

相關文章
相關標籤/搜索