docker-compose搭建mongoDB副本集(1主+1副+1仲裁)


一、基本概念

 1、副本集:一個副本集就是一組MongoDB實例組成的集群,由一個主(Primary)服務器和多個備份(Secondary)服務器構成

 2、主節點(master):主節點接收所有寫入操作。主節點將對其數據集所做的所有更改記錄到其 oplog。

 3、副節點(secondary):復制主節點的 oplog 並將操作應用到其數據集,如果主節點不可用,一個合格的副節點將被選為新的主節點。

 4、仲裁節點(arbiter):負載選舉,當主節點不可用,它將從副節點中選一個作為主節點。

 

二、部署副本集

1、下載monodb鏡像,我這里版本為:3.2.11

docker pull registry.cn-hangzhou.aliyuncs.com/boshen-ns/mongodb:3.2.11
docker tag docker pull registry.cn-hangzhou.aliyuncs.com/boshen-ns/mongodb:3.2.11 mongodb:3.2.11

2、創建三個mongodb的數據目錄:

mkdir -p /home/mongodb-cluster/data/master
mkdir -p /home/mongodb-cluster/data/secondary
mkdir -p /home/mongodb-cluster/data/arbiter

3、編寫docker-compose.yml

version: '2.1'
services:
  master:
    image: mongodb:3.2.11
    container_name: master
    restart: always
    ports:
      - 27017:27017
    volumes:
      - ./data/master:/data/db
    command: mongod --dbpath /data/db --replSet testSet --oplogSize 128
  secondary:
    image: mongodb:3.2.11
    container_name: secondary
    restart: always
    ports:
      - 27018:27017
    volumes:
      - ./data/secondary:/data/db
    command: mongod --dbpath /data/db --replSet testSet --oplogSize 128
  arbiter:
    image: mongodb:3.2.11
    container_name: arbiter
    restart: always
    ports:
      - 27019:27017
    volumes:
      - ./data/arbiter:/data/db
    command: mongod --replSet testSet --smallfiles --oplogSize 128

4、啟動

docker-compse up -d

5、配置副本集

 1)進入容器內部:

docker exec -it master mongo

 2)在mongo shell里面執行:rs.initiate()

 

3)繼續執行:rs.add('172.16.1.11:27018')  表示將secondary添加進副本集

4)繼續執行:rs.add('172.16.1.11:27019',true)   其中true表示這個節點是仲裁節點

5)查看配置 

testSet:PRIMARY> rs.conf()
{
    "_id" : "testSet",
    "version" : 77284,
    "protocolVersion" : NumberLong(1),
    "members" : [
        {
            "_id" : 0,
            "host" : "172.16.1.11:27017",
            "arbiterOnly" : false,
            "buildIndexes" : true,
            "hidden" : false,
            "priority" : 1,
            "tags" : {
                
            },
            "slaveDelay" : NumberLong(0),
            "votes" : 1
        },
        {
            "_id" : 1,
            "host" : "172.16.1.11:27018",
            "arbiterOnly" : false,
            "buildIndexes" : true,
            "hidden" : false,
            "priority" : 1,
            "tags" : {
                
            },
            "slaveDelay" : NumberLong(0),
            "votes" : 1
        },
        {
            "_id" : 2,
            "host" : "172.16.1.11:27019",
            "arbiterOnly" : true,
            "buildIndexes" : true,
            "hidden" : false,
            "priority" : 1,
            "tags" : {
                
            },
            "slaveDelay" : NumberLong(0),
            "votes" : 1
        }
    ],
    "settings" : {
        "chainingAllowed" : true,
        "heartbeatIntervalMillis" : 2000,
        "heartbeatTimeoutSecs" : 10,
        "electionTimeoutMillis" : 10000,
        "getLastErrorModes" : {
            
        },
        "getLastErrorDefaults" : {
            "w" : 1,
            "wtimeout" : 0
        },
        "replicaSetId" : ObjectId("5c6fb85fb21aeac107319862")
    }
}

6)查看狀態

testSet:PRIMARY> rs.status()
{
    "set" : "testSet",
    "date" : ISODate("2019-02-26T02:12:48.124Z"),
    "myState" : 1,
    "term" : NumberLong(2),
    "heartbeatIntervalMillis" : NumberLong(2000),
    "members" : [
        {
            "_id" : 0,
            "name" : "172.16.1.11:27017",
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",
            "uptime" : 268,
            "optime" : {
                "ts" : Timestamp(1551147003, 4),
                "t" : NumberLong(2)
            },
            "optimeDate" : ISODate("2019-02-26T02:10:03Z"),
            "lastHeartbeat" : ISODate("2019-02-26T02:12:46.189Z"),
            "lastHeartbeatRecv" : ISODate("2019-02-26T02:12:46.188Z"),
            "pingMs" : NumberLong(0),
            "syncingTo" : "172.16.1.11:27018",
            "configVersion" : 77284
        },
        {
            "_id" : 1,
            "name" : "172.16.1.11:27018",
            "health" : 1,
            "state" : 1,
            "stateStr" : "PRIMARY",
            "uptime" : 938,
            "optime" : {
                "ts" : Timestamp(1551147003, 4),
                "t" : NumberLong(2)
            },
            "optimeDate" : ISODate("2019-02-26T02:10:03Z"),
            "electionTime" : Timestamp(1551146242, 1),
            "electionDate" : ISODate("2019-02-26T01:57:22Z"),
            "configVersion" : 77284,
            "self" : true
        },
        {
            "_id" : 2,
            "name" : "172.16.1.11:27019",
            "health" : 1,
            "state" : 7,
            "stateStr" : "ARBITER",
            "uptime" : 270,
            "lastHeartbeat" : ISODate("2019-02-26T02:12:46.189Z"),
            "lastHeartbeatRecv" : ISODate("2019-02-26T02:12:48.118Z"),
            "pingMs" : NumberLong(0),
            "configVersion" : 77284
        }
    ],
    "ok" : 1
}

如果想要修改副本集的配置,可以采用以下方法:

conf=rs.conf()
conf.members[0].host="172.16.1.11:27017"
rs.reconfig(conf,{"force":true})

 

三、驗證mongdb可用性:

 由上測試可知:副節點只能讀,不能寫

 

二、windows客戶端連接mongodb

1、登錄mongo shell,創建一個admin用戶

testSet:PRIMARY> db.createUser({user:"admin",pwd:"admin",roles:[{"role":"userAdminAnyDatabase","db":"admin"},{"role":"readWrite","db":"testdb"}]})
Successfully added user: {
    "user" : "admin",
    "roles" : [
        {
            "role" : "userAdminAnyDatabase",
            "db" : "admin"
        },
        {
            "role" : "readWrite",
            "db" : "testdb"
        }
    ]
}

2、安裝 robomongo-1.0.0-windows-x86_64-89f24ea.exe

3、填寫連接信息

 


免責聲明!

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



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