【mongoDB運維篇③】replication set複製集

介紹

replicattion set 多臺服務器維護相同的數據副本,提升服務器的可用性,總結下來有如下好處:mongodb

  1. 數據備份與恢復數據庫

  2. 讀寫分離bash

MongoDB 複製集的結構以及基本概念

此處輸入圖片的描述
正如上圖所示,MongoDB 複製集的架構中,主要分爲兩部分:主節點(Primary)和從節點(Secondary)。服務器

主節點:在一個複製集中只有而且必須有一個主節點,主節點也是衆多實例中惟一能夠接收客戶端寫操做的節點,固然也能夠進行讀操做;架構

從節點:從節點會複製主節點的操做,以獲取徹底一致的數據集。客戶端不可以直接對從節點進行寫操做,可是能夠進行讀操做,這個須要經過複製集選項進行設置。app

投票節點:投票節點 並不含有 複製集中的數據集副本,且也 沒法 升職爲主節點。投票節點的存在是爲了使複製集中的節點數量爲奇數,這樣保證在進行投票的時候不會出現票數相同的狀況。若是添加了一個節點後,總節點數爲偶數,那麼就須要相應的增長一個投票節點。ui

注:MongoDB 3.0 把複製集中的成員數量從原來的12個提高到了50個,可是投票節點的數量仍然保持不變,仍是7個。spa

最基本的複製集架構

此處輸入圖片的描述
一個主節點,兩個從節點,自動化故障切換的特性
最基本的複製集架構是有3個節點的形式。這樣在主節點不可用之後,從節點會進行投票選出一個節點成爲主節點,繼續工做。以下圖所示:日誌

此處輸入圖片的描述

從新投票選出主節點

三個節點的複製集架構,還有另一種形式:一個主節點,一個從節點,一個投票節點。以下圖所示:
此處輸入圖片的描述
一個主節點,一個從節點,一個投票節點
在這種架構中,當主節點不可用時,只有從節點能夠升爲主節點,而投票節點是不能夠成爲主節點的。投票節點僅僅在選舉中進行投票。以下圖所示:
此處輸入圖片的描述code

從節點沒法升職爲主節點的狀況

其餘概念
從節點還有集中特殊的設置狀況,不一樣的設置有不一樣的需求:

優先級爲0:設置 priority:0 ,那麼該結點將不能成爲主節點,可是其數據還是與主節點保持一致的,並且應用程序也能夠進行讀操做。這樣能夠在某些特殊的狀況下,保證其餘特定節點優先成爲主節點。

此處輸入圖片的描述

隱藏節點:隱藏節點與主節點的數據集一致,可是對於應用程序來講是不可見的。隱藏節點能夠很好的與 複製集 中的其餘節點隔離,並應對特殊的需求,好比進行報表或者數據備份。隱藏節點也應該是一個不能升職爲主節點的優先級爲0的節點。
此處輸入圖片的描述

延時節點:延時節點也將從 複製集 中主節點複製數據,然而延時節點中的數據集將會比複製集中主節點的數據延後。舉個例子,如今是09:52,若是延時節點延後了1小時,那麼延時節點的數據集中將不會有08:52以後的操做。

因爲延時節點的數據集是延時的,所以它能夠幫助咱們在人爲誤操做或是其餘意外狀況下恢復數據。舉個例子,當應用升級失敗,或是誤操做刪除了表和數據庫時,咱們能夠經過延時節點進行數據恢復。

oplog:全拼 oprations log,它保存有數據庫的全部的操做的記錄。在複製集中,主節點產生 oplog,而後從節點複製主節點的 oplog 進行相應的操做,這樣達到保持數據集一致的要求。所以從節點的數據與主節點的數據相比是有延遲的。

配置

# 建立數據存儲目錄
mkdir -p /data/r0 /data/r1 /data/r2

# 建立日誌文件
touch /var/log/mongo17.log /var/log/mongo18.log /var/log/mongo19.log

#啓動3個實例,且聲明實例屬於某複製集 rsa
./bin/mongod --port 27017 --dbpath /data/r0 --smallfiles --replSet rsa --fork --logpath /var/log/mongo17.log
./bin/mongod --port 27018 --dbpath /data/r1 --smallfiles --replSet rsa --fork --logpath /var/log/mongo18.log
./bin/mongod --port 27019 --dbpath /data/r2 --smallfiles --replSet rsa --fork --logpath /var/log/mongo19.log

# 進入27017進行配置初始化
./bin/mongo --port 27017
rsconf = {
    _id:'rsa',
    members:
    [
        {_id:0,
        host:'192.168.42.168:27017'
        }
    ]
}
rs.initiate(rsconf); # 若是之後須要再重載一下config的話,用rs.reconfig(rsconf);

# 添加節點
rs.add('192.168.42.168:27018');
rs.add('192.168.42.168:27019');

# 查看狀態
rs.status();

# 刪除節點
rs.remove('192.168.1.201:27019');

# 主節點插入數據
>use test
>db.user.insert({uid:1,name:'lily'});

#鏈接secondary查詢同步狀況
./bin/mongo --port 27019
>show dbs

rsa:SECONDARY> show dbs;
2015-08-27T11:39:00.638+0800 E QUERY    Error: listDatabases failed:{ "note" : "from execCommand", "ok" : 0, "errmsg" : "not master" }

# 還能夠經過isMaster()命令來查看信息;
rsa:PRIMARY> db.isMaster();
{
        "setName" : "rsa",
        "setVersion" : 5,
        "ismaster" : true,
        "secondary" : false,
        "hosts" : [
                "192.168.42.168:27018",
                "192.168.42.168:27019",
                "192.168.42.168:27017"
        ],
        "primary" : "192.168.42.168:27018",
        "me" : "192.168.42.168:27018",
        "electionId" : ObjectId("55dea0cffa0c638625a82486"),
        "maxBsonObjectSize" : 16777216,
        "maxMessageSizeBytes" : 48000000,
        "maxWriteBatchSize" : 1000,
        "localTime" : ISODate("2015-08-27T05:49:13.740Z"),
        "maxWireVersion" : 3,
        "minWireVersion" : 0,
        "ok" : 1
}

# 出現上述錯誤,是由於slave默認不準讀寫
>rs.slaveOk();
>show dbs; # 執行上面一個語句就能夠看到和primary一致的數據,而且能夠把讀和寫分離開來;

以上即是一個最簡單的複製集架構,其中若是27017的主節點崩潰,那27018的節點就由從節點變爲主節點;注意,若是再添加原來的27017節點進來,那主節點仍是27018;

自動化配置腳本

#!/bin/bash
IP='192.168.1.202'
NA='rsb'

if [ "$1" = "reset" ]
then
  pkill -9 mongo
  rm -rf /home/m*
  exit
fi


if [ "$1" = "install" ]
then

mkdir -p /home/m0 /home/m1 /home/m2 /home/mlog

/usr/local/mongodb/bin/mongod --dbpath /home/m0 --logpath /home/mlog/m17.log --logappend --port 27017 --fork 
--replSet ${NA}
/usr/local/mongodb/bin/mongod --dbpath /home/m1 --logpath /home/mlog/m18.log --logappend --port 27018 --fork 
--replSet ${NA}
/usr/local/mongodb/bin/mongod --dbpath /home/m2 --logpath /home/mlog/m19.log --logappend --port 27019 --fork 
--replSet ${NA}
   
exit
fi

if [ "$1" = "repl" ]
then
/usr/local/mongodb/bin/mongo <<EOF

use admin
rsconf = {
  _id:'${NA}',
  members:[
    {_id:0,host:'${IP}:27017'},
    {_id:1,host:'${IP}:27018'},
    {_id:2,host:'${IP}:27019'},
  ]
}
rs.initiate(rsconf)
EOF
fi
相關文章
相關標籤/搜索