mongo的副本集

说明

采用的mongo版版本: v4.4

mongo install

这里选择在debian10系统上,下载.tgz包安装
主要参考文档:https://www.mongodb.com/docs/v4.4/tutorial/install-mongodb-on-debian-tarball/

  1. 安装依赖包
sudo apt-get install libcurl4 openssl liblzma5
  1. 下载tgz包
curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-debian10-4.4.21.tgz
  1. 解压
mkdir /home/mongodb/
tar -xzf mongodb-linux-x86_64-debian10-4.4.21.tgz 
mv mongodb-linux-x86_64-debian10-4.4.21 /home/mongodb/
  1. 启动mongodb测试
mkdir /home/mongodb/data
mkdir /home/mongodb/log
cd /home/mongodb/bin
./mongod --dbpath /home/mongodb/data --logpath /home/mongodb/log/mongod.log

开另外一个终端:

cd /home/mongodb/bin
# ./mongo --host 127.0.0.1 --port 27017
MongoDB shell version v4.4.21
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("80e17a43-dd43-4eb4-b7a0-7bf779a4d521") }
MongoDB server version: 4.4.21
---
..........
---
> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
>

mongo副本集

一个replica set(副本集)就是一组mongod的进程,提供冗余和高可用
replica set的成员,包括

  • Primary
    Primary接收所有的写请求
  • Secondaries
    Secondaries复制Primary的操作,维护一份相同的数据集

replica set推荐的最小配置是3个成员,1个primary,2个secondary,如果不像有2个secondary,可以把其中一个换成arbiter
成员,arbiter参与选举,但不存储数据

replica set最多可以有50个成员,但最多7个投票成员

通过—replSet选项启动replica set

用replica set名称:rs0, 搭建步骤如下

  1. 启动进程
mkdir /home/node1
mkdir /home/node2
mkdir /home/node3

./mongod --bind_ip 127.0.0.1 --port 27021 --dbpath "/home/node1" --replSet rs0 &
./mongod --bind_ip 127.0.0.1 --port 27022 --dbpath "/home/node2" --replSet rs0 &
./mongod --bind_ip 127.0.0.1 --port 27023 --dbpath "/home/node3" --replSet rs0 &
  1. 选择其中一个成员连上去,利用rs.initiate()初始化,这里选择node1:
./mongo --host 127.0.0.1 --port 27021

> rs.initiate()
{
    "info2" : "no configuration specified. Using a default configuration for the set",
    "me" : "127.0.0.1:27021",
    "ok" : 1
}

查看配置

rs0:PRIMARY> rs.conf()
{
    "_id" : "rs0",
    "version" : 1,
    "term" : 1,
    "protocolVersion" : NumberLong(1),
    "writeConcernMajorityJournalDefault" : true,
    "members" : [
        {
            "_id" : 0,
            "host" : "127.0.0.1:27021",
            "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("6470116586009853042dae4d")
    }
}

查看状态

rs0:PRIMARY> rs.status()
{
    "set" : "rs0",
    "date" : ISODate("2023-05-26T01:57:31.535Z"),
    "myState" : 1,
    "term" : NumberLong(1),
    "syncSourceHost" : "",
    "syncSourceId" : -1,
    "heartbeatIntervalMillis" : NumberLong(2000),
    "majorityVoteCount" : 1,
    "writeMajorityCount" : 1,
    "votingMembersCount" : 1,
    "writableVotingMembersCount" : 1,
    "optimes" : {
        "lastCommittedOpTime" : {
            "ts" : Timestamp(1685066245, 1),
            "t" : NumberLong(1)
        },
        "lastCommittedWallTime" : ISODate("2023-05-26T01:57:25.606Z"),
        "readConcernMajorityOpTime" : {
            "ts" : Timestamp(1685066245, 1),
            "t" : NumberLong(1)
        },
        "readConcernMajorityWallTime" : ISODate("2023-05-26T01:57:25.606Z"),
        "appliedOpTime" : {
            "ts" : Timestamp(1685066245, 1),
            "t" : NumberLong(1)
        },
        "durableOpTime" : {
            "ts" : Timestamp(1685066245, 1),
            "t" : NumberLong(1)
        },
        "lastAppliedWallTime" : ISODate("2023-05-26T01:57:25.606Z"),
        "lastDurableWallTime" : ISODate("2023-05-26T01:57:25.606Z")
    },
    "lastStableRecoveryTimestamp" : Timestamp(1685066205, 1),
    "electionCandidateMetrics" : {
        "lastElectionReason" : "electionTimeout",
        "lastElectionDate" : ISODate("2023-05-26T01:54:45.421Z"),
        "electionTerm" : NumberLong(1),
        "lastCommittedOpTimeAtElection" : {
            "ts" : Timestamp(0, 0),
            "t" : NumberLong(-1)
        },
        "lastSeenOpTimeAtElection" : {
            "ts" : Timestamp(1685066085, 1),
            "t" : NumberLong(-1)
        },
        "numVotesNeeded" : 1,
        "priorityAtElection" : 1,
        "electionTimeoutMillis" : NumberLong(10000),
        "newTermStartDate" : ISODate("2023-05-26T01:54:45.509Z"),
        "wMajorityWriteAvailabilityDate" : ISODate("2023-05-26T01:54:45.562Z")
    },
    "members" : [
        {
            "_id" : 0,
            "name" : "127.0.0.1:27021",
            "health" : 1,
            "state" : 1,
            "stateStr" : "PRIMARY",
            "uptime" : 212,
            "optime" : {
                "ts" : Timestamp(1685066245, 1),
                "t" : NumberLong(1)
            },
            "optimeDate" : ISODate("2023-05-26T01:57:25Z"),
            "lastAppliedWallTime" : ISODate("2023-05-26T01:57:25.606Z"),
            "lastDurableWallTime" : ISODate("2023-05-26T01:57:25.606Z"),
            "syncSourceHost" : "",
            "syncSourceId" : -1,
            "infoMessage" : "",
            "electionTime" : Timestamp(1685066085, 2),
            "electionDate" : ISODate("2023-05-26T01:54:45Z"),
            "configVersion" : 1,
            "configTerm" : 1,
            "self" : true,
            "lastHeartbeatMessage" : ""
        }
    ],
    "ok" : 1,
    "$clusterTime" : {
        "clusterTime" : Timestamp(1685066245, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    },
    "operationTime" : Timestamp(1685066245, 1)
}
  1. 把其他成员加入到replica set
    必须连接到副本集primary主节点, 才能使用rs.add()添加剩余的成员
rs0:PRIMARY> rs.add("127.0.0.1:27022")
{
    "ok" : 1,
    "$clusterTime" : {
        "clusterTime" : Timestamp(1685067569, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    },
    "operationTime" : Timestamp(1685067569, 1)
}
rs0:PRIMARY> rs.add("127.0.0.1:27023")
{
    "ok" : 1,
    "$clusterTime" : {
        "clusterTime" : Timestamp(1685067609, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    },
    "operationTime" : Timestamp(1685067609, 1)
}

使用rs.status()查看副本集状态

删除replica set成员

rs0:PRIMARY> rs.remove("127.0.0.1:27022")
{
    "ok" : 1,
    "$clusterTime" : {
        "clusterTime" : Timestamp(1685068022, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    },
    "operationTime" : Timestamp(1685068022, 1)
}

更多说明: https://www.mongodb.com/docs/v4.4/tutorial/remove-replica-set-member/

replica set成员状态

副本集的每个成员都有一个反映它在集合中的配置的状态。

Number Name State Description
0 STARTUP 还没有任何一个的活跃成员。所有成员在这个状态下都开始。副本集的符号解析配置文件在启动。
1 PRIMARY 主节点,唯一可以接受写操作的成员
2 SECONDARY 备份节点,复制数据存储的成员
3 RECOVERING 成员要么执行启动自我检查,或过渡完成回滚或重新同步。
5 STARTUP2 该成员已加入该组,并运行一个初始同步。
6 UNKNOWN 成员的状态,是从其他集合的成员看,目前还不知道。
7 ARBITER 仲裁者不复制数据,只是为了参加选举。
8 DOWN 节点不可到达
9 ROLLBACK 该成员正在积极执行回滚。数据不可用于读取。
10 REMOVED 该成员曾经在一个副本集,但随后被删除。

在secondary中查看数据

rs0:SECONDARY> show dbs
uncaught exception: Error: listDatabases failed:{
    "topologyVersion" : {
        "processId" : ObjectId("6470172bd14082df2397456a"),
        "counter" : NumberLong(7)
    },
    "operationTime" : Timestamp(1685068786, 1),
    "ok" : 0,
    "errmsg" : "not master and slaveOk=false",
    "code" : 13435,
    "codeName" : "NotPrimaryNoSecondaryOk",
    "$clusterTime" : {
        "clusterTime" : Timestamp(1685068786, 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:147:19
Mongo.prototype.getDBs@src/mongo/shell/mongo.js:99:12
shellHelper.show@src/mongo/shell/utils.js:937:13
shellHelper@src/mongo/shell/utils.js:819:15
@(shellhelp2):1:1

rs0:SECONDARY> rs.secondaryOk()
rs0:SECONDARY> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB

rs.secondaryOk的作用: Allows read operations on secondary members for the MongoDB connection.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容