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.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 222,252评论 6 516
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,886评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,814评论 0 361
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,869评论 1 299
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,888评论 6 398
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,475评论 1 312
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 41,010评论 3 422
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,924评论 0 277
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,469评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,552评论 3 342
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,680评论 1 353
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,362评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,037评论 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,519评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,621评论 1 274
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 49,099评论 3 378
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,691评论 2 361

推荐阅读更多精彩内容