4. 复制集
1. 基本原理¶
#基本构成是1主2从结构,自带互相监控投票机制(Raft)
#如果发生主库宕机,复制集内部会进行投票选举,选择一个新的主库替代原有主库对外提供服务。
#同时复制集会自动通知客户端程序,主库已经发生转换了,应用就会连接到新的主库。
2. 规划¶
#3个以上mongodb节点(或多实例)
#采用多实例
192.168.178.151的多个端口:28017、28018、28019、28020
3. 创建多套目录¶
#注意:最后要更改属主属组!!!可以直接登录mongod用户创建
su - mongod
mkdir -p /mongodb/28017/conf /mongodb/28017/data /mongodb/28017/log
mkdir -p /mongodb/28018/conf /mongodb/28018/data /mongodb/28018/log
mkdir -p /mongodb/28019/conf /mongodb/28019/data /mongodb/28019/log
mkdir -p /mongodb/28020/conf /mongodb/28020/data /mongodb/28020/log
4. 创建多套配置文件¶
#此yaml文件启动时经常报错!!!查找原因啊
[mongod@151 ~]$ mongod -f /mongodb/28017/conf/mongo.conf
Error parsing YAML config file: yaml-cpp: error at line 5, column 8: illegal map value
try 'mongod --help' for more information
#发现错误,如下
systemLog:
destination: file
path: /mongodb/28017/log/mongodb.log
logAppend:true #此行的:后面少了个空格!!!!
#再次启动测试,依旧报错。。。
[mongod@151 ~]$ mongod -f /mongodb/28017/conf/mongo.conf
Unrecognized option: storage.wiredTiger.collectionConfig.blockcompressor
#是不是存储引擎是单独的?不是storage后的内容?
wiredTiger:
engineConfig:
cacheSizeGB: 1
directoryForIndexes: true
collectionConfig:
blockcompressor: zlib #原来抄错了,C为大写:blockCompressor
#修改后再次测试
[mongod@151 ~]$ vim /mongodb/28017/conf/mongo.conf
[mongod@151 ~]$
[mongod@151 ~]$ mongod -f /mongodb/28017/conf/mongo.conf
about to fork child process, waiting until server is ready for connections.
forked process: 45004
child process started successfully, parent exiting
[mongod@151 ~]$
[mongod@151 ~]$ netstat -lnp|grep 28017
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
tcp 0 0 0.0.0.0:28017 0.0.0.0:* LISTEN 45004/mongod
unix 2 [ ACC ] STREAM LISTENING 240096 45004/mongod /tmp/mongodb-28017.sock
[mongod@151 ~]$
#启动成功!!!
#注意:最后要更改属主属组!!!可以直接登录mongod用户创建
vim /mongodb/28017/conf/mongo.conf
#yaml格式文件,注意只能使用空格,不可以使用tab
systemLog:
destination: file
path: /mongodb/28017/log/mongodb.log
logAppend: true
storage:
journal:
enabled: true
dbPath: /mongodb/28017/data
directoryPerDB: true
#engine: wiredTiger
wiredTiger:
engineConfig:
cacheSizeGB: 1
directoryForIndexes: true
collectionConfig:
blockCompressor: zlib
indexConfig:
prefixCompression: true
processManagement:
fork: true
net:
port: 28017
replication:
oplogSizeMB: 2048
replSetName: my_repl
cp /mongodb/28017/conf/mongo.conf /mongodb/28018/conf/
cp /mongodb/28017/conf/mongo.conf /mongodb/28019/conf/
cp /mongodb/28017/conf/mongo.conf /mongodb/28020/conf/
sed 's#28017#28018#g' /mongodb/28018/conf/mongo.conf -i
sed 's#28017#28019#g' /mongodb/28019/conf/mongo.conf -i
sed 's#28017#28020#g' /mongodb/28020/conf/mongo.conf -i
[root@151 ~]# ls /mongodb/
bin conf data log
[root@151 ~]#
[root@151 ~]# mkdir -p /mongodb/28017/conf /mongodb/28017/data /mongodb/28017/log
[root@151 ~]# mkdir -p /mongodb/28018/conf /mongodb/28018/data /mongodb/28018/log
[root@151 ~]# mkdir -p /mongodb/28019/conf /mongodb/28019/data /mongodb/28019/log
[root@151 ~]# mkdir -p /mongodb/28020/conf /mongodb/28020/data /mongodb/28020/log
[root@151 ~]#
[root@151 ~]# ls /mongodb/
28017 28018 28019 28020 bin conf data log
[root@151 ~]#
[root@151 ~]# vim /mongodb/28017/conf/mongo.conf
[root@151 ~]#
[root@151 ~]# cp /mongodb/28017/conf/mongo.conf /mongodb/28018/conf/
[root@151 ~]# cp /mongodb/28017/conf/mongo.conf /mongodb/28019/conf/
[root@151 ~]# cp /mongodb/28017/conf/mongo.conf /mongodb/28020/conf/
[root@151 ~]#
[root@151 ~]# sed 's#28017#28018#g' /mongodb/28018/conf/mongo.conf -i
[root@151 ~]# sed 's#28017#28019#g' /mongodb/28019/conf/mongo.conf -i
[root@151 ~]# sed 's#28017#28020#g' /mongodb/28020/conf/mongo.conf -i
[root@151 ~]#
[root@151 ~]# cat /mongodb/28018/conf/mongo.conf
systemLog:
destination: file
path: /mongodb/28018/log/mongodb.log
logAppend:true
storage:
journal:
enabled: true
dbPath: /mongodb/28018/data
directoryPerDB: true
#engine: wiredTiger
wiredTiger:
engineConfig:
cacheSizeGB: 1
directoryForIndexes: true
collectionConfig:
blockcompressor: zlib
indexConfig:
prefixCompression: true
processManagement:
fork: true
net:
port: 28018
replication:
oplogSizeMB: 2048
replSetName: my_repl
#由于yaml文件经常报错,统一整理到一起
#注意:1.冒号后要带空格! 2.大小写敏感!!! 3.只能使用空格缩进
#28017
vim /mongodb/28017/conf/mongo.conf
systemLog:
destination: file
path: /mongodb/28017/log/mongodb.log
logAppend: true
storage:
journal:
enabled: true
dbPath: /mongodb/28017/data
directoryPerDB: true
#engine: wiredTiger
wiredTiger:
engineConfig:
cacheSizeGB: 1
directoryForIndexes: true
collectionConfig:
blockCompressor: zlib
indexConfig:
prefixCompression: true
processManagement:
fork: true
net:
port: 28017
replication:
oplogSizeMB: 2048
replSetName: my_repl
#28018
vim /mongodb/28017/conf/mongo.conf
systemLog:
destination: file
path: /mongodb/28017/log/mongodb.log
logAppend: true
storage:
journal:
enabled: true
dbPath: /mongodb/28017/data
directoryPerDB: true
#engine: wiredTiger
wiredTiger:
engineConfig:
cacheSizeGB: 1
directoryForIndexes: true
collectionConfig:
blockCompressor: zlib
indexConfig:
prefixCompression: true
processManagement:
fork: true
net:
port: 28018
replication:
oplogSizeMB: 2048
replSetName: my_repl
#28019
vim /mongodb/28017/conf/mongo.conf
systemLog:
destination: file
path: /mongodb/28017/log/mongodb.log
logAppend: true
storage:
journal:
enabled: true
dbPath: /mongodb/28017/data
directoryPerDB: true
#engine: wiredTiger
wiredTiger:
engineConfig:
cacheSizeGB: 1
directoryForIndexes: true
collectionConfig:
blockCompressor: zlib
indexConfig:
prefixCompression: true
processManagement:
fork: true
net:
port: 28019
replication:
oplogSizeMB: 2048
replSetName: my_repl
#28020
vim /mongodb/28017/conf/mongo.conf
systemLog:
destination: file
path: /mongodb/28017/log/mongodb.log
logAppend: true
storage:
journal:
enabled: true
dbPath: /mongodb/28017/data
directoryPerDB: true
#engine: wiredTiger
wiredTiger:
engineConfig:
cacheSizeGB: 1
directoryForIndexes: true
collectionConfig:
blockCompressor: zlib
indexConfig:
prefixCompression: true
processManagement:
fork: true
net:
port: 28020
replication:
oplogSizeMB: 2048
replSetName: my_repl
5. 启动多实例备用¶
mongod -f /mongodb/28017/conf/mongo.conf
mongod -f /mongodb/28018/conf/mongo.conf
mongod -f /mongodb/28019/conf/mongo.conf
mongod -f /mongodb/28020/conf/mongo.conf
netstat -tunlp|grep 280
#老师的命令
netstat -nlp|grep 280
[root@151 ~]# su - mongod
Last login: Wed May 12 13:12:48 CST 2021 on pts/1
[mongod@151 ~]$ mongod -f /mongodb/28017/conf/mongo.conf
Error parsing YAML config file: yaml-cpp: error at line 5, column 8: illegal map value
try 'mongod --help' for more information
[mongod@151 ~]$ mongod -f /mongodb/28018/conf/mongo.conf
Error parsing YAML config file: yaml-cpp: error at line 5, column 8: illegal map value
try 'mongod --help' for more information
[mongod@151 ~]$ mongod -f /mongodb/28019/conf/mongo.conf
Error parsing YAML config file: yaml-cpp: error at line 5, column 8: illegal map value
try 'mongod --help' for more information
[mongod@151 ~]$ mongod -f /mongodb/28020/conf/mongo.conf
Error parsing YAML config file: yaml-cpp: error at line 5, column 8: illegal map value
try 'mongod --help' for more information
[mongod@151 ~]$
#貌似是没有权限,先赋予权限,再测试
[mongod@151 ~]$ exit
logout
[root@151 ~]# chown -R mongod:mongod /mongodb/
[root@151 ~]# ll /mongodb/
total 4
drwxr-xr-x 5 mongod mongod 41 May 12 16:42 28017
drwxr-xr-x 5 mongod mongod 41 May 12 16:42 28018
drwxr-xr-x 5 mongod mongod 41 May 12 16:42 28019
drwxr-xr-x 5 mongod mongod 41 May 12 16:42 28020
drwxr-xr-x 2 mongod mongod 242 May 12 10:39 bin
drwxr-xr-x 2 mongod mongod 24 May 12 13:12 conf
drwxr-xr-x 4 mongod mongod 4096 May 12 12:12 data
drwxr-xr-x 2 mongod mongod 25 May 12 10:46 log
[root@151 ~]# su - mongod
Last login: Wed May 12 16:45:05 CST 2021 on pts/1
#依旧报错,是配置文件的问题?
[mongod@151 ~]$ mongod -f /mongodb/28017/conf/mongo.conf
Error parsing YAML config file: yaml-cpp: error at line 5, column 8: illegal map value
try 'mongod --help' for more information
[mongod@151 ~]$ mongod -f /mongodb/28018/conf/mongo.conf
Error parsing YAML config file: yaml-cpp: error at line 5, column 8: illegal map value
try 'mongod --help' for more information
[mongod@151 ~]$ mongod -f /mongodb/28019/conf/mongo.conf
Error parsing YAML config file: yaml-cpp: error at line 5, column 8: illegal map value
try 'mongod --help' for more information
[mongod@151 ~]$ mongod -f /mongodb/28020/conf/mongo.conf
Error parsing YAML config file: yaml-cpp: error at line 5, column 8: illegal map value
try 'mongod --help' for more information
#查看配置文件,(先把用户管理弄完)发现最后几行空格有问题!!!重新修改配置文件,再次测试,依旧失败。。。
#已修改完配置文件,注意问题如上一节,再次启动
[mongod@151 ~]$ vim /mongodb/28018/conf/mongo.conf
[mongod@151 ~]$
[mongod@151 ~]$ vim /mongodb/28019/conf/mongo.conf
[mongod@151 ~]$
[mongod@151 ~]$ vim /mongodb/28020/conf/mongo.conf
[mongod@151 ~]$
[mongod@151 ~]$ mongod -f /mongodb/28018/conf/mongo.conf
about to fork child process, waiting until server is ready for connections.
forked process: 46652
child process started successfully, parent exiting
[mongod@151 ~]$ mongod -f /mongodb/28019/conf/mongo.conf
about to fork child process, waiting until server is ready for connections.
forked process: 46714
child process started successfully, parent exiting
[mongod@151 ~]$ mongod -f /mongodb/28020/conf/mongo.conf
about to fork child process, waiting until server is ready for connections.
forked process: 46770
child process started successfully, parent exiting
[mongod@151 ~]$
[mongod@151 ~]$ netstat -lnp|grep 280
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
tcp 0 0 0.0.0.0:28017 0.0.0.0:* LISTEN 45004/mongod
tcp 0 0 0.0.0.0:28018 0.0.0.0:* LISTEN 46652/mongod
tcp 0 0 0.0.0.0:28019 0.0.0.0:* LISTEN 46714/mongod
tcp 0 0 0.0.0.0:28020 0.0.0.0:* LISTEN 46770/mongod
unix 2 [ ACC ] STREAM LISTENING 240096 45004/mongod /tmp/mongodb-28017.sock
unix 2 [ ACC ] STREAM LISTENING 242350 46770/mongod /tmp/mongodb-28020.sock
unix 2 [ ACC ] STREAM LISTENING 242243 46652/mongod /tmp/mongodb-28018.sock
unix 2 [ ACC ] STREAM LISTENING 242299 46714/mongod /tmp/mongodb-28019.sock
6. 配置1主2从复制集¶
#规划
28017:主
28018:从1
28019:从2
28020:备用
#1. 登录28017
mongo --port 28017 admin
#2. 编写配置信息
config={ _id: 'my_repl',members:[
{_id: 0, host: '192.168.178.151:28017'},
{_id: 1, host: '192.168.178.151:28018'},
{_id: 2, host: '192.168.178.151:28019'}
]
}
#3.初始化
rs.initiate(config)
#4.分别登录查看
mongo --port 28017 admin
mongo --port 28018 admin
mongo --port 28019 admin
#5.临时打开从库可读
show dbs;
rs.slaveOk()
show databases;
#6.查看复制集状态信息(测试发现,每个节点都可以查看!!!)
rs.status();
#1.不带验证库登录
[mongod@151 ~]$ mongo --port 28017
MongoDB shell version: 3.2.22
connecting to: 127.0.0.1:28017/test
#发现没有权限
> show dbs
2021-05-12T18:07:05.770+0800 E QUERY [thread1] Error: listDatabases failed:{ "ok" : 0, "errmsg" : "not master and slaveOk=false", "code" : 13435 } :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
Mongo.prototype.getDBs@src/mongo/shell/mongo.js:62:1
shellHelper.show@src/mongo/shell/utils.js:781:19
shellHelper@src/mongo/shell/utils.js:671:15
@(shellhelp2):1:1
> exit
bye
#2.带验证库登录
[mongod@151 ~]$ mongo --port 28017 admin
MongoDB shell version: 3.2.22
connecting to: 127.0.0.1:28017/admin
#发现依旧没有权限。
> show dbs
2021-05-12T18:07:15.588+0800 E QUERY [thread1] Error: listDatabases failed:{ "ok" : 0, "errmsg" : "not master and slaveOk=false", "code" : 13435 } :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
Mongo.prototype.getDBs@src/mongo/shell/mongo.js:62:1
shellHelper.show@src/mongo/shell/utils.js:781:19
shellHelper@src/mongo/shell/utils.js:671:15
@(shellhelp2):1:1
#3.写入复制集配置
> config={ _id: 'my_repl',members:[
... {_id: 0, host: '192.168.178.151:28017'},
... {_id: 1, host: '192.168.178.151:28018'},
... {_id: 2, host: '192.168.178.151:28019'}
... ]
... }
{
"_id" : "my_repl",
"members" : [
{
"_id" : 0,
"host" : "192.168.178.151:28017"
},
{
"_id" : 1,
"host" : "192.168.178.151:28018"
},
{
"_id" : 2,
"host" : "192.168.178.151:28019"
}
]
}
#4.初始化配置
> rs.initiate(config)
{ "ok" : 1 }
my_repl:OTHER>
my_repl:SECONDARY>
my_repl:SECONDARY>
my_repl:PRIMARY>
my_repl:PRIMARY>
my_repl:PRIMARY>
my_repl:PRIMARY>
my_repl:PRIMARY> exit
bye
#5.登录主库测试
[mongod@151 ~]$ mongo --port 28017 admin
MongoDB shell version: 3.2.22
connecting to: 127.0.0.1:28017/admin
my_repl:PRIMARY>
my_repl:PRIMARY> exit
bye
#6.登录从库测试
[mongod@151 ~]$ mongo --port 28018 admin
MongoDB shell version: 3.2.22
connecting to: 127.0.0.1:28018/admin
my_repl:SECONDARY>
my_repl:SECONDARY> exit
bye
[mongod@151 ~]$
[mongod@151 ~]$ mongo --port 28019 admin
MongoDB shell version: 3.2.22
connecting to: 127.0.0.1:28019/admin
my_repl:SECONDARY>
my_repl:SECONDARY> exit
bye
#7.临时开启从库可读
[mongod@151 ~]$ mongo --port 28018 admin
MongoDB shell version: 3.2.22
connecting to: 127.0.0.1:28018/admin
my_repl:SECONDARY>
#未开启前
my_repl:SECONDARY> show dbs
2021-05-12T18:11:20.634+0800 E QUERY [thread1] Error: listDatabases failed:{ "ok" : 0, "errmsg" : "not master and slaveOk=false", "code" : 13435 } :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
Mongo.prototype.getDBs@src/mongo/shell/mongo.js:62:1
shellHelper.show@src/mongo/shell/utils.js:781:19
shellHelper@src/mongo/shell/utils.js:671:15
@(shellhelp2):1:1
#开启后
my_repl:SECONDARY> rs.slaveOk()
my_repl:SECONDARY> show dbs
local 0.000GB
my_repl:SECONDARY> exit
bye
#重新登录失效
[mongod@151 ~]$ mongo --port 28018 admin
MongoDB shell version: 3.2.22
connecting to: 127.0.0.1:28018/admin
my_repl:SECONDARY> show dbs
2021-05-12T18:11:40.933+0800 E QUERY [thread1] Error: listDatabases failed:{ "ok" : 0, "errmsg" : "not master and slaveOk=false", "code" : 13435 } :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
Mongo.prototype.getDBs@src/mongo/shell/mongo.js:62:1
shellHelper.show@src/mongo/shell/utils.js:781:19
shellHelper@src/mongo/shell/utils.js:671:15
@(shellhelp2):1:1
my_repl:SECONDARY> exit
bye
#8.查看复制集状态
[mongod@151 ~]$ mongo --port 28018 admin
MongoDB shell version: 3.2.22
connecting to: 127.0.0.1:28018/admin
my_repl:SECONDARY> rs.status()
{
"set" : "my_repl",
"date" : ISODate("2021-05-12T10:11:55.945Z"),
"myState" : 2,
"term" : NumberLong(1),
"syncingTo" : "192.168.178.151:28017",
"heartbeatIntervalMillis" : NumberLong(2000),
"members" : [
{
"_id" : 0,
"name" : "192.168.178.151:28017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 240,
"optime" : {
"ts" : Timestamp(1620814084, 2),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2021-05-12T10:08:04Z"),
"lastHeartbeat" : ISODate("2021-05-12T10:11:54.363Z"),
"lastHeartbeatRecv" : ISODate("2021-05-12T10:11:55.356Z"),
"pingMs" : NumberLong(0),
"electionTime" : Timestamp(1620814084, 1),
"electionDate" : ISODate("2021-05-12T10:08:04Z"),
"configVersion" : 1
},
{
"_id" : 1,
"name" : "192.168.178.151:28018",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 474,
"optime" : {
"ts" : Timestamp(1620814084, 2),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2021-05-12T10:08:04Z"),
"syncingTo" : "192.168.178.151:28017",
"configVersion" : 1,
"self" : true
},
{
"_id" : 2,
"name" : "192.168.178.151:28019",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 240,
"optime" : {
"ts" : Timestamp(1620814084, 2),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2021-05-12T10:08:04Z"),
"lastHeartbeat" : ISODate("2021-05-12T10:11:54.368Z"),
"lastHeartbeatRecv" : ISODate("2021-05-12T10:11:54.367Z"),
"pingMs" : NumberLong(1),
"syncingTo" : "192.168.178.151:28017",
"configVersion" : 1
}
],
"ok" : 1
}
my_repl:SECONDARY> exit
bye
#9.登录主库写入数据测试
[mongod@151 ~]$ mongo --port 28017 admin
MongoDB shell version: 3.2.22
connecting to: 127.0.0.1:28017/admin
my_repl:PRIMARY>
my_repl:PRIMARY> show dbs
local 0.000GB
my_repl:PRIMARY> show tables
my_repl:PRIMARY> use test
switched to db test
my_repl:PRIMARY> show tables
my_repl:PRIMARY> db.t1.insert({id:1})
WriteResult({ "nInserted" : 1 })
my_repl:PRIMARY> db.t1.find()
{ "_id" : ObjectId("609baa9885a099fa7702cfbe"), "id" : 1 }
my_repl:PRIMARY> exit
bye
#10.登录从库查看数据
[mongod@151 ~]$ mongo --port 28019 admin
MongoDB shell version: 3.2.22
connecting to: 127.0.0.1:28019/admin
my_repl:SECONDARY> rs.slaveOk()
my_repl:SECONDARY> use test
switched to db test
my_repl:SECONDARY> show tables
t1
my_repl:SECONDARY> db.t1.find()
{ "_id" : ObjectId("609baa9885a099fa7702cfbe"), "id" : 1 }
my_repl:SECONDARY> exit
bye
7. 添加删除节点¶
#经测试,只能在主节点上添加删除从节点!!!
mongo --port 28017 admin
#1.添加节点
rs.add("ip:port")
#2.查看
rs.isMaster()
#3.删除节点
rs.remove("ip:port")
#4.查看
rs.isMaster()
#1.从库2查看是否是主机点
[mongod@151 ~]$ mongo --port 28019 admin
MongoDB shell version: 3.2.22
connecting to: 127.0.0.1:28019/admin
my_repl:SECONDARY> rs.isMaster()
{
"hosts" : [
"192.168.178.151:28017",
"192.168.178.151:28018",
"192.168.178.151:28019"
],
"setName" : "my_repl",
"setVersion" : 1,
"ismaster" : false,
"secondary" : true,
"primary" : "192.168.178.151:28017",
"me" : "192.168.178.151:28019",
"maxBsonObjectSize" : 16777216,
"maxMessageSizeBytes" : 48000000,
"maxWriteBatchSize" : 1000,
"localTime" : ISODate("2021-05-12T10:17:37.486Z"),
"maxWireVersion" : 4,
"minWireVersion" : 0,
"ok" : 1
}
my_repl:SECONDARY> exit
bye
#2.主库查看是否是主节点
[mongod@151 ~]$ mongo --port 28017 admin
MongoDB shell version: 3.2.22
connecting to: 127.0.0.1:28017/admin
my_repl:PRIMARY> rs.isMaster()
{
"hosts" : [
"192.168.178.151:28017",
"192.168.178.151:28018",
"192.168.178.151:28019"
],
"setName" : "my_repl",
"setVersion" : 1,
"ismaster" : true,
"secondary" : false,
"primary" : "192.168.178.151:28017",
"me" : "192.168.178.151:28017",
"electionId" : ObjectId("7fffffff0000000000000001"),
"maxBsonObjectSize" : 16777216,
"maxMessageSizeBytes" : 48000000,
"maxWriteBatchSize" : 1000,
"localTime" : ISODate("2021-05-12T10:17:55.999Z"),
"maxWireVersion" : 4,
"minWireVersion" : 0,
"ok" : 1
}
my_repl:PRIMARY> exit
bye
#3.从库登录,添加节点测试-----添加失败!!!
[mongod@151 ~]$ mongo --port 28018 admin
MongoDB shell version: 3.2.22
connecting to: 127.0.0.1:28018/admin
my_repl:SECONDARY> rs.add("192.168.178.151:28020")
{
"ok" : 0,
"errmsg" : "replSetReconfig should only be run on PRIMARY, but my state is SECONDARY; use the \"force\" argument to override",
"code" : 10107
}
my_repl:SECONDARY> rs.isMaster()
{
"hosts" : [
"192.168.178.151:28017",
"192.168.178.151:28018",
"192.168.178.151:28019"
],
"setName" : "my_repl",
"setVersion" : 1,
"ismaster" : false,
"secondary" : true,
"primary" : "192.168.178.151:28017",
"me" : "192.168.178.151:28018",
"maxBsonObjectSize" : 16777216,
"maxMessageSizeBytes" : 48000000,
"maxWriteBatchSize" : 1000,
"localTime" : ISODate("2021-05-12T10:18:32.159Z"),
"maxWireVersion" : 4,
"minWireVersion" : 0,
"ok" : 1
}
my_repl:SECONDARY> rs.status()
{
"set" : "my_repl",
"date" : ISODate("2021-05-12T10:18:45.764Z"),
"myState" : 2,
"term" : NumberLong(1),
"syncingTo" : "192.168.178.151:28017",
"heartbeatIntervalMillis" : NumberLong(2000),
"members" : [
{
"_id" : 0,
"name" : "192.168.178.151:28017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 649,
"optime" : {
"ts" : Timestamp(1620814488, 2),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2021-05-12T10:14:48Z"),
"lastHeartbeat" : ISODate("2021-05-12T10:18:45.079Z"),
"lastHeartbeatRecv" : ISODate("2021-05-12T10:18:44.150Z"),
"pingMs" : NumberLong(0),
"electionTime" : Timestamp(1620814084, 1),
"electionDate" : ISODate("2021-05-12T10:08:04Z"),
"configVersion" : 1
},
{
"_id" : 1,
"name" : "192.168.178.151:28018",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 884,
"optime" : {
"ts" : Timestamp(1620814488, 2),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2021-05-12T10:14:48Z"),
"syncingTo" : "192.168.178.151:28017",
"configVersion" : 1,
"self" : true
},
{
"_id" : 2,
"name" : "192.168.178.151:28019",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 649,
"optime" : {
"ts" : Timestamp(1620814488, 2),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2021-05-12T10:14:48Z"),
"lastHeartbeat" : ISODate("2021-05-12T10:18:45.107Z"),
"lastHeartbeatRecv" : ISODate("2021-05-12T10:18:45.107Z"),
"pingMs" : NumberLong(0),
"syncingTo" : "192.168.178.151:28017",
"configVersion" : 1
}
],
"ok" : 1
}
my_repl:SECONDARY>
my_repl:SECONDARY>
my_repl:SECONDARY> exit
bye
#4.主库登录,添加节点测试-----添加成功!!!
[mongod@151 ~]$ mongo --port 28017 admin
MongoDB shell version: 3.2.22
connecting to: 127.0.0.1:28017/admin
my_repl:PRIMARY>
my_repl:PRIMARY> rs.isMaster()
{
"hosts" : [
"192.168.178.151:28017",
"192.168.178.151:28018",
"192.168.178.151:28019"
],
"setName" : "my_repl",
"setVersion" : 1,
"ismaster" : true,
"secondary" : false,
"primary" : "192.168.178.151:28017",
"me" : "192.168.178.151:28017",
"electionId" : ObjectId("7fffffff0000000000000001"),
"maxBsonObjectSize" : 16777216,
"maxMessageSizeBytes" : 48000000,
"maxWriteBatchSize" : 1000,
"localTime" : ISODate("2021-05-12T10:19:14.639Z"),
"maxWireVersion" : 4,
"minWireVersion" : 0,
"ok" : 1
}
my_repl:PRIMARY> rs.status()
{
"set" : "my_repl",
"date" : ISODate("2021-05-12T10:19:17.894Z"),
"myState" : 1,
"term" : NumberLong(1),
"heartbeatIntervalMillis" : NumberLong(2000),
"members" : [
{
"_id" : 0,
"name" : "192.168.178.151:28017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 1187,
"optime" : {
"ts" : Timestamp(1620814488, 2),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2021-05-12T10:14:48Z"),
"electionTime" : Timestamp(1620814084, 1),
"electionDate" : ISODate("2021-05-12T10:08:04Z"),
"configVersion" : 1,
"self" : true
},
{
"_id" : 1,
"name" : "192.168.178.151:28018",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 684,
"optime" : {
"ts" : Timestamp(1620814488, 2),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2021-05-12T10:14:48Z"),
"lastHeartbeat" : ISODate("2021-05-12T10:19:16.195Z"),
"lastHeartbeatRecv" : ISODate("2021-05-12T10:19:17.111Z"),
"pingMs" : NumberLong(0),
"syncingTo" : "192.168.178.151:28017",
"configVersion" : 1
},
{
"_id" : 2,
"name" : "192.168.178.151:28019",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 684,
"optime" : {
"ts" : Timestamp(1620814488, 2),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2021-05-12T10:14:48Z"),
"lastHeartbeat" : ISODate("2021-05-12T10:19:16.195Z"),
"lastHeartbeatRecv" : ISODate("2021-05-12T10:19:17.057Z"),
"pingMs" : NumberLong(0),
"syncingTo" : "192.168.178.151:28017",
"configVersion" : 1
}
],
"ok" : 1
}
my_repl:PRIMARY>
my_repl:PRIMARY>
my_repl:PRIMARY>
my_repl:PRIMARY> rs.add("192.168.178.151:28020")
{ "ok" : 1 }
my_repl:PRIMARY> rs.isMaster()
{
"hosts" : [
"192.168.178.151:28017",
"192.168.178.151:28018",
"192.168.178.151:28019",
"192.168.178.151:28020"
],
"setName" : "my_repl",
"setVersion" : 2,
"ismaster" : true,
"secondary" : false,
"primary" : "192.168.178.151:28017",
"me" : "192.168.178.151:28017",
"electionId" : ObjectId("7fffffff0000000000000001"),
"maxBsonObjectSize" : 16777216,
"maxMessageSizeBytes" : 48000000,
"maxWriteBatchSize" : 1000,
"localTime" : ISODate("2021-05-12T10:19:31.773Z"),
"maxWireVersion" : 4,
"minWireVersion" : 0,
"ok" : 1
}
my_repl:PRIMARY> rs.status()
{
"set" : "my_repl",
"date" : ISODate("2021-05-12T10:19:35.774Z"),
"myState" : 1,
"term" : NumberLong(1),
"heartbeatIntervalMillis" : NumberLong(2000),
"members" : [
{
"_id" : 0,
"name" : "192.168.178.151:28017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 1205,
"optime" : {
"ts" : Timestamp(1620814768, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2021-05-12T10:19:28Z"),
"electionTime" : Timestamp(1620814084, 1),
"electionDate" : ISODate("2021-05-12T10:08:04Z"),
"configVersion" : 2,
"self" : true
},
{
"_id" : 1,
"name" : "192.168.178.151:28018",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 701,
"optime" : {
"ts" : Timestamp(1620814768, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2021-05-12T10:19:28Z"),
"lastHeartbeat" : ISODate("2021-05-12T10:19:34.602Z"),
"lastHeartbeatRecv" : ISODate("2021-05-12T10:19:34.634Z"),
"pingMs" : NumberLong(0),
"syncingTo" : "192.168.178.151:28017",
"configVersion" : 2
},
{
"_id" : 2,
"name" : "192.168.178.151:28019",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 701,
"optime" : {
"ts" : Timestamp(1620814768, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2021-05-12T10:19:28Z"),
"lastHeartbeat" : ISODate("2021-05-12T10:19:34.602Z"),
"lastHeartbeatRecv" : ISODate("2021-05-12T10:19:34.634Z"),
"pingMs" : NumberLong(0),
"syncingTo" : "192.168.178.151:28017",
"configVersion" : 2
},
{
"_id" : 3,
"name" : "192.168.178.151:28020",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 7,
"optime" : {
"ts" : Timestamp(1620814768, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2021-05-12T10:19:28Z"),
"lastHeartbeat" : ISODate("2021-05-12T10:19:34.603Z"),
"lastHeartbeatRecv" : ISODate("2021-05-12T10:19:34.647Z"),
"pingMs" : NumberLong(1),
"configVersion" : 2
}
],
"ok" : 1
}
my_repl:PRIMARY> exit
bye
#5.从库删除节点测试------删除失败!
[mongod@151 ~]$ mongo --port 28019 admin
MongoDB shell version: 3.2.22
connecting to: 127.0.0.1:28019/admin
my_repl:SECONDARY>
my_repl:SECONDARY> rs.isMaster()
{
"hosts" : [
"192.168.178.151:28017",
"192.168.178.151:28018",
"192.168.178.151:28019",
"192.168.178.151:28020"
],
"setName" : "my_repl",
"setVersion" : 2,
"ismaster" : false,
"secondary" : true,
"primary" : "192.168.178.151:28017",
"me" : "192.168.178.151:28019",
"maxBsonObjectSize" : 16777216,
"maxMessageSizeBytes" : 48000000,
"maxWriteBatchSize" : 1000,
"localTime" : ISODate("2021-05-12T10:23:44.270Z"),
"maxWireVersion" : 4,
"minWireVersion" : 0,
"ok" : 1
}
my_repl:SECONDARY>
my_repl:SECONDARY> rs.remove("192.168.178.151:28020")
{
"ok" : 0,
"errmsg" : "replSetReconfig should only be run on PRIMARY, but my state is SECONDARY; use the \"force\" argument to override",
"code" : 10107
}
my_repl:SECONDARY>
my_repl:SECONDARY> rs.isMaster()
{
"hosts" : [
"192.168.178.151:28017",
"192.168.178.151:28018",
"192.168.178.151:28019",
"192.168.178.151:28020"
],
"setName" : "my_repl",
"setVersion" : 2,
"ismaster" : false,
"secondary" : true,
"primary" : "192.168.178.151:28017",
"me" : "192.168.178.151:28019",
"maxBsonObjectSize" : 16777216,
"maxMessageSizeBytes" : 48000000,
"maxWriteBatchSize" : 1000,
"localTime" : ISODate("2021-05-12T10:24:07.727Z"),
"maxWireVersion" : 4,
"minWireVersion" : 0,
"ok" : 1
}
my_repl:SECONDARY>
my_repl:SECONDARY> exit
bye
#6.主库删除节点测试------删除成功!
[mongod@151 ~]$ mongo --port 28017 admin
MongoDB shell version: 3.2.22
connecting to: 127.0.0.1:28017/admin
my_repl:PRIMARY>
my_repl:PRIMARY> rs.remove("192.168.178.151:28020")
{ "ok" : 1 }
my_repl:PRIMARY> rs.isMaster()
{
"hosts" : [
"192.168.178.151:28017",
"192.168.178.151:28018",
"192.168.178.151:28019"
],
"setName" : "my_repl",
"setVersion" : 3,
"ismaster" : true,
"secondary" : false,
"primary" : "192.168.178.151:28017",
"me" : "192.168.178.151:28017",
"electionId" : ObjectId("7fffffff0000000000000001"),
"maxBsonObjectSize" : 16777216,
"maxMessageSizeBytes" : 48000000,
"maxWriteBatchSize" : 1000,
"localTime" : ISODate("2021-05-12T10:24:19.579Z"),
"maxWireVersion" : 4,
"minWireVersion" : 0,
"ok" : 1
}
my_repl:PRIMARY>
my_repl:PRIMARY> exit
bye
8. 1主2从转变为1主1从1仲裁复制集¶
#1.登录主库root
mongo --port 28017 admin
#2.删除要改为仲裁节点的从库
rs.remove("192.168.178.151:28019")
#3.重新加入仲裁节点
rs.addArb("192.168.178.151:28020")
#4.查看节点状态
rs.status(); #这个貌似看不出,只能看出不是从节点了。
rs.isMaster(); #这个可以看出是否是仲裁节点
#1.登录主库
[mongod@151 ~]$ mongo --port 28017 admin
MongoDB shell version: 3.2.22
connecting to: 127.0.0.1:28017/admin
my_repl:PRIMARY>
#2.删除一个节点
my_repl:PRIMARY> rs.remove("192.168.178.151:28019")
{ "ok" : 1 }
my_repl:PRIMARY> rs.isMaster()
{
"hosts" : [
"192.168.178.151:28017",
"192.168.178.151:28018"
],
"setName" : "my_repl",
"setVersion" : 4,
"ismaster" : true,
"secondary" : false,
"primary" : "192.168.178.151:28017",
"me" : "192.168.178.151:28017",
"electionId" : ObjectId("7fffffff0000000000000001"),
"maxBsonObjectSize" : 16777216,
"maxMessageSizeBytes" : 48000000,
"maxWriteBatchSize" : 1000,
"localTime" : ISODate("2021-05-12T10:31:41.281Z"),
"maxWireVersion" : 4,
"minWireVersion" : 0,
"ok" : 1
}
my_repl:PRIMARY>
#3.重新添加为仲裁节点
my_repl:PRIMARY> rs.addArb("192.168.178.151:28020")
{ "ok" : 1 }
#4.查看状态1
my_repl:PRIMARY> rs.isMaster()
{
"hosts" : [
"192.168.178.151:28017",
"192.168.178.151:28018"
],
"arbiters" : [
"192.168.178.151:28020" #此处可以看出是仲裁节点
],
"setName" : "my_repl",
"setVersion" : 5,
"ismaster" : true,
"secondary" : false,
"primary" : "192.168.178.151:28017",
"me" : "192.168.178.151:28017",
"electionId" : ObjectId("7fffffff0000000000000001"),
"maxBsonObjectSize" : 16777216,
"maxMessageSizeBytes" : 48000000,
"maxWriteBatchSize" : 1000,
"localTime" : ISODate("2021-05-12T10:31:55.151Z"),
"maxWireVersion" : 4,
"minWireVersion" : 0,
"ok" : 1
}
my_repl:PRIMARY>
#4.查看状态2
my_repl:PRIMARY> rs.status()
{
"set" : "my_repl",
"date" : ISODate("2021-05-12T10:32:04.194Z"),
"myState" : 1,
"term" : NumberLong(1),
"heartbeatIntervalMillis" : NumberLong(2000),
"members" : [
{
"_id" : 0,
"name" : "192.168.178.151:28017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 1954,
"optime" : {
"ts" : Timestamp(1620815512, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2021-05-12T10:31:52Z"),
"electionTime" : Timestamp(1620814084, 1),
"electionDate" : ISODate("2021-05-12T10:08:04Z"),
"configVersion" : 5,
"self" : true
},
{
"_id" : 1,
"name" : "192.168.178.151:28018",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 1450,
"optime" : {
"ts" : Timestamp(1620815512, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2021-05-12T10:31:52Z"),
"lastHeartbeat" : ISODate("2021-05-12T10:32:02.924Z"),
"lastHeartbeatRecv" : ISODate("2021-05-12T10:32:02.982Z"),
"pingMs" : NumberLong(0),
"syncingTo" : "192.168.178.151:28017",
"configVersion" : 5
},
{
"_id" : 2,
"name" : "192.168.178.151:28020",
"health" : 0,
"state" : 8,
"stateStr" : "(not reachable/healthy)",
"uptime" : 0,
"lastHeartbeat" : ISODate("2021-05-12T10:32:03.097Z"),
"lastHeartbeatRecv" : ISODate("2021-05-12T10:31:52.945Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "no response within election timeout period",
"configVersion" : -1
}
],
"ok" : 1
}
my_repl:PRIMARY>
#5.删除仲裁节点测试
my_repl:PRIMARY> rs.isMaster()
{
"hosts" : [
"192.168.178.151:28017",
"192.168.178.151:28018"
],
"arbiters" : [
"192.168.178.151:28020"
],
"setName" : "my_repl",
"setVersion" : 5,
"ismaster" : true,
"secondary" : false,
"primary" : "192.168.178.151:28017",
"me" : "192.168.178.151:28017",
"electionId" : ObjectId("7fffffff0000000000000001"),
"maxBsonObjectSize" : 16777216,
"maxMessageSizeBytes" : 48000000,
"maxWriteBatchSize" : 1000,
"localTime" : ISODate("2021-05-12T10:36:25.353Z"),
"maxWireVersion" : 4,
"minWireVersion" : 0,
"ok" : 1
}
#删除
my_repl:PRIMARY> rs.remove("192.168.178.151:28020")
{ "ok" : 1 }
my_repl:PRIMARY>
#再次查看状态
my_repl:PRIMARY> rs.isMaster()
{
"hosts" : [
"192.168.178.151:28017",
"192.168.178.151:28018"
],
"setName" : "my_repl",
"setVersion" : 6,
"ismaster" : true,
"secondary" : false,
"primary" : "192.168.178.151:28017",
"me" : "192.168.178.151:28017",
"electionId" : ObjectId("7fffffff0000000000000001"),
"maxBsonObjectSize" : 16777216,
"maxMessageSizeBytes" : 48000000,
"maxWriteBatchSize" : 1000,
"localTime" : ISODate("2021-05-12T10:36:57.412Z"),
"maxWireVersion" : 4,
"minWireVersion" : 0,
"ok" : 1
}
#再次添加
my_repl:PRIMARY> rs.addArb("192.168.178.151:28019")
{ "ok" : 1 }
#查看状态
my_repl:PRIMARY> rs.isMaster()
{
"hosts" : [
"192.168.178.151:28017",
"192.168.178.151:28018"
],
"arbiters" : [
"192.168.178.151:28019"
],
"setName" : "my_repl",
"setVersion" : 7,
"ismaster" : true,
"secondary" : false,
"primary" : "192.168.178.151:28017",
"me" : "192.168.178.151:28017",
"electionId" : ObjectId("7fffffff0000000000000001"),
"maxBsonObjectSize" : 16777216,
"maxMessageSizeBytes" : 48000000,
"maxWriteBatchSize" : 1000,
"localTime" : ISODate("2021-05-12T10:37:10.248Z"),
"maxWireVersion" : 4,
"minWireVersion" : 0,
"ok" : 1
}
my_repl:PRIMARY> exit
bye
[mongod@151 ~]$
9. 配置1主1从1仲裁复制集(与第6步平行)(略)¶
#1.登录主库
mongo --port 28017 admin
#2.创建配置
config={
_id: 'my_repl', members: [
{_id: 0, host: '192.168.178.151:28017'},
{_id: 0, host: '192.168.178.151:28018'},
{_id: 0, host: '192.168.178.151:28019', "arbiterOnly": true}
]
}
#3.初始化
rs.initiate(config)
#4.查看状态
rs.isMaster()
10. 特殊节点介绍¶
#1.添加特殊节点的方法
#1.可以在搭建过程中设置特殊节点
#2.也可以通过修改配置,将普通从节点设置为特殊节点
#2.特殊节点分类
#1.arbiter节点:主要负责选主过程中的投票,但是不存储任何数据,也不提供任何服务
#2.hidden节点: 隐藏节点,不参与选主,也不对外提供服务
#3.delay节点: 延时节点,数据落后于主库一段时间,因为数据是延时的,也不应该提供服务或参与选主,所以通常回配合hidden
11. 配置延时节点¶
#经测试,只能在主库上配置!!!
mongo --port 28017 admin
#1.查看所有节点的配置
rs.conf()
#2.将配置设为变量
cfg=rs.conf()
#3.在线修改配置
cfg.members[2].priority=0
cfg.members[2].hidden=true
cfg.members[2].slaveDelay=120 #单位是分还是秒???
#4.重新加载配置
rs.reconfig(cfg)
#5.再次查看配置
rs.conf()
#1.恢复1主2从
[mongod@151 ~]$ mongo --port 28017 admin
MongoDB shell version: 3.2.22
connecting to: 127.0.0.1:28017/admin
my_repl:PRIMARY> rs.isMaster()
{
"hosts" : [
"192.168.178.151:28017",
"192.168.178.151:28018"
],
"arbiters" : [
"192.168.178.151:28019"
],
"setName" : "my_repl",
"setVersion" : 7,
"ismaster" : true,
"secondary" : false,
"primary" : "192.168.178.151:28017",
"me" : "192.168.178.151:28017",
"electionId" : ObjectId("7fffffff0000000000000001"),
"maxBsonObjectSize" : 16777216,
"maxMessageSizeBytes" : 48000000,
"maxWriteBatchSize" : 1000,
"localTime" : ISODate("2021-05-12T10:47:08.662Z"),
"maxWireVersion" : 4,
"minWireVersion" : 0,
"ok" : 1
}
my_repl:PRIMARY> rs.remove("192.168.178.151:28019")
{ "ok" : 1 }
my_repl:PRIMARY> rs.add("192.168.178.151:28019")
{ "ok" : 1 }
my_repl:PRIMARY> rs.isMaster()
{
"hosts" : [
"192.168.178.151:28017",
"192.168.178.151:28018",
"192.168.178.151:28019"
],
"setName" : "my_repl",
"setVersion" : 9,
"ismaster" : true,
"secondary" : false,
"primary" : "192.168.178.151:28017",
"me" : "192.168.178.151:28017",
"electionId" : ObjectId("7fffffff0000000000000001"),
"maxBsonObjectSize" : 16777216,
"maxMessageSizeBytes" : 48000000,
"maxWriteBatchSize" : 1000,
"localTime" : ISODate("2021-05-12T10:47:27.252Z"),
"maxWireVersion" : 4,
"minWireVersion" : 0,
"ok" : 1
}
my_repl:PRIMARY>
#2.从库测试------修改失败
[mongod@151 ~]$ mongo --port 28018 admin
MongoDB shell version: 3.2.22
connecting to: 127.0.0.1:28018/admin
my_repl:SECONDARY>
my_repl:SECONDARY> cfg=rs.conf()
{
"_id" : "my_repl",
"version" : 9,
"protocolVersion" : NumberLong(1),
"members" : [
{
"_id" : 0,
"host" : "192.168.178.151:28017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 1,
"host" : "192.168.178.151:28018",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 2,
"host" : "192.168.178.151:28019",
"arbiterOnly" : false,
"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("609ba8f9c300c25db0989e17")
}
}
my_repl:SECONDARY> cfg.members[2].priority=0
0
my_repl:SECONDARY> cfg.members[2].hidden=true
true
my_repl:SECONDARY> cfg.members[2].slaveDelay=120
120
my_repl:SECONDARY>
my_repl:SECONDARY> rs.reconfig(cfg)
{
"ok" : 0,
"errmsg" : "replSetReconfig should only be run on PRIMARY, but my state is SECONDARY; use the \"force\" argument to override",
"code" : 10107
}
my_repl:SECONDARY>
my_repl:SECONDARY> rs.conf()
{
"_id" : "my_repl",
"version" : 9,
"protocolVersion" : NumberLong(1),
"members" : [
{
"_id" : 0,
"host" : "192.168.178.151:28017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 1,
"host" : "192.168.178.151:28018",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 2,
"host" : "192.168.178.151:28019",
"arbiterOnly" : false,
"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("609ba8f9c300c25db0989e17")
}
}
my_repl:SECONDARY> exit
bye
[mongod@151 ~]$
#3.主库修改测试------修改成功!!!
[mongod@151 ~]$ mongo --port 28017 admin
MongoDB shell version: 3.2.22
connecting to: 127.0.0.1:28017/admin
my_repl:PRIMARY> cfg=rs.conf()
{
"_id" : "my_repl",
"version" : 9,
"protocolVersion" : NumberLong(1),
"members" : [
{
"_id" : 0,
"host" : "192.168.178.151:28017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 1,
"host" : "192.168.178.151:28018",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 2,
"host" : "192.168.178.151:28019",
"arbiterOnly" : false,
"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("609ba8f9c300c25db0989e17")
}
}
my_repl:PRIMARY>
my_repl:PRIMARY> cfg.members[2].priority=0
0
my_repl:PRIMARY> cfg.members[2].hidden=true
true
my_repl:PRIMARY> cfg.members[2].slaveDelay=120
120
my_repl:PRIMARY>
my_repl:PRIMARY> rs.reconfig(cfg)
{ "ok" : 1 }
my_repl:PRIMARY>
my_repl:PRIMARY> rs.conf()
{
"_id" : "my_repl",
"version" : 10,
"protocolVersion" : NumberLong(1),
"members" : [
{
"_id" : 0,
"host" : "192.168.178.151:28017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 1,
"host" : "192.168.178.151:28018",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 2,
"host" : "192.168.178.151:28019",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : true,
"priority" : 0,
"tags" : {
},
"slaveDelay" : NumberLong(120),
"votes" : 1
}
],
"settings" : {
"chainingAllowed" : true,
"heartbeatIntervalMillis" : 2000,
"heartbeatTimeoutSecs" : 10,
"electionTimeoutMillis" : 10000,
"getLastErrorModes" : {
},
"getLastErrorDefaults" : {
"w" : 1,
"wtimeout" : 0
},
"replicaSetId" : ObjectId("609ba8f9c300c25db0989e17")
}
}
#看不到隐藏的延时节点,只能通过上面看到
my_repl:PRIMARY> rs.isMaster()
{
"hosts" : [
"192.168.178.151:28017",
"192.168.178.151:28018"
],
"setName" : "my_repl",
"setVersion" : 10,
"ismaster" : true,
"secondary" : false,
"primary" : "192.168.178.151:28017",
"me" : "192.168.178.151:28017",
"electionId" : ObjectId("7fffffff0000000000000001"),
"maxBsonObjectSize" : 16777216,
"maxMessageSizeBytes" : 48000000,
"maxWriteBatchSize" : 1000,
"localTime" : ISODate("2021-05-12T11:02:00.719Z"),
"maxWireVersion" : 4,
"minWireVersion" : 0,
"ok" : 1
}
my_repl:PRIMARY>
my_repl:PRIMARY> exit
bye
[mongod@151 ~]$
#登录主库命令测试!!!
[mongod@151 ~]$ mongo -p 28017 admin
MongoDB shell version: 3.2.22
connecting to: admin
> exit
bye
[mongod@151 ~]$ mongo -p 28017 192.168.178.151/admin
MongoDB shell version: 3.2.22
connecting to: 192.168.178.151/admin
> exit
bye
#只能通过如下命令登入复制集!!!
[mongod@151 ~]$ mongo --port 28017 admin
MongoDB shell version: 3.2.22
connecting to: 127.0.0.1:28017/admin
my_repl:PRIMARY>
my_repl:PRIMARY> exit
bye
12. 恢复延时节点为普通节点¶
#1.主库登录
mongo --port 28017 admin
#2.查看所有节点的配置
rs.conf()
#3.将配置设为变量
cfg=rs.conf()
#4.在线修改配置
cfg.members[2].priority=1
cfg.members[2].hidden=false
cfg.members[2].slaveDelay=0
#5.重新加载配置
rs.reconfig(cfg)
#6.再次查看配置
rs.conf()
[mongod@151 ~]$ mongo --port 28017 admin
MongoDB shell version: 3.2.22
connecting to: 127.0.0.1:28017/admin
my_repl:PRIMARY> cfg=rs.conf()
{
"_id" : "my_repl",
"version" : 10,
"protocolVersion" : NumberLong(1),
"members" : [
{
"_id" : 0,
"host" : "192.168.178.151:28017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 1,
"host" : "192.168.178.151:28018",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 2,
"host" : "192.168.178.151:28019",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : true,
"priority" : 0,
"tags" : {
},
"slaveDelay" : NumberLong(120),
"votes" : 1
}
],
"settings" : {
"chainingAllowed" : true,
"heartbeatIntervalMillis" : 2000,
"heartbeatTimeoutSecs" : 10,
"electionTimeoutMillis" : 10000,
"getLastErrorModes" : {
},
"getLastErrorDefaults" : {
"w" : 1,
"wtimeout" : 0
},
"replicaSetId" : ObjectId("609ba8f9c300c25db0989e17")
}
}
my_repl:PRIMARY>
my_repl:PRIMARY> cfg.members[2].priority=1
1
my_repl:PRIMARY> cfg.members[2].hidden=false
false
my_repl:PRIMARY> cfg.members[2].slaveDelay=0
0
my_repl:PRIMARY>
my_repl:PRIMARY> rs.reconfig(cfg)
{ "ok" : 1 }
my_repl:PRIMARY>
my_repl:PRIMARY> rs.conf()
{
"_id" : "my_repl",
"version" : 11,
"protocolVersion" : NumberLong(1),
"members" : [
{
"_id" : 0,
"host" : "192.168.178.151:28017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 1,
"host" : "192.168.178.151:28018",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 2,
"host" : "192.168.178.151:28019",
"arbiterOnly" : false,
"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("609ba8f9c300c25db0989e17")
}
}
my_repl:PRIMARY>
my_repl:PRIMARY> rs.isMaster()
{
"hosts" : [
"192.168.178.151:28017",
"192.168.178.151:28018",
"192.168.178.151:28019"
],
"setName" : "my_repl",
"setVersion" : 11,
"ismaster" : true,
"secondary" : false,
"primary" : "192.168.178.151:28017",
"me" : "192.168.178.151:28017",
"electionId" : ObjectId("7fffffff0000000000000001"),
"maxBsonObjectSize" : 16777216,
"maxMessageSizeBytes" : 48000000,
"maxWriteBatchSize" : 1000,
"localTime" : ISODate("2021-05-12T11:04:28.808Z"),
"maxWireVersion" : 4,
"minWireVersion" : 0,
"ok" : 1
}
my_repl:PRIMARY>
my_repl:PRIMARY> exit
bye
13. 复制集的意外情况(由于删不掉主节点。暂时跳过)¶
#还是删不掉主节点。但是实验完成了
#登录主库
mongo --port 28017 admin
#1.查看复制集状态
rs.conf()
#2.删除0号节点
rs.remove("ip:port")
rs.remove("192.168.178.151:28017")
#3.再次查看复制集配置
rs.conf()
#4.此时已经没有0号节点了,进行操作要按顺序来,不能按数字来
#5.再次加回0号节点
rs.add("ip:port")
rs.add("192.168.178.151:28017")
#6.再次查看复制集配置信息
rs.conf()
#7.此时,28017的id已变为3!!!
[mongod@151 ~]$ mongo --port 28017 admin
MongoDB shell version: 3.2.22
connecting to: 127.0.0.1:28017/admin
my_repl:PRIMARY>
my_repl:PRIMARY> rs.conf()
{
"_id" : "my_repl",
"version" : 11,
"protocolVersion" : NumberLong(1),
"members" : [
{
"_id" : 0,
"host" : "192.168.178.151:28017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 1,
"host" : "192.168.178.151:28018",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 2,
"host" : "192.168.178.151:28019",
"arbiterOnly" : false,
"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("609ba8f9c300c25db0989e17")
}
}
my_repl:PRIMARY>
#删除主节点失败。。。
my_repl:PRIMARY> rs.remove("192.168.178.151:28017")
{
"ok" : 0,
"errmsg" : "No host described in new configuration 12 for replica set my_repl maps to this node",
"code" : 103
}
my_repl:PRIMARY>
#难道只能重新搭建才能解决吗?
#疑问:复制集如何解除?所有节点关闭再启动就解除了吗?
#删除1号从节点测试
[mongod@151 ~]$ mongo --port 28017 admin
MongoDB shell version: 3.2.22
connecting to: 127.0.0.1:28017/admin
my_repl:PRIMARY> rs.isMaster()
{
"hosts" : [
"192.168.178.151:28017",
"192.168.178.151:28018",
"192.168.178.151:28019"
],
"setName" : "my_repl",
"setVersion" : 11,
"ismaster" : true,
"secondary" : false,
"primary" : "192.168.178.151:28017",
"me" : "192.168.178.151:28017",
"electionId" : ObjectId("7fffffff0000000000000001"),
"maxBsonObjectSize" : 16777216,
"maxMessageSizeBytes" : 48000000,
"maxWriteBatchSize" : 1000,
"localTime" : ISODate("2021-05-12T11:17:18.979Z"),
"maxWireVersion" : 4,
"minWireVersion" : 0,
"ok" : 1
}
my_repl:PRIMARY> rs.remove("192.168.178.151:28018")
{
"ok" : 0,
"errmsg" : "Quorum check failed because not enough voting nodes responded; required 2 but only the following 1 voting nodes responded: 192.168.178.151:28017; the following nodes did not respond affirmatively: 192.168.178.151:28019 failed with Connection refused",
"code" : 74
}
my_repl:PRIMARY>
#发现从节点也删除不了。。。
#发现问题:从节点2号登录不了啊。
[mongod@151 ~]$ mongo --port 28019 admin
MongoDB shell version: 3.2.22
connecting to: 127.0.0.1:28019/admin
2021-05-12T19:29:49.519+0800 W NETWORK [thread1] Failed to connect to 127.0.0.1:28019, in(checking socket for error after poll), reason: errno:111 Connection refused
2021-05-12T19:29:49.519+0800 E QUERY [thread1] Error: couldn't connect to server 127.0.0.1:28019, connec tion attempt failed :
connect@src/mongo/shell/mongo.js:231:14
@(connect):1:6
exception: connect failed
[mongod@151 ~]$
#1号从节点能登录
[mongod@151 ~]$ mongo --port 28018 admin
MongoDB shell version: 3.2.22
connecting to: 127.0.0.1:28018/admin
my_repl:SECONDARY>
my_repl:SECONDARY> exit
bye
[mongod@151 ~]$
#想到一个方法,再添加一个从节点测试
#报错。添加不了啊。
[mongod@151 ~]$ mongo --port 28017 admin
MongoDB shell version: 3.2.22
connecting to: 127.0.0.1:28017/admin
my_repl:PRIMARY>
my_repl:PRIMARY> rs.add("192.168.178.151:28020")
{
"ok" : 0,
"errmsg" : "Quorum check failed because not enough voting nodes responded; required 3 but only the following 2 voting nodes responded: 192.168.178.151:28017, 192.168.178.151:28018; the following nodes did not respond affirmatively: 192.168.178.151:28019 failed with Connection refused, 192.168.178.151:28020 failed with Connection refused",
"code" : 74
}
my_repl:PRIMARY>
#查找原因
[mongod@151 ~]$ netstat -tunlp|grep 280
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
tcp 0 0 0.0.0.0:28017 0.0.0.0:* LISTEN 45004/mongod
tcp 0 0 0.0.0.0:28018 0.0.0.0:* LISTEN 46652/mongod
[mongod@151 ~]$
#发现28019和28920都未运行。。。难道说从复制集中删除节点后,就会自动退出吗???(待验证。。。)
#先启动
[mongod@151 ~]$ mongod -f /mongodb/28019/conf/mongo.conf
about to fork child process, waiting until server is ready for connections.
forked process: 79015
child process started successfully, parent exiting
[mongod@151 ~]$ mongod -f /mongodb/28020/conf/mongo.conf
about to fork child process, waiting until server is ready for connections.
forked process: 79079
child process started successfully, parent exiting
[mongod@151 ~]$
[mongod@151 ~]$ netstat -tunlp|grep 280
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
tcp 0 0 0.0.0.0:28017 0.0.0.0:* LISTEN 45004/mongod
tcp 0 0 0.0.0.0:28018 0.0.0.0:* LISTEN 46652/mongod
tcp 0 0 0.0.0.0:28019 0.0.0.0:* LISTEN 79015/mongod
tcp 0 0 0.0.0.0:28020 0.0.0.0:* LISTEN 79079/mongod
#再次添加28020
[mongod@151 ~]$ mongo --port 28017 admin
MongoDB shell version: 3.2.22
connecting to: 127.0.0.1:28017/admin
my_repl:PRIMARY>
my_repl:PRIMARY> rs.add("192.168.178.151:28020")
{ "ok" : 1 }
my_repl:PRIMARY> rs.isMaster()
{
"hosts" : [
"192.168.178.151:28017",
"192.168.178.151:28018",
"192.168.178.151:28019",
"192.168.178.151:28020"
],
"setName" : "my_repl",
"setVersion" : 12,
"ismaster" : true,
"secondary" : false,
"primary" : "192.168.178.151:28017",
"me" : "192.168.178.151:28017",
"electionId" : ObjectId("7fffffff0000000000000001"),
"maxBsonObjectSize" : 16777216,
"maxMessageSizeBytes" : 48000000,
"maxWriteBatchSize" : 1000,
"localTime" : ISODate("2021-05-12T11:35:08.993Z"),
"maxWireVersion" : 4,
"minWireVersion" : 0,
"ok" : 1
}
my_repl:PRIMARY>
my_repl:PRIMARY> rs.conf()
{
"_id" : "my_repl",
"version" : 12,
"protocolVersion" : NumberLong(1),
"members" : [
{
"_id" : 0,
"host" : "192.168.178.151:28017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 1,
"host" : "192.168.178.151:28018",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 2,
"host" : "192.168.178.151:28019",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 3,
"host" : "192.168.178.151:28020",
"arbiterOnly" : false,
"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("609ba8f9c300c25db0989e17")
}
}
my_repl:PRIMARY>
#再次删除28017,依旧报错。。。
my_repl:PRIMARY> rs.remove("192.168.178.151:28017")
{
"ok" : 0,
"errmsg" : "No host described in new configuration 13 for replica set my_repl maps to this node",
"code" : 103
}
#再次删除从节点,成功
my_repl:PRIMARY> rs.remove("192.168.178.151:28018")
{ "ok" : 1 }
my_repl:PRIMARY> rs.isMaster()
{
"hosts" : [
"192.168.178.151:28017",
"192.168.178.151:28019",
"192.168.178.151:28020"
],
"setName" : "my_repl",
"setVersion" : 13,
"ismaster" : true,
"secondary" : false,
"primary" : "192.168.178.151:28017",
"me" : "192.168.178.151:28017",
"electionId" : ObjectId("7fffffff0000000000000001"),
"maxBsonObjectSize" : 16777216,
"maxMessageSizeBytes" : 48000000,
"maxWriteBatchSize" : 1000,
"localTime" : ISODate("2021-05-12T11:36:04.791Z"),
"maxWireVersion" : 4,
"minWireVersion" : 0,
"ok" : 1
}
my_repl:PRIMARY> exit
bye
[mongod@151 ~]$
#查看28018运行状态,发现依旧运行。奇怪了。。。
[mongod@151 ~]$ netstat -tunlp|grep 280
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
tcp 0 0 0.0.0.0:28017 0.0.0.0:* LISTEN 45004/mongod
tcp 0 0 0.0.0.0:28018 0.0.0.0:* LISTEN 46652/mongod
tcp 0 0 0.0.0.0:28019 0.0.0.0:* LISTEN 79015/mongod
tcp 0 0 0.0.0.0:28020 0.0.0.0:* LISTEN 79079/mongod
[mongod@151 ~]$
#再次添加28018,查看id
[mongod@151 ~]$ mongo --port 28017 admin
MongoDB shell version: 3.2.22
connecting to: 127.0.0.1:28017/admin
my_repl:PRIMARY>
my_repl:PRIMARY> rs.conf()
{
"_id" : "my_repl",
"version" : 13,
"protocolVersion" : NumberLong(1),
"members" : [
{
"_id" : 0,
"host" : "192.168.178.151:28017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 2,
"host" : "192.168.178.151:28019",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 3,
"host" : "192.168.178.151:28020",
"arbiterOnly" : false,
"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("609ba8f9c300c25db0989e17")
}
}
my_repl:PRIMARY>
my_repl:PRIMARY> rs.add("192.168.178.151:28018")
{ "ok" : 1 }
my_repl:PRIMARY>
my_repl:PRIMARY> rs.conf()
{
"_id" : "my_repl",
"version" : 14,
"protocolVersion" : NumberLong(1),
"members" : [
{
"_id" : 0,
"host" : "192.168.178.151:28017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 2,
"host" : "192.168.178.151:28019",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 3,
"host" : "192.168.178.151:28020",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 4,
"host" : "192.168.178.151:28018",
"arbiterOnly" : false,
"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("609ba8f9c300c25db0989e17")
}
}
my_repl:PRIMARY>
my_repl:PRIMARY> exit
bye
[mongod@151 ~]$
#发现id已经变为4,而1空着。
#此情况就是意外情况,
#此时要修改id=4的节点的话,members数字应为3,而不是4.不能看id的数字,而要看摆放位置,从0开始从头数。。。
cfg.members[3].priority=0
cfg.members[3].hidden=true
cfg.members[3].slaveDelay=120
14. 复制集的其他操作命令¶
#最好都在主库运行以下命令,有的命令在从库运行不了!!!
#1.查看副本集的配置信息
rs.config()
#or
rs.conf()
#2.查看副本集各成员的状态
rs.status()
#3.副本集角色切换(生产环境尽量不用)
rs.stepDown()
#4.锁定从库,使其不会转变为主库
rs.freeze(300)
#5.设置副本节点可读(在副本节点执行)
rs.slaveOk()
#6.查看副本节点(监控主从延时)
rs.printSlaveReplicationInfo()
#1.从库测试命令(发现有的命令可以,有的不可以)
[mongod@151 ~]$ mongo --port 28018 admin
MongoDB shell version: 3.2.22
connecting to: 127.0.0.1:28018/admin
my_repl:SECONDARY>
my_repl:SECONDARY> rs.config()
{
"_id" : "my_repl",
"version" : 14,
"protocolVersion" : NumberLong(1),
"members" : [
{
"_id" : 0,
"host" : "192.168.178.151:28017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 2,
"host" : "192.168.178.151:28019",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 3,
"host" : "192.168.178.151:28020",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 4,
"host" : "192.168.178.151:28018",
"arbiterOnly" : false,
"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("609ba8f9c300c25db0989e17")
}
}
my_repl:SECONDARY> rs.status()
{
"set" : "my_repl",
"date" : ISODate("2021-05-12T11:41:56.914Z"),
"myState" : 2,
"term" : NumberLong(1),
"heartbeatIntervalMillis" : NumberLong(2000),
"members" : [
{
"_id" : 0,
"name" : "192.168.178.151:28017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 5641,
"optime" : {
"ts" : Timestamp(1620819512, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2021-05-12T11:38:32Z"),
"lastHeartbeat" : ISODate("2021-05-12T11:41:54.921Z"),
"lastHeartbeatRecv" : ISODate("2021-05-12T11:41:55.079Z"),
"pingMs" : NumberLong(0),
"electionTime" : Timestamp(1620814084, 1),
"electionDate" : ISODate("2021-05-12T10:08:04Z"),
"configVersion" : 14
},
{
"_id" : 2,
"name" : "192.168.178.151:28019",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 461,
"optime" : {
"ts" : Timestamp(1620819512, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2021-05-12T11:38:32Z"),
"lastHeartbeat" : ISODate("2021-05-12T11:41:54.924Z"),
"lastHeartbeatRecv" : ISODate("2021-05-12T11:41:55.081Z"),
"pingMs" : NumberLong(0),
"syncingTo" : "192.168.178.151:28017",
"configVersion" : 14
},
{
"_id" : 3,
"name" : "192.168.178.151:28020",
"health" : 1,
"state" : 5,
"stateStr" : "STARTUP2",
"uptime" : 411,
"optime" : {
"ts" : Timestamp(0, 0),
"t" : NumberLong(-1)
},
"optimeDate" : ISODate("1970-01-01T00:00:00Z"),
"lastHeartbeat" : ISODate("2021-05-12T11:41:54.924Z"),
"lastHeartbeatRecv" : ISODate("2021-05-12T11:41:52.905Z"),
"pingMs" : NumberLong(0),
"configVersion" : 14
},
{
"_id" : 4,
"name" : "192.168.178.151:28018",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 5875,
"optime" : {
"ts" : Timestamp(1620819512, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2021-05-12T11:38:32Z"),
"infoMessage" : "could not find member to sync from",
"configVersion" : 14,
"self" : true
}
],
"ok" : 1
}
my_repl:SECONDARY>
my_repl:SECONDARY>
my_repl:SECONDARY> rs.stepDown()
{ "ok" : 0, "errmsg" : "not primary so can't step down", "code" : 10107 }
my_repl:SECONDARY>
my_repl:SECONDARY> rs.printSlaveReplicationInfo()
source: 192.168.178.151:28019
syncedTo: Wed May 12 2021 19:38:32 GMT+0800 (CST)
0 secs (0 hrs) behind the primary
source: 192.168.178.151:28020
syncedTo: Thu Jan 01 1970 08:00:00 GMT+0800 (CST)
1620819512 secs (450227.64 hrs) behind the primary
source: 192.168.178.151:28018
syncedTo: Wed May 12 2021 19:38:32 GMT+0800 (CST)
0 secs (0 hrs) behind the primary
my_repl:SECONDARY>
my_repl:SECONDARY>
my_repl:SECONDARY> exit
bye
#2.主库测试命令
[mongod@151 ~]$ mongo --port 28017 admin
MongoDB shell version: 3.2.22
connecting to: 127.0.0.1:28017/admin
my_repl:PRIMARY> rs.config()
{
"_id" : "my_repl",
"version" : 14,
"protocolVersion" : NumberLong(1),
"members" : [
{
"_id" : 0,
"host" : "192.168.178.151:28017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 2,
"host" : "192.168.178.151:28019",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 3,
"host" : "192.168.178.151:28020",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 4,
"host" : "192.168.178.151:28018",
"arbiterOnly" : false,
"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("609ba8f9c300c25db0989e17")
}
}
my_repl:PRIMARY>
my_repl:PRIMARY> rs.status()
{
"set" : "my_repl",
"date" : ISODate("2021-05-12T12:11:05.467Z"),
"myState" : 1,
"term" : NumberLong(1),
"heartbeatIntervalMillis" : NumberLong(2000),
"members" : [
{
"_id" : 0,
"name" : "192.168.178.151:28017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 7895,
"optime" : {
"ts" : Timestamp(1620819512, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2021-05-12T11:38:32Z"),
"electionTime" : Timestamp(1620814084, 1),
"electionDate" : ISODate("2021-05-12T10:08:04Z"),
"configVersion" : 14,
"self" : true
},
{
"_id" : 2,
"name" : "192.168.178.151:28019",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 2207,
"optime" : {
"ts" : Timestamp(1620819512, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2021-05-12T11:38:32Z"),
"lastHeartbeat" : ISODate("2021-05-12T12:11:05.050Z"),
"lastHeartbeatRecv" : ISODate("2021-05-12T12:11:05.049Z"),
"pingMs" : NumberLong(1),
"syncingTo" : "192.168.178.151:28017",
"configVersion" : 14
},
{
"_id" : 3,
"name" : "192.168.178.151:28020",
"health" : 1,
"state" : 5,
"stateStr" : "STARTUP2",
"uptime" : 2158,
"optime" : {
"ts" : Timestamp(0, 0),
"t" : NumberLong(-1)
},
"optimeDate" : ISODate("1970-01-01T00:00:00Z"),
"lastHeartbeat" : ISODate("2021-05-12T12:11:04.444Z"),
"lastHeartbeatRecv" : ISODate("2021-05-12T12:11:04.499Z"),
"pingMs" : NumberLong(0),
"configVersion" : 14
},
{
"_id" : 4,
"name" : "192.168.178.151:28018",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 1950,
"optime" : {
"ts" : Timestamp(1620819512, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2021-05-12T11:38:32Z"),
"lastHeartbeat" : ISODate("2021-05-12T12:11:04.764Z"),
"lastHeartbeatRecv" : ISODate("2021-05-12T12:11:01.116Z"),
"pingMs" : NumberLong(0),
"configVersion" : 14
}
],
"ok" : 1
}
my_repl:PRIMARY>
my_repl:PRIMARY> rs.stepDown()
2021-05-12T20:11:12.178+0800 E QUERY [thread1] Error: error doing query: failed: network error while attempting to run command 'replSetStepDown' on host '127.0.0.1:28017' :
DB.prototype.runCommand@src/mongo/shell/db.js:135:1
DB.prototype.adminCommand@src/mongo/shell/db.js:152:1
rs.stepDown@src/mongo/shell/utils.js:1202:12
@(shell):1:1
2021-05-12T20:11:12.185+0800 I NETWORK [thread1] trying reconnect to 127.0.0.1:28017 (127.0.0.1) failed
2021-05-12T20:11:12.187+0800 I NETWORK [thread1] reconnect 127.0.0.1:28017 (127.0.0.1) ok
my_repl:SECONDARY>
my_repl:SECONDARY> rs.printSlaveReplicationInfo()
source: 192.168.178.151:28017
syncedTo: Wed May 12 2021 20:11:22 GMT+0800 (CST)
0 secs (0 hrs) behind the primary
source: 192.168.178.151:28019
syncedTo: Wed May 12 2021 20:11:22 GMT+0800 (CST)
0 secs (0 hrs) behind the primary
source: 192.168.178.151:28020
syncedTo: Thu Jan 01 1970 08:00:00 GMT+0800 (CST)
1620821482 secs (450228.19 hrs) behind the primary
my_repl:SECONDARY>
my_repl:SECONDARY> rs.isMaster()
{
"hosts" : [
"192.168.178.151:28017",
"192.168.178.151:28019",
"192.168.178.151:28020",
"192.168.178.151:28018"
],
"setName" : "my_repl",
"setVersion" : 14,
"ismaster" : false,
"secondary" : true,
"primary" : "192.168.178.151:28018",
"me" : "192.168.178.151:28017",
"maxBsonObjectSize" : 16777216,
"maxMessageSizeBytes" : 48000000,
"maxWriteBatchSize" : 1000,
"localTime" : ISODate("2021-05-12T12:11:50.800Z"),
"maxWireVersion" : 4,
"minWireVersion" : 0,
"ok" : 1
}
my_repl:SECONDARY>
my_repl:SECONDARY> rs.conf()
{
"_id" : "my_repl",
"version" : 14,
"protocolVersion" : NumberLong(1),
"members" : [
{
"_id" : 0,
"host" : "192.168.178.151:28017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 2,
"host" : "192.168.178.151:28019",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 3,
"host" : "192.168.178.151:28020",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 4,
"host" : "192.168.178.151:28018",
"arbiterOnly" : false,
"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("609ba8f9c300c25db0989e17")
}
}
my_repl:SECONDARY>
my_repl:SECONDARY>
my_repl:SECONDARY> rs.isMaster()
{
"hosts" : [
"192.168.178.151:28017",
"192.168.178.151:28019",
"192.168.178.151:28020",
"192.168.178.151:28018"
],
"setName" : "my_repl",
"setVersion" : 14,
"ismaster" : false,
"secondary" : true,
"primary" : "192.168.178.151:28018",
"me" : "192.168.178.151:28017",
"maxBsonObjectSize" : 16777216,
"maxMessageSizeBytes" : 48000000,
"maxWriteBatchSize" : 1000,
"localTime" : ISODate("2021-05-12T12:12:32.949Z"),
"maxWireVersion" : 4,
"minWireVersion" : 0,
"ok" : 1
}
my_repl:SECONDARY>
my_repl:SECONDARY> exit
bye
[mongod@151 ~]$
#当28017不是主节点后,可以删除了
[mongod@151 ~]$ mongo --port 28018 admin
MongoDB shell version: 3.2.22
connecting to: 127.0.0.1:28018/admin
my_repl:PRIMARY>
my_repl:PRIMARY> rs.printSlaveReplicationInfo()
source: 192.168.178.151:28017
syncedTo: Wed May 12 2021 20:11:22 GMT+0800 (CST)
0 secs (0 hrs) behind the primary
source: 192.168.178.151:28019
syncedTo: Wed May 12 2021 20:11:22 GMT+0800 (CST)
0 secs (0 hrs) behind the primary
source: 192.168.178.151:28020
syncedTo: Thu Jan 01 1970 08:00:00 GMT+0800 (CST)
1620821482 secs (450228.19 hrs) behind the primary
my_repl:PRIMARY>
my_repl:PRIMARY>
my_repl:PRIMARY> rs.isMaster()
{
"hosts" : [
"192.168.178.151:28017",
"192.168.178.151:28019",
"192.168.178.151:28020",
"192.168.178.151:28018"
],
"setName" : "my_repl",
"setVersion" : 14,
"ismaster" : true,
"secondary" : false,
"primary" : "192.168.178.151:28018",
"me" : "192.168.178.151:28018",
"electionId" : ObjectId("7fffffff0000000000000002"),
"maxBsonObjectSize" : 16777216,
"maxMessageSizeBytes" : 48000000,
"maxWriteBatchSize" : 1000,
"localTime" : ISODate("2021-05-12T12:14:10.776Z"),
"maxWireVersion" : 4,
"minWireVersion" : 0,
"ok" : 1
}
my_repl:PRIMARY>
my_repl:PRIMARY>
my_repl:PRIMARY>
my_repl:PRIMARY> rs.remove("192.168.178.151:28017")
{ "ok" : 1 }
my_repl:PRIMARY>
#重新加上28017,然后尝试删除28018测试
#依旧删不掉主机点。。。
my_repl:PRIMARY> rs.remove("192.168.178.151:28018")
{
"ok" : 0,
"errmsg" : "No host described in new configuration 16 for replica set my_repl maps to this node",
"code" : 103
}
my_repl:PRIMARY>
my_repl:PRIMARY> rs.add("192.168.178.151:28017")
{ "ok" : 1 }
my_repl:PRIMARY> rs.conf()
{
"_id" : "my_repl",
"version" : 16,
"protocolVersion" : NumberLong(1),
"members" : [
{
"_id" : 2,
"host" : "192.168.178.151:28019",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 3,
"host" : "192.168.178.151:28020",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 4,
"host" : "192.168.178.151:28018",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 5,
"host" : "192.168.178.151:28017",
"arbiterOnly" : false,
"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("609ba8f9c300c25db0989e17")
}
}
my_repl:PRIMARY>
my_repl:PRIMARY>
my_repl:PRIMARY> rs.remove("192.168.178.151:28018")
{
"ok" : 0,
"errmsg" : "No host described in new configuration 17 for replica set my_repl maps to this node",
"code" : 103
}
my_repl:PRIMARY>
#自己得出的结论:貌似只要是主节点就删不掉啊。
#回头再次看视频,发现老师删除28017时,28017也是从节点。。。看样子不能删除主库啊
最后更新:
2022-02-20 11:21:58