溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

詳解MongoDB復(fù)制集

發(fā)布時(shí)間:2020-07-21 00:26:47 來源:網(wǎng)絡(luò) 閱讀:626 作者:明月幽谷 欄目:MongoDB數(shù)據(jù)庫

何為復(fù)制集?

復(fù)制集是額外的數(shù)據(jù)副本,是跨多個(gè)服務(wù)器同步數(shù)據(jù)的過程,復(fù)制集提供了冗余并增加了數(shù)據(jù)可用性,通過復(fù)制集可以對(duì)硬件故障和中斷的服務(wù)進(jìn)行恢復(fù)。

復(fù)制集主從同步的原理和mysql類似,主節(jié)點(diǎn)記錄在其上的所有操作到oplog中,從節(jié)點(diǎn)定期輪詢主節(jié)點(diǎn)獲取這些操作,然后對(duì)自己的數(shù)據(jù)副本執(zhí)行這些操作,從而保證從節(jié)點(diǎn)的數(shù)據(jù)與主節(jié)點(diǎn)一致。


復(fù)制集的優(yōu)勢(shì)如下:


(1)讓數(shù)據(jù)更安全


(2)高數(shù)據(jù)可用性(24*7)


(3)災(zāi)難恢復(fù)


(4)無停機(jī)維護(hù)(如備份、索引重建、故障轉(zhuǎn)移)


