1. 程式人生 > >每天一篇,深入學習MongoDB復制集

每天一篇,深入學習MongoDB復制集

每天一篇 mit bind child col ats net 快樂 tco

復制集概念:

復制集是額外的數據副本,是跨多個服務器同步數據的過程,提供了冗余並增加了數據的可用性,通過它可以對硬件故障和中斷的服務進行數據恢復

復制集工作原理:

MongoDB復制集最少需要兩個節點。

主節點:負責處理客戶端的請求,

從節點:負責復制主節點上的數據

搭配方式:一主一從或一主多從

註:客戶端在主節點寫入數據,在從節點讀取數據,主從進行數據交互,保證數據的一致性

MongoDB復制集部署

(1)配置復制集
[root@localhost ~]# mkdir -p /data/moongodb/mongodb{2,3,4}   //創建多實例
[root@localhost ~]# cd /data/mongodb/
[root@localhost mongodb]# 
mongo  mongod2.log  mongodb2  mongodb3  mongodb4
[root@localhost mongodb]# mkdir logs
[root@localhost mongodb]# ls
logs  mongo  mongodb2  mongodb3  mongodb4
[root@localhost mongodb]# touch logs/mongodb{2,3,4}.log
[root@localhost mongodb]# cd logs/
[root@localhost logs]# ls
mongodb2.log  mongodb3.log  mongodb4.log
[root@localhost logs]# chmod 777 *.log  //賦予最大權限
[root@localhost logs]# ls
mongodb2.log  mongodb3.log  mongodb4.log
[root@localhost logs]# ll
總用量 0
-rwxrwxrwx. 1 root root 0 7月  17 08:59 mongodb2.log
-rwxrwxrwx. 1 root root 0 7月  17 08:59 mongodb3.log
-rwxrwxrwx. 1 root root 0 7月  17 08:59 mongodb4.log
(2)編輯4個MongoDB實例的配置文件
[root@localhost etc]# vim mongod.conf
replication:                    //註釋此項
  replSetName: root123         //添加復制集名稱(自取),註意前面空兩格  

[root@localhost etc]# mongod -f /etc/mongod.conf  --shutdown  //關閉服務
killing process with pid: 1084
[root@localhost etc]# mongod -f /etc/mongod.conf  //開啟服務
about to fork child process, waiting until server is ready for connections.
forked process: 11329
child process started successfully, parent exiting
註:修改配置文件後需重啟服務,文件生效

[root@localhost etc]# cp -p mongod.conf mongod2.conf 
cp:是否覆蓋"mongod2.conf"? y
[root@localhost etc]# vim mongod2.conf
path:/data/mongodb/logs/mongodb2.log        //日誌存放位置
dbpath:/data/mongodb/mongodb2               //數據存放位置
port:                                      //修改端口號,端口號不能相同

[root@localhost etc]# cp -p mongod2.conf mongod3.conf  
[root@localhost etc]# cp -p mongod2.conf mongod4.conf 
[root@localhost etc]# vim mongod3.conf         //改序號和端口號即可,其它和2相同配置
[root@localhost etc]# vim mongod4.conf 
[root@localhost etc]# mongod -f /etc/mongod2.conf
[root@localhost etc]# mongod -f /etc/mongod3.conf
[root@localhost etc]# mongod -f /etc/mongod4.conf

[root@localhost etc]# netstat -antp | grep mongod      //四臺實例都已開啟
tcp        0      0 0.0.0.0:27019           0.0.0.0:*               LISTEN      11599/mongod        
tcp        0      0 0.0.0.0:27020           0.0.0.0:*               LISTEN      11627/mongod        
tcp        0      0 0.0.0.0:27017           0.0.0.0:*               LISTEN      11459/mongod        
tcp        0      0 0.0.0.0:27018           0.0.0.0:*               LISTEN      10252/mongod
(3)配置三個節點的復制集
[root@localhost etc]# systemctl stop firewalld.service    //關閉防火墻
[root@localhost etc]# setenforce 0

