一:概念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
解釋一下參數名稱:
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})