(5)讀縮放(額外的副本讀?。?/h3>


(6)副本集對(duì)應(yīng)用程序是透明。

MongoDB復(fù)制集結(jié)構(gòu)原理圖分析

  • .mongodb的復(fù)制集至少需要兩個(gè)節(jié)點(diǎn)。其中一個(gè)是主節(jié)點(diǎn)(Primary),負(fù)責(zé)處理客戶端請(qǐng)求,其余的都是從節(jié)點(diǎn)(Secondary),負(fù)責(zé)復(fù)制主節(jié)點(diǎn)上的數(shù)據(jù)。

  • mongodb各個(gè)節(jié)點(diǎn)常見的搭配方式為:一主一從或一主多從。

  • 客戶端在主節(jié)點(diǎn)寫入數(shù)據(jù),在從節(jié)點(diǎn)讀取數(shù)據(jù),主節(jié)點(diǎn)與從節(jié)點(diǎn)進(jìn)行數(shù)據(jù)交互,保障數(shù)據(jù)的一致性。如果其中一個(gè)節(jié)點(diǎn)出現(xiàn)故障,其他節(jié)點(diǎn)馬上會(huì)將業(yè)務(wù)接過來而無需停機(jī)操作

詳解MongoDB復(fù)制集

復(fù)制集的特點(diǎn):

1.N 個(gè)節(jié)點(diǎn)的集群


2.任何節(jié)點(diǎn)可作為主節(jié)點(diǎn)


3.所有寫入操作都在主節(jié)點(diǎn)上



4.自動(dòng)故障轉(zhuǎn)移


5.自動(dòng)恢復(fù)

MongoDB復(fù)制集部署

  • 在一臺(tái)CentOS7主機(jī)上使用yum在線安裝Mongodb,并創(chuàng)建多實(shí)例,進(jìn)行部署MongoDB復(fù)制集

首先配置網(wǎng)絡(luò)YUM源,baseurl(下載路徑)指定為mongodb官網(wǎng)提供的yum倉庫

vim /etc/yum.repos.d/mongodb.repo

[mongodb-org]

name=MongoDB Repository

baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.6/x86_64/             #指定獲得下載的路徑

gpgcheck=1                     #表示對(duì)從這個(gè)源下載的rpm包進(jìn)行校驗(yàn)

enabled=1                   #表示啟用這個(gè)源。

gpgkey=https://www.mongodb.org/static/pgp/server-3.6.asc

重新加載yum源,并使用yum命令下載安裝mongodb

yum list

yum -y install mongodb-org

準(zhǔn)備4個(gè)實(shí)例,暫時(shí)開啟3個(gè), 1主2從    再額外添加群集(追加實(shí)例)也可以撤銷實(shí)例

  • 創(chuàng)建數(shù)據(jù)文件和日志文件存儲(chǔ)路徑,并賦予權(quán)限


    [root@localhost ~]# mkdir -p /data/mongodb{2,3,4}
    [root@localhost ~]# mkdir /data/logs
    [root@localhost ~]# touch /data/logs/mongodb{2,3,4}.log
    [root@localhost ~]# chmod 777 /data/logs/mongodb*
    [root@localhost ~]# ll /data/logs/
    總用量 0
    -rwxrwxrwx. 1 root root 0 9月  15 22:31 mongodb2.log
    -rwxrwxrwx. 1 root root 0 9月  15 22:31 mongodb3.log
    -rwxrwxrwx. 1 root root 0 9月  15 22:31 mongodb4.log

編輯4個(gè)MongoDB實(shí)例的配置文件

  • 先編輯yum安裝的默認(rèn)實(shí)例的配置文件/etc/mongod.conf,指定監(jiān)聽I(yíng)P,端口默認(rèn)為27017,開啟replication參數(shù)配置,replSetName:true(自定義)

[root@localhost ~]# vim /etc/mongod.conf

# mongod.conf

# for documentation of all options, see:
#   http://docs.mongodb.org/manual/reference/configuration-options/  

# where to write logging data.
systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongod.log

# Where and how to store data.
storage:
  dbPath: /var/lib/mongo
  journal:
    enabled: true
#  engine:
#  mmapv1:
#  wiredTiger:

# how the process runs
processManagement:
  fork: true  # fork and run in background
  pidFilePath: /var/run/mongodb/mongod.pid  # location of pidfile
  timeZoneInfo: /usr/share/zoneinfo

# network interfaces
net: 

  port: 27017                    #默認(rèn)端口         
  bindIp: 0.0.0.0             #監(jiān)聽任意地址

#security:

#operationProfiling:

replication:                   #去掉前面的“#”注釋,開啟該參數(shù)設(shè)置
replSetName: true          #設(shè)置復(fù)制集名稱

  • 復(fù)制配置文件給其他實(shí)例,并將mongodb2.conf 中的port參數(shù)配置為27018,mongod3.conf中的port參數(shù)配置為27019,mongod4.conf中的port參數(shù)配置為27020。 同樣也將dbpath和logpath參數(shù)修改為對(duì)應(yīng)的路徑值

cp  /etc/mongod.conf /etc/mongod2.conf

cp /etc/mongod2.conf /etc/mongod3.conf

cp /etc/mongod2.conf /etc/mongod4.conf

  • 實(shí)例2的配置文件mongodb2.conf 修改

vim /etc/mongod2.conf

systemLog:

  destination: file

  logAppend: true

  path: /data/logs/mongodb2.log    

storage:

  dbPath: /data/mongodb/mongodb2  

  journal:

enabled: true

port: 27018 

bindIp: 0.0.0.0  # Listen to local interface only, comment to listen on all interfaces.

#security:

#operationProfiling:

replication:
replSetName: true

  • 實(shí)例3的配置文件mongodb3.conf 修改

vim /etc/mongod3.conf

systemLog:

  destination: file

  logAppend: true

  path: /data/logs/mongodb3.log    

storage:

  dbPath: /data/mongodb/mongodb3 

  journal:

enabled: true

port: 27019 

bindIp: 0.0.0.0  # Listen to local interface only, comment to listen on all interfaces.

#security:

#operationProfiling:

replication:
replSetName: true

  • 實(shí)例4的配置文件mongodb4.conf 修改

vim /etc/mongod4.conf

systemLog:

  destination: file

  logAppend: true

  path: /data/logs/mongodb4.log    

storage:

  dbPath: /data/mongodb/mongodb4  

  journal:

enabled: true

port: 27020 

bindIp: 0.0.0.0  # Listen to local interface only, comment to listen on all interfaces.

#security:

#operationProfiling:

replication:
replSetName: true

啟動(dòng)mongodb各實(shí)例

[root@localhost ~]# mongod -f /etc/mongod.conf
about to fork child process, waiting until server is ready for connections.
forked process: 93576
child process started successfully, parent exiting
[root@localhost ~]# mongod -f /etc/mongod2.conf
about to fork child process, waiting until server is ready for connections.
forked process: 93608
child process started successfully, parent exiting
[root@localhost ~]# mongod -f /etc/mongod3.conf
about to fork child process, waiting until server is ready for connections.
forked process: 93636
child process started successfully, parent exiting
[root@localhost ~]# mongod -f /etc/mongod4.conf
about to fork child process, waiting until server is ready for connections.
forked process: 93664
child process started successfully, parent exiting
[root@localhost ~]# netstat -antp | grep mongod                        //查看mongodb進(jìn)程狀態(tài)
tcp        0      0 0.0.0.0:27019           0.0.0.0:*               LISTEN      93636/mongod       
tcp        0      0 0.0.0.0:27020           0.0.0.0:*               LISTEN      93664/mongod       
tcp        0      0 0.0.0.0:27017           0.0.0.0:*               LISTEN      93576/mongod       
tcp        0      0 0.0.0.0:27018           0.0.0.0:*               LISTEN      93608/mongod

配置三個(gè)節(jié)點(diǎn)的復(fù)制集

[root@localhost ~]# mongo                     //進(jìn)入其中一個(gè)實(shí)例
MongoDB shell version v3.6.7
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.6.7

> rs.status()                               //查看復(fù)制集狀態(tài),提示復(fù)制集還未配置
{
    "info" : "run rs.initiate(...) if not yet done for the set",
    "ok" : 0,
    "errmsg" : "no replset config has been received",
    "code" : 94,
    "codeName" : "NotYetInitialized",
    "operationTime" : Timestamp(0, 0),
    "$clusterTime" : {
        "clusterTime" : Timestamp(0, 0),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    }

> cfg={"_id":"true","members":[{"_id":0,"host":"192.168.195.137:27017"},{"_id":1,"host":"192.168.195.137:27018"},{"_id":2,"host":"192.168.195.137:27019"}]}                    // 定義cfg初始化參數(shù)                    
{
    "_id" : "true",
    "members" : [
        {
            "_id" : 0,
            "host" : "192.168.195.137:27017"
        },
        {
            "_id" : 1,
            "host" : "192.168.195.137:27018"
        },
        {
            "_id" : 2,
            "host" : "192.168.195.137:27019"
        }
    ]
}

> rs.initiate(cfg)                    //初始化并啟動(dòng)復(fù)制集

{"ok" : 1}

true:PRIMARY> rs.status()               //再次查看復(fù)制集的狀態(tài)信息
{
    "set" : "true",
    "date" : ISODate("2018-09-15T15:39:48.426Z"),
    "myState" : 1,
    "term" : NumberLong(1),
    "syncingTo" : "",
    "syncSourceHost" : "",
    "syncSourceId" : -1,
    "heartbeatIntervalMillis" : NumberLong(2000),
    "optimes" : {
        "lastCommittedOpTime" : {
            "ts" : Timestamp(1537025984, 1),
            "t" : NumberLong(1)
        },
        "readConcernMajorityOpTime" : {
            "ts" : Timestamp(1537025984, 1),
            "t" : NumberLong(1)
        },
        "appliedOpTime" : {
            "ts" : Timestamp(1537025984, 1),
            "t" : NumberLong(1)
        },
        "durableOpTime" : {
            "ts" : Timestamp(1537025984, 1),
            "t" : NumberLong(1)
        }
    },
    "members" : [
        {
            "_id" : 0,
           "name" : "192.168.195.137:27017",
            "health" : 1,
            "state" : 1,
           "stateStr" : "PRIMARY",              //此節(jié)點(diǎn)成為主節(jié)點(diǎn)
            "uptime" : 1371,
            "optime" : {
                "ts" : Timestamp(1537025984, 1),
                "t" : NumberLong(1)
            },

....................


                  {
            "_id" : 1,
            "name" : "192.168.195.137:27018",
            "health" : 1,
            "state" : 2,
           "stateStr" : "SECONDARY",                //此節(jié)點(diǎn)為從節(jié)點(diǎn)
            "uptime" : 18,
            "optime" : {
                "ts" : Timestamp(1537025984, 1),
                "t" : NumberLong(1)
            },
            "optimeDurable" : {
                "ts" : Timestamp(1537025984, 1),
                "t" : NumberLong(1)
            },

...................


                 {
            "_id" : 2,
            "name" : "192.168.195.137:27019",
            "health" : 1,
            "state" : 2,
           "stateStr" : "SECONDARY",                   //此節(jié)點(diǎn)為從節(jié)點(diǎn)
            "uptime" : 18,
            "optime" : {
                "ts" : Timestamp(1537025984, 1),
                "t" : NumberLong(1)
            },
            "optimeDurable" : {
                "ts" : Timestamp(1537025984, 1),
                "t" : NumberLong(1)
            },
         

  • 添加節(jié)點(diǎn)

true:PRIMARY> rs.add("192.168.195.137:27020")

true:PRIMARY> rs.status()

..............

{
            "_id" : 3,
            "name" : "192.168.195.137:27020",
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",
            "uptime" : 8,
            "optime" : {
                "ts" : Timestamp(1537026818, 1),
                "t" : NumberLong(1)
            },
            "optimeDurable" : {
                "ts" : Timestamp(1537026818, 1),
                "t" : NumberLong(1)
            },

.................

  • 刪除節(jié)點(diǎn)

true:PRIMARY> rs.remove("192.168.195.137:27020")

模擬故障自動(dòng)轉(zhuǎn)移切換

[root@localhost ~]# mongod -f /etc/mongod.conf --shutdown              //關(guān)閉主節(jié)點(diǎn)服務(wù)
killing process with pid: 93576
[root@localhost ~]# mongo --port 27018                      //進(jìn)入其中一個(gè)從節(jié)點(diǎn)
MongoDB shell version v3.6.7
connecting to: mongodb://127.0.0.1:27018/
MongoDB server version: 3.6.7

true:PRIMARY> rs.status()                  //查看復(fù)制集信息

..............


    },
    "members" : [
        {
            "_id" : 0,
           "name" : "192.168.195.137:27017",                           //原來的主節(jié)點(diǎn)健康值為0
            "health" : 0,
            "state" : 8,
            "stateStr" : "(not reachable/healthy)",
            "uptime" : 0,
            "optime" : {
                "ts" : Timestamp(0, 0),
                "t" : NumberLong(-1)
            },
            "optimeDurable" : {
                "ts" : Timestamp(0, 0),
                "t" : NumberLong(-1)
            },

.................


                  {
            "_id" : 1,
           "name" : "192.168.195.137:27018",
            "health" : 1,
            "state" : 1,
           "stateStr" : "PRIMARY",                         //此節(jié)點(diǎn)切換成主節(jié)點(diǎn)
            "uptime" : 2657,
            "optime" : {
                "ts" : Timestamp(1537027275, 1),
                "t" : NumberLong(2)
            },

................


                    {
            "_id" : 2,
            "name" : "192.168.195.137:27019",
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",
            "uptime" : 1312,
            "optime" : {
                "ts" : Timestamp(1537027275, 1),
                "t" : NumberLong(2)
            },
            "optimeDurable" : {
                "ts" : Timestamp(1537027275, 1),
                "t" : NumberLong(2)
            },
          

手動(dòng)進(jìn)行主從切換

[root@localhost ~]# mongod -f /etc/mongod.conf           #開啟剛才關(guān)閉的端口為27017的節(jié)點(diǎn)實(shí)例

about to fork child process, waiting until server is ready for connections.
forked process: 94723
child process started successfully, parent exiting
[root@localhost ~]# mongo --port 27018             #進(jìn)入主節(jié)點(diǎn)服務(wù)器實(shí)例
MongoDB shell version v3.6.7
connecting to: mongodb://127.0.0.1:27018/
MongoDB server version: 3.6.7

true:PRIMARY> rs.freeze(30)                     //暫停30s不參與選舉

true:PRIMARY> rs.stepDown(60.30)              //交出主節(jié)點(diǎn)位置,維持從節(jié)點(diǎn)狀態(tài)不少于60秒,等待30秒使主節(jié)點(diǎn)和從節(jié)點(diǎn)日志同步  

true:SECONDARY> rs.status()             //可以看到本實(shí)例已經(jīng)切換成從節(jié)點(diǎn)

................


    "members" : [
        {
            "_id" : 0,
            "name" : "192.168.195.137:27017",                // 端口27017的節(jié)點(diǎn)變成了主節(jié)點(diǎn)
            "health" : 1,
            "state" : 1,
            "stateStr" : "PRIMARY",                        
            "uptime" : 167,
            "optime" : {
                "ts" : Timestamp(1537027620, 1),
                "t" : NumberLong(3)
            },
            "optimeDurable" : {
                "ts" : Timestamp(1537027620, 1),
                "t" : NumberLong(3)
            },

..................
            
        {
            "_id" : 1,
            "name" : "192.168.195.137:27018",                    // 端口27018的節(jié)點(diǎn)變成了從節(jié)點(diǎn)         

            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",
            "uptime" : 2997,
            "optime" : {
                "ts" : Timestamp(1537027620, 1),
                "t" : NumberLong(3)
            },

...................
          
        {
            "_id" : 2,
            "name" : "192.168.195.137:27019",
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",
            "uptime" : 1651,
            "optime" : {
                "ts" : Timestamp(1537027620, 1),
                "t" : NumberLong(3)
            },
            "optimeDurable" : {
                "ts" : Timestamp(1537027620, 1),
                "t" : NumberLong(3)
            },

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI