在centos7上搭建mongodb副本集


1.安裝副本集介紹

副本集(Replica Set)是一組MongoDB實例組成的集群,由一個主(Primary)服務器和多個備份(Secondary)服務器構成。通過Replication,將數據的更新由Primary推送到其他實例上,在一定的延遲之后,每個MongoDB實例維護相同的數據集副本。通過維護冗余的數據庫副本,能夠實現數據的異地備份,讀寫分離和自動故障轉移。

也就是說如果主服務器崩潰了,備份服務器會自動將其中一個成員升級為新的主服務器。使用復制功能時,如果有一台服務器宕機了,仍然可以從副本集的其他服務器上訪問數據。如果服務器上的數據損壞或者不可訪問,可以從副本集的某個成員中創建一份新的數據副本。

早期的MongoDB版本使用master-slave,一主一從和MySQL類似,但slave在此架構中為只讀,當主庫宕機后,從庫不能自動切換為主。目前已經淘汰master-slave模式,改為副本集,這種模式下有一個主(primary),和多個從(secondary),只讀。支持給它們設置權重,當主宕掉后,權重最高的從切換為主。在此架構中還可以建立一個仲裁(arbiter)的角色,它只負責裁決,而不存儲數據。此架構中讀寫數據都是在主上,要想實現負載均衡的目的需要手動指定讀庫的目標server。

官方文檔地址:https://docs.mongodb.com/manual/replication/

副本集架構圖:

2.mongodb副本集搭建

由於在本地虛擬機中,機器有限,搭建偽集群模擬

首先安裝啟動三個mongod進程 端口分別是:27017,27108,27019

具體步驟如下:

2.1 依次啟動mongodb服務

①解壓

tar zxvf mongodb-linux-x86_64-rhel62-3.6.3.tgz

②修改名稱

mv mongodb-linux-x86_64-rhel62-3.6.3 mongodb1

③創建相應的文件夾

cd mongodb1

mkdir data   //數據目錄

mkdir logs   //日志目錄

mkdir conf  // 配置文件目錄

cd conf

touch mongo.conf   //新建配置文件

port=27017
dbpath=/home/lcc/mongodb1/data
logpath=/home/lcc/mongodb1/logs/mongod.log
fork = true    //后台啟動
bind_ip=0.0.0.0   
replSet = replset  //副本集的名稱

④啟動mongod服務

cd mongodb1

./bin/mongod -f conf/mongo.conf

至此mongodb1就啟動起來了,依次啟動mongodb2,mongodb3(注意修改暴露端口)

2.2 副本集配置

服務器啟動之后,進入任意一個節點的命令行,將三個的實例關聯起來

進入mongodb1的客戶端:

cd mongodb1

./bin/mongo

> config = {
... _id : "replset",
... members : [
... {_id : 0, host : "192.168.73.29:27017"},
... {_id : 1, host : "192.168.73.29:27018"},
... {_id : 2, host : "192.168.73.29:27019"}]}
{
        "_id" : "replset",
        "members" : [
                {
                        "_id" : 0,
                        "host" : "192.168.73.29:27017"
                },
                {
                        "_id" : 1,
                        "host" : "192.168.73.29:27018"
                },
                {
                        "_id" : 2,
                        "host" : "192.168.73.29:27019"
                }
        ]
}

初始化副本集的配置

rs.initiate(config)
{
        "ok" : 1,
        "operationTime" : Timestamp(1520260635, 1),
        "$clusterTime" : {
                "clusterTime" : Timestamp(1520260635, 1),
                "signature" : {
                        "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                        "keyId" : NumberLong(0)
                }
        }
}
replset:SECONDARY> 

當初始化配置信息后,可以明顯的看到mongodb的命令行發生了變化,會顯示出當前節點所屬的副本集名稱和節點類型。

再次進去mongodb1客戶端:

發現mongodb1作為了主節點
至此,mongodb的副本集配置已經完成了,接下來是測試副本集是否可用

3.測試

3.1查看副本集狀態

replset:SECONDARY> rs.config()
{
    "_id" : "replset",
    "version" : 1,
    "protocolVersion" : NumberLong(1),
    "members" : [
        {
            "_id" : 0,
            "host" : "192.168.73.129:27017",
            "arbiterOnly" : false,
            "buildIndexes" : true,
            "hidden" : false,
            "priority" : 1,
            "tags" : {
                
            },
            "slaveDelay" : NumberLong(0),
            "votes" : 1
        },
        {
            "_id" : 1,
            "host" : "192.168.73.129:27018",
            "arbiterOnly" : false,
            "buildIndexes" : true,
            "hidden" : false,
            "priority" : 1,
            "tags" : {
                
            },
            "slaveDelay" : NumberLong(0),
            "votes" : 1
        },
        {
            "_id" : 2,
            "host" : "192.168.73.129:27019",
            "arbiterOnly" : false,
            "buildIndexes" : true,
            "hidden" : false,
            "priority" : 1,
            "tags" : {
                
            },
            "slaveDelay" : NumberLong(0),
            "votes" : 1
        }
    ],
    "settings" : {
        "chainingAllowed" : true,
        "heartbeatIntervalMillis" : 2000,
        "heartbeatTimeoutSecs" : 10,
        "electionTimeoutMillis" : 10000,
        "catchUpTimeoutMillis" : -1,
        "catchUpTakeoverDelayMillis" : 30000,
        "getLastErrorModes" : {
            
        },
        "getLastErrorDefaults" : {
            "w" : 1,
            "wtimeout" : 0
        },
        "replicaSetId" : ObjectId("5b3c7d50a5952cfcd32c859b")
    }
}
replset:PRIMARY> 