[root@localhost etc]#mongo
> show dbs
> cfg={"_id":"root123","members":[{"_id":0,"host":"192.168.200.184:27017"},{"_id":1,"host":"192.168.200.184:27018"},{"_id":2,"host":"192.168.200.184:27019"}]}                             //配置節點復制集
{
    "_id" : "root123",
    "members" : [
        {
            "_id" : 0,
            "host" : "192.168.200.184:27017"
        },
        {
            "_id" : 1,
            "host" : "192.168.200.184:27018"
        },
        {
            "_id" : 2,
            "host" : "192.168.200.184:27019"
        }
    ]
}
> db.stats()                                       
{
    "db" : "test",
    "collections" : 0,
    "views" : 0,
    "objects" : 0,
    "avgObjSize" : 0,
    "dataSize" : 0,
    "storageSize" : 0,
    "numExtents" : 0,
    "indexes" : 0,
    "indexSize" : 0,
    "fileSize" : 0,
    "fsUsedSize" : 0,
    "fsTotalSize" : 0,
    "ok" : 1,                                  //狀態ok=1,復制成功
    "$clusterTime" : {
        "clusterTime" : Timestamp(0, 0),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    }
}

123:SECONDARY> rs.status()                  //查看復制集狀態
{
    "set" : "root123",
    "date" : ISODate("2018-07-17T03:24:03.253Z"),
    "myState" : 1,
    "term" : NumberLong(1),
    "syncingTo" : "",
    "syncSourceHost" : "",
    "syncSourceId" : -1,
    "heartbeatIntervalMillis" : NumberLong(2000),
    "optimes" : {
        "lastCommittedOpTime" : {
            "ts" : Timestamp(1531797840, 1),
            "t" : NumberLong(1)
        },
        "readConcernMajorityOpTime" : {
            "ts" : Timestamp(1531797840, 1),
            "t" : NumberLong(1)
        },
        "appliedOpTime" : {
            "ts" : Timestamp(1531797840, 1),
            "t" : NumberLong(1)
        },
        "durableOpTime" : {
            "ts" : Timestamp(1531797840, 1),
            "t" : NumberLong(1)
        }
    },
    "members" : [
        {
            "_id" : 0,
            "name" : "192.168.200.184:27017",
            "health" : 1,
            "state" : 1,
            "stateStr" : "PRIMARY",                //狀態1為主
            "uptime" : 980,
            "optime" : {
                "ts" : Timestamp(1531797840, 1),
                "t" : NumberLong(1)
            },
            "optimeDate" : ISODate("2018-07-17T03:24:00Z"),
            "syncingTo" : "",
            "syncSourceHost" : "",
            "syncSourceId" : -1,
            "infoMessage" : "could not find member to sync from",
            "electionTime" : Timestamp(1531797808, 1),
            "electionDate" : ISODate("2018-07-17T03:23:28Z"),
            "configVersion" : 1,
            "self" : true,
            "lastHeartbeatMessage" : ""
        },
        {
            "_id" : 1,
            "name" : "192.168.200.184:27018",
            "health" : 1,
            "state" : 2,        
            "stateStr" : "SECONDARY",               //狀態2為從
            "uptime" : 45,
            "optime" : {
                "ts" : Timestamp(1531797840, 1),
                "t" : NumberLong(1)
            },
            "optimeDurable" : {
                "ts" : Timestamp(1531797840, 1),
                "t" : NumberLong(1)
            },
            "optimeDate" : ISODate("2018-07-17T03:24:00Z"),
            "optimeDurableDate" : ISODate("2018-07-17T03:24:00Z"),
            "lastHeartbeat" : ISODate("2018-07-17T03:24:02.633Z"),
            "lastHeartbeatRecv" : ISODate("2018-07-17T03:24:02.920Z"),
            "pingMs" : NumberLong(0),
            "lastHeartbeatMessage" : "",
            "syncingTo" : "192.168.200.184:27017",
            "syncSourceHost" : "192.168.200.184:27017",
            "syncSourceId" : 0,
            "infoMessage" : "",
            "configVersion" : 1
        },
        {
            "_id" : 2,
            "name" : "192.168.200.184:27019",
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",              //狀態2為從
            "uptime" : 45,
            "optime" : {
                "ts" : Timestamp(1531797840, 1),
                "t" : NumberLong(1)
            },
            "optimeDurable" : {
                "ts" : Timestamp(1531797840, 1),
                "t" : NumberLong(1)
            },
            "optimeDate" : ISODate("2018-07-17T03:24:00Z"),
            "optimeDurableDate" : ISODate("2018-07-17T03:24:00Z"),
            "lastHeartbeat" : ISODate("2018-07-17T03:24:02.633Z"),
            "lastHeartbeatRecv" : ISODate("2018-07-17T03:24:02.896Z"),
            "pingMs" : NumberLong(0),
            "lastHeartbeatMessage" : "",
            "syncingTo" : "192.168.200.184:27017",
            "syncSourceHost" : "192.168.200.184:27017",
            "syncSourceId" : 0,
            "infoMessage" : "",
            "configVersion" : 1
        }
    ],
    "ok" : 1,
    "operationTime" : Timestamp(1531797840, 1),
    "$clusterTime" : {
        "clusterTime" : Timestamp(1531797840, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    }
}
root123:PRIMARY>            //最後顯示此狀態

註:初始化配置時保證從節點沒有數據
(4)添加和刪除節點
root123:PRIMARY> rs.add("192.168.200.184:27020")
{
    "ok" : 1,
    "operationTime" : Timestamp(1531799035, 1),
    "$clusterTime" : {
        "clusterTime" : Timestamp(1531799035, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    }
}
root123:PRIMARY> rs.stats()
"_id" : 3,
            "name" : "192.168.200.184:27020",     //添加成功
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",             //也為從節點
            "uptime" : 26,
            "optime" : {
                "ts" : Timestamp(1531799060, 1),
                "t" : NumberLong(1)
            },

root123:PRIMARY> rs.remove("192.168.200.184:27020")
{
    "ok" : 1,                                   //刪除成功
    "operationTime" : Timestamp(1531799257, 1),
    "$clusterTime" : {
        "clusterTime" : Timestamp(1531799257, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    }
}
(5)模擬故障自動轉移
[root@localhost mongodb]# ps aux | grep mongod
root      12342  1.3  5.8 1465664 58768 ?       Sl   11:07   0:38 mongod -f /etc/mongod3.conf
root      12387  1.0  5.9 1442988 59124 ?       Sl   11:07   0:29 mongod -f /etc/mongod4.conf
root      12428  1.4  6.4 1582772 64516 ?       Sl   11:07   0:40 mongod -f /etc/mongod.conf
root      12667  1.5  6.2 1459800 62268 ?       Sl   11:17   0:35 mongod -f /etc/mongod2.conf
root      13655  0.0  0.0 112676   984 pts/0    S+   11:55   0:00 grep --color=auto mongod
[root@localhost mongodb]# kill -9 12428
[root@localhost mongodb]# mongo
root123:SECONDARY> rs.status()
"members" : [
        {
            "_id" : 0,
            "name" : "192.168.200.184:27017",
            "health" : 0,                  //第一臺健康值為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" : 2,
            "name" : "192.168.200.184:27019",
            "health" : 1,
            "state" : 1,
            "stateStr" : "PRIMARY",         //27019跳為主節點        
            "uptime" : 2039,
            "optime" : {
                "ts" : Timestamp(1531799828, 1),
                "t" : NumberLong(2)
            },
            "optimeDurable" : {
                "ts" : Timestamp(1531799828, 1),
                "t" : NumberLong(2)
            },

多學多練,快樂無限~!!!

每天一篇,深入學習MongoDB復制集