设为首页 收藏本站
查看: 937|回复: 0

[经验分享] mongodb的复制集

[复制链接]
累计签到:67 天
连续签到:1 天
发表于 2018-10-20 11:32:41 | 显示全部楼层 |阅读模式
下载地址:https://fastdl.mongodb.org/linux ... 64-rhel62-3.6.8.tgz

Primary:192.168.20.141

Secondaries:192.168.20.142

Arbiter:192.168.20.143

mongodb安装:(所有节点都安装)

tar xf mongodb-linux-x86_64-rhel62-3.6.8.tgz

mv mongodb-linux-x86_64-rhel62-3.6.8 /usr/local/mongodb

mkdir /usr/local/mongodb/{data,log} -p

[root@localhost ~]# cat /usr/local/mongodb/mongodb.conf

pidfilepath=/usr/local/mongodb/log/mongod.pid

logpath=/usr/local/mongodb/log/mongod.log

dbpath=/usr/local/mongodb/data

logappend=true

bind_ip=192.168.20.141

port=27017

fork=true

replSet=rs0

[root@localhost ~]# cat /etc/profile

......

export PATH=$PATH:/usr/local/mongodb/bin

[root@localhost ~]# mongod --config /usr/local/mongodb/mongodb.conf


常见错误:

[root@localhost mongodb]# mongod --config /usr/local/mongodb/mongodb.conf
about to fork child process, waiting until server is ready for connections.
forked process: 1529
ERROR: child process failed, exited with error number 48
To see additional information in this output, start without the "--fork" option.

由于我的测试环境下没有数据,我将data数据目录下的文件全部清空,然后--repair

rm -rf data/mongod.lock

mongod --repair

重启:

mongod --config /usr/local/mongodb/mongodb.conf

登陆mongodb主节点:

初始化复制集:(集合:"sr0" 第一个成员为:"192.168.20.141:27017")

[root@localhost ~]# mongo 192.168.20.141:27017

> rs.initiate({_id: "rs0",members: [{ _id: 0 , host: "192.168.20.141:27017" }]})

rs0:OTHER>                    //接着回车,显示这个节点为Primary主节点
rs0:PRIMARY>

接着添加另一个成员:

rs0:PRIMARY> rs.add("192.168.20.142:27017")

查看成员信息:(或者使用:db.isMaster()

rs0:PRIMARY> rs.status()
{
        "set" : "rs0",
        "date" : ISODate("2018-10-15T15:59:47.565Z"),
        "myState" : 1,
        "term" : NumberLong(1),
        "syncingTo" : "",
        "syncSourceHost" : "",
        "syncSourceId" : -1,
        "heartbeatIntervalMillis" : NumberLong(2000),
        "optimes" : {
                "lastCommittedOpTime" : {
                        "ts" : Timestamp(1539619178, 1),
                        "t" : NumberLong(1)
                },
                "readConcernMajorityOpTime" : {
                        "ts" : Timestamp(1539619178, 1),
                        "t" : NumberLong(1)
                },
                "appliedOpTime" : {
                        "ts" : Timestamp(1539619178, 1),
                        "t" : NumberLong(1)
                },
                "durableOpTime" : {
                        "ts" : Timestamp(1539619178, 1),
                        "t" : NumberLong(1)
                }
        },
        "members" : [
                {
                        "_id" : 0,
                        "name" : "192.168.20.141:27017",
                        "health" : 1,
                        "state" : 1,
                        "stateStr" : "PRIMARY",
                        "uptime" : 107,
                        "optime" : {
                                "ts" : Timestamp(1539619178, 1),
                                "t" : NumberLong(1)
                        },
                        "optimeDate" : ISODate("2018-10-15T15:59:38Z"),
                        "syncingTo" : "",
                        "syncSourceHost" : "",
                        "syncSourceId" : -1,
                        "infoMessage" : "could not find member to sync from",
                        "electionTime" : Timestamp(1539619130, 2),
                        "electionDate" : ISODate("2018-10-15T15:58:50Z"),
                        "configVersion" : 2,
                        "self" : true,
                        "lastHeartbeatMessage" : ""
                },
                {
                        "_id" : 1,
                        "name" : "192.168.20.142:27017",
                        "health" : 1,
                        "state" : 2,
                        "stateStr" : "SECONDARY",
                        "uptime" : 9,
                        "optime" : {
                                "ts" : Timestamp(1539619178, 1),
                                "t" : NumberLong(1)
                        },
                        "optimeDurable" : {
                                "ts" : Timestamp(1539619178, 1),
                                "t" : NumberLong(1)
                        },
                        "optimeDate" : ISODate("2018-10-15T15:59:38Z"),
                        "optimeDurableDate" : ISODate("2018-10-15T15:59:38Z"),
                        "lastHeartbeat" : ISODate("2018-10-15T15:59:46.107Z"),
                        "lastHeartbeatRecv" : ISODate("2018-10-15T15:59:47.116Z"),
                        "pingMs" : NumberLong(1),
                        "lastHeartbeatMessage" : "",
                        "syncingTo" : "",
                        "syncSourceHost" : "",
                        "syncSourceId" : -1,
                        "infoMessage" : "",
                        "configVersion" : 2
                }
        ],
        "ok" : 1,
        "operationTime" : Timestamp(1539619178, 1),
        "$clusterTime" : {
                "clusterTime" : Timestamp(1539619178, 1),
                "signature" : {
                        "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                        "keyId" : NumberLong(0)
                }
        }
}


这中方法也可以查询:

rs0:PRIMARY> use admin
switched to db admin
rs0:PRIMARY> db.runCommand( {replSetGetStatus : 1} )
{
        "set" : "rs0",
        "date" : ISODate("2018-10-15T17:31:13.924Z"),
        "myState" : 1,
        "term" : NumberLong(2),
        "syncingTo" : "",
        "syncSourceHost" : "",
        "syncSourceId" : -1,
        "heartbeatIntervalMillis" : NumberLong(2000),
        "optimes" : {
                "lastCommittedOpTime" : {
                        "ts" : Timestamp(1539624666, 1),
                        "t" : NumberLong(2)
                },
                "readConcernMajorityOpTime" : {
                        "ts" : Timestamp(1539624666, 1),
                        "t" : NumberLong(2)
                },
                "appliedOpTime" : {
                        "ts" : Timestamp(1539624666, 1),
                        "t" : NumberLong(2)
                },
                "durableOpTime" : {
                        "ts" : Timestamp(1539624666, 1),
                        "t" : NumberLong(2)
                }
        },
        "members" : [
                {
                        "_id" : 0,
                        "name" : "192.168.20.141:27017",
                        "health" : 1,
                        "state" : 2,
                        "stateStr" : "SECONDARY",
                        "uptime" : 4387,
                        "optime" : {
                                "ts" : Timestamp(1539624666, 1),
                                "t" : NumberLong(2)
                        },
                        "optimeDurable" : {
                                "ts" : Timestamp(1539624666, 1),
                                "t" : NumberLong(2)
                        },
                        "optimeDate" : ISODate("2018-10-15T17:31:06Z"),
                        "optimeDurableDate" : ISODate("2018-10-15T17:31:06Z"),
                        "lastHeartbeat" : ISODate("2018-10-15T17:31:12.667Z"),
                        "lastHeartbeatRecv" : ISODate("2018-10-15T17:31:12.668Z"),
                        "pingMs" : NumberLong(0),
                        "lastHeartbeatMessage" : "",
                        "syncingTo" : "192.168.20.142:27017",
                        "syncSourceHost" : "192.168.20.142:27017",
                        "syncSourceId" : 1,
                        "infoMessage" : "",
                        "configVersion" : 3
                },
                {
                        "_id" : 1,
                        "name" : "192.168.20.142:27017",
                        "health" : 1,
                        "state" : 1,
                        "stateStr" : "PRIMARY",
                        "uptime" : 5600,
                        "optime" : {
                                "ts" : Timestamp(1539624666, 1),
                                "t" : NumberLong(2)
                        },
                        "optimeDate" : ISODate("2018-10-15T17:31:06Z"),
                        "syncingTo" : "",
                        "syncSourceHost" : "",
                        "syncSourceId" : -1,
                        "infoMessage" : "",
                        "electionTime" : Timestamp(1539620134, 1),
                        "electionDate" : ISODate("2018-10-15T16:15:34Z"),
                        "configVersion" : 3,
                        "self" : true,
                        "lastHeartbeatMessage" : ""
                },
                {
                        "_id" : 2,
                        "name" : "192.168.20.143:27017",
                        "health" : 1,
                        "state" : 7,
                        "stateStr" : "ARBITER",
                        "uptime" : 4636,
                        "lastHeartbeat" : ISODate("2018-10-15T17:31:12.677Z"),
                        "lastHeartbeatRecv" : ISODate("2018-10-15T17:31:13.313Z"),
                        "pingMs" : NumberLong(0),
                        "lastHeartbeatMessage" : "",
                        "syncingTo" : "",
                        "syncSourceHost" : "",
                        "syncSourceId" : -1,
                        "infoMessage" : "",
                        "configVersion" : 3
                }
        ],
        "ok" : 1,
        "operationTime" : Timestamp(1539624666, 1),
        "$clusterTime" : {
                "clusterTime" : Timestamp(1539624666, 1),
                "signature" : {
                        "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                        "keyId" : NumberLong(0)
                }
        }
}

详细说明如下:
"_id" :  #集群中节点编号

"name" :  #成员服务器名称及端口

"health" :  #表示成员中的健康状态(0:down;1:up)

"state" :  #为0~10,表示成员的当前状态

"stateStr" :  #描述该成员是主库(PRIMARY)还是备库(SECONDARY)

"uptime" :  #该成员在线时间(秒)

"optime" :  #成员最后一次应用日志(oplog)的信息

"optimeDate" :  #成员最后一次应用日志(oplog)的时间

"electionTime" :  #当前primary从操作日志中选举信息

"electionDate" :  #当前primary被选定为primary的日期

"configVersion" :  #mongodb版本

"self" :  #为true 表示当前节点

切换到备库中,能连接但是不能操作:

rs0:SECONDARY> show dbs
2018-10-16T01:32:31.781+0800 E QUERY    [thread1] Error: listDatabases failed:{
        "operationTime" : Timestamp(1539624746, 1),
        "ok" : 0,
        "errmsg" : "not master and slaveOk=false",
        "code" : 13435,
        "codeName" : "NotMasterNoSlaveOk",
        "$clusterTime" : {
                "clusterTime" : Timestamp(1539624746, 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:849:19
shellHelper@src/mongo/shell/utils.js:739:15
@(shellhelp2):1:1

从库开启都操作()

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


模拟主库不能使用,把主库停止,经测试从库可以自动升级成主库。

再次启动主库时,主库就变成从库了。

仲裁节点的安装:

[root@localhost ~]# cat /usr/local/mongodb/mongodb.conf

pidfilepath=/usr/local/mongodb/log/mongod.pid

logpath=/usr/local/mongodb/log/mongod.log

dbpath=/usr/local/mongodb/arbiter

logappend=false

bind_ip=192.168.20.143

port=27017

fork=true

replSet=rs0


启动mongodb的仲裁节点:

[root@localhost ~]# mongod --config /usr/local/mongodb/mongodb.conf

在主节点添加仲裁节点并查看结果:

rs0:SECONDARY> rs.addArb("192.168.20.143:27017")

查看结果:

rs0:PRIMARY> db.isMaster()
{
        "hosts" : [
                "192.168.20.141:27017",
                "192.168.20.142:27017"
        ],
        "arbiters" : [
                "192.168.20.143:27017"
        ],
        "setName" : "rs0",
        "setVersion" : 3,
        "ismaster" : true,
        "secondary" : false,
        "primary" : "192.168.20.142:27017",
        "me" : "192.168.20.142:27017",
        "electionId" : ObjectId("7fffffff0000000000000002"),
        "lastWrite" : {
                "opTime" : {
                        "ts" : Timestamp(1539625486, 1),
                        "t" : NumberLong(2)
                },
                "lastWriteDate" : ISODate("2018-10-15T17:44:46Z"),
                "majorityOpTime" : {
                        "ts" : Timestamp(1539625486, 1),
                        "t" : NumberLong(2)
                },
                "majorityWriteDate" : ISODate("2018-10-15T17:44:46Z")
        },
        "maxBsonObjectSize" : 16777216,
        "maxMessageSizeBytes" : 48000000,
        "maxWriteBatchSize" : 100000,
        "localTime" : ISODate("2018-10-15T17:44:50.159Z"),
        "logicalSessionTimeoutMinutes" : 30,
        "minWireVersion" : 0,
        "maxWireVersion" : 6,
        "readOnly" : false,
        "ok" : 1,
        "operationTime" : Timestamp(1539625486, 1),
        "$clusterTime" : {
                "clusterTime" : Timestamp(1539625486, 1),
                "signature" : {
                        "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                        "keyId" : NumberLong(0)
                }
        }
}
至此安装完毕。

登陆到仲裁节点:

[root@localhost ~]# mongo 192.168.20.143:27017
MongoDB shell version v3.6.8
connecting to: mongodb://192.168.20.143:27017/test
MongoDB server version: 3.6.8
Server has startup warnings:
2018-10-16T00:13:05.892+0800 I STORAGE  [initandlisten]
2018-10-16T00:13:05.892+0800 I STORAGE  [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
2018-10-16T00:13:05.892+0800 I STORAGE  [initandlisten] **          See http://dochub.mongodb.org/core/prodnotes-filesystem
2018-10-16T00:13:06.958+0800 I CONTROL  [initandlisten]
2018-10-16T00:13:06.958+0800 I CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.
2018-10-16T00:13:06.958+0800 I CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.
2018-10-16T00:13:06.958+0800 I CONTROL  [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended.
2018-10-16T00:13:06.958+0800 I CONTROL  [initandlisten]
2018-10-16T00:13:06.959+0800 I CONTROL  [initandlisten]
2018-10-16T00:13:06.959+0800 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2018-10-16T00:13:06.959+0800 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2018-10-16T00:13:06.959+0800 I CONTROL  [initandlisten]
2018-10-16T00:13:06.959+0800 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2018-10-16T00:13:06.959+0800 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2018-10-16T00:13:06.959+0800 I CONTROL  [initandlisten]

rs0:ARBITER> rs.slaveOk();

rs0:ARBITER> db.isMaster()
{
        "hosts" : [
                "192.168.20.141:27017",
                "192.168.20.142:27017"
        ],
        "arbiters" : [
                "192.168.20.143:27017"
        ],
        "setName" : "rs0",
        "setVersion" : 3,
        "ismaster" : false,
        "secondary" : false,
        "primary" : "192.168.20.142:27017",
        "arbiterOnly" : true,
        "me" : "192.168.20.143:27017",
        "lastWrite" : {
                "opTime" : {
                        "ts" : Timestamp(1539625616, 1),
                        "t" : NumberLong(2)
                },
                "lastWriteDate" : ISODate("2018-10-15T17:46:56Z"),
                "majorityOpTime" : {
                        "ts" : Timestamp(1539625616, 1),
                        "t" : NumberLong(2)
                },
                "majorityWriteDate" : ISODate("2018-10-15T17:46:56Z")
        },
        "maxBsonObjectSize" : 16777216,
        "maxMessageSizeBytes" : 48000000,
        "maxWriteBatchSize" : 100000,
        "localTime" : ISODate("2018-10-15T17:47:02.962Z"),
        "minWireVersion" : 0,
        "maxWireVersion" : 6,
        "readOnly" : false,
        "ok" : 1
}

rs0:ARBITER> show dbs
local  0.000GB

arbiter作为仲裁者,没有数据副本存储在本地,能读取复制集的信息

上面介绍的是三台mongodb节点:一主一备一仲裁,这样,主节点挂了后,通过仲裁机制将primary自动切换到备机上!
如果上面的三台mongodb节点:一主两备,没有仲裁节点,那么主节点挂了后,primary会自动切换到其余两台备节点中的一台上!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
一主两从的mongodb配置和上面一主一从的配置一样。
多加的一个从节点,在主节点登陆mongodb,使用rs.add命令将这个成员加到集群中即可!

一主两从的模式,比如:
主节点192.168.20.141的mongodb服务程序挂了后,另外两个从节点中的一个(比如192.168.20.142)会自动变成primary主节点,
另一个节点192.168.20.143则是新的主节点(192.168.20.142)的从节点。

++++++++++++++++++++++++++++++如果想让切换回原来的主节点,做法如下+++++++++++++++++++++++++++++++
1)恢复原来的主节点192.168.20.141的mongodb服务,使用命令rs.status() 确认数据集成员运行正常。
2)到次节点192.168.20.143中登录mongodb,运行freeze使其120内不会变为主节点。
> rs.freeze(120)
3) 到新的主节点192.168.20.142中强制切换主节点,stepDown将阻止长事务和写入操作
> rs.stepDown(120)
4)此时sign-mongo01.wangshibo.cn节点变成primary主节点。使用rs.status()命令可以查看到集群状态。

+++++++++++++++++++++++若要使某个节点永远不会变为主节点,设置优先级为0即可+++++++++++++++++++++++
登陆当前主节点的mongodb,执行下面操作:
rs0:PRIMARY> cfg = rs.conf()
rs0:PRIMARY> cfg.members[0].priority = 0.5
rs0:PRIMARY> cfg.members[1].priority = 0.5
rs0:PRIMARY> cfg.members[2].priority = 0
rs0:PRIMARY> rs.reconfig(cfg)

说明:
其中成员编号0/1/2为 rs.status()中的 "_id"值
members[2]表示192.168.20.143,则它将永远不会变成主节点!因为优先级设置为0了!

++++++++++++++++++++++++++++++++移除一个复制成员(两种方法)++++++++++++++++++++++++++++++++++++
登陆当前主节点的mongodb,执行下面操作:
rs0:PRIMARY> rs.remove("192.168.20.143:27017")
rs0:PRIMARY> rs.conf()
或者:
rs0:PRIMARY> cfg = rs.conf()
rs0:PRIMARY> cfg.members.splice(2,1)
rs0:PRIMARY> rs.reconfig(cfg)

移除后到移除的节点服务器(即192.168.20.143),更改配置文件mongod.conf
#replSet=rs0       //将这一行注释
然后再重启mongodb服务,这就完成了移除(数据库文件仍保留在当前服务器)。



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-624017-1-1.html 上篇帖子: 大家都用什么工具去运维mongidb? 下篇帖子: 【MongoDB】查看集合是否分片
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表