3.2 查看主節點信息

replset:PRIMARY> rs.isMaster()
{
    "hosts" : [
        "192.168.73.129:27017",
        "192.168.73.129:27018",
        "192.168.73.129:27019"
    ],
    "setName" : "replset",
    "setVersion" : 1,
    "ismaster" : true,
    "secondary" : false,
    "primary" : "192.168.73.129:27017",
    "me" : "192.168.73.129:27017",
    "electionId" : ObjectId("7fffffff0000000000000001"),
    "lastWrite" : {
        "opTime" : {
            "ts" : Timestamp(1530690959, 1),
            "t" : NumberLong(1)
        },
        "lastWriteDate" : ISODate("2018-07-04T07:55:59Z"),
        "majorityOpTime" : {
            "ts" : Timestamp(1530690959, 1),
            "t" : NumberLong(1)
        },
        "majorityWriteDate" : ISODate("2018-07-04T07:55:59Z")
    },
    "maxBsonObjectSize" : 16777216,
    "maxMessageSizeBytes" : 48000000,
    "maxWriteBatchSize" : 100000,
    "localTime" : ISODate("2018-07-04T07:56:08.530Z"),
    "logicalSessionTimeoutMinutes" : 30,
    "minWireVersion" : 0,
    "maxWireVersion" : 6,
    "readOnly" : false,
    "ok" : 1,
    "operationTime" : Timestamp(1530690959, 1),
    "$clusterTime" : {
        "clusterTime" : Timestamp(1530690959, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    }
}
replset:PRIMARY> 

3.3 數據測試

插入100條數據

replset:PRIMARY> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
test    0.000GB
replset:PRIMARY> use test
switched to db test
replset:PRIMARY> for(var i = 0; i < 100; i++) {
... db.test.insert({order: i, name: "test" + i}) }
WriteResult({ "nInserted" : 1 })
replset:PRIMARY> db.test.count()
100
replset:PRIMARY>

進入副本節點查看數據是否同步

[lcc@localhost mongodb3]$ ./bin/mongo 192.168.73.129:27018
MongoDB shell version v3.6.3
connecting to: mongodb://192.168.73.129:27018/test
MongoDB server version: 3.6.3
Server has startup warnings: 
2018-07-04T00:46:51.797-0700 I CONTROL  [initandlisten] 
2018-07-04T00:46:51.797-0700 I CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.
2018-07-04T00:46:51.797-0700 I CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.
2018-07-04T00:46:51.797-0700 I CONTROL  [initandlisten] 
2018-07-04T00:46:51.797-0700 I CONTROL  [initandlisten] 
2018-07-04T00:46:51.797-0700 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2018-07-04T00:46:51.797-0700 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2018-07-04T00:46:51.797-0700 I CONTROL  [initandlisten] 
2018-07-04T00:46:51.797-0700 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2018-07-04T00:46:51.797-0700 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2018-07-04T00:46:51.797-0700 I CONTROL  [initandlisten] 
replset:SECONDARY> show dbs
2018-07-04T01:23:47.373-0700 E QUERY    [thread1] Error: listDatabases failed:{
    "operationTime" : Timestamp(1530692619, 1),
    "ok" : 0,
    "errmsg" : "not master and slaveOk=false",
    "code" : 13435,
    "codeName" : "NotMasterNoSlaveOk",
    "$clusterTime" : {
        "clusterTime" : Timestamp(1530692619, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    }
} :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
Mongo.prototype.getDBs@src/mongo/shell/mongo.js:65:1
shellHelper.show@src/mongo/shell/utils.js:816:19
shellHelper@src/mongo/shell/utils.js:706:15
@(shellhelp2):1:1
replset:SECONDARY> 

當我們要查看從節點數據時,發現出錯,這是因為從節點默認情況下是拒絕讀取的,因此需開啟讀取功能

replset:SECONDARY> rs.slaveOk()

接着再查看數據,發現已經同步了

replset:SECONDARY> use test
switched to db test
replset:SECONDARY> db.test.count()
100


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM