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

[经验分享] 高可用mongodb集群的学习记录(三搭建mongodb副本集)

[复制链接]

尚未签到

发表于 2018-10-25 06:56:27 | 显示全部楼层 |阅读模式
三搭建mongodb副本集
  MongoDB复制原理就是主节点记录在其上的所有操作oplog,从节点定期轮询主节点获取这些操作,然后对自己的数据副本执行这些操作,从而保证从节点的数据与主节点一致。
  那什么是副本集呢?主从模式一主一从就是一个副本。MongoDB复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性;复制还允许您从硬件故障和服务中断中恢复数据。副本集具有多个副本保证了容错性,就算一个副本挂掉了还有很多副本存在,并且解决了之前的问题“主节点挂掉了,整个集群内会自动切换”。
    副本集特征:
  · N 个节点的集群
  · 任何节点可作为主节点
  · 所有写入操作都在主节点上
  · 自动故障转移
  · 自动恢复
  副本集还有以下几个需要注意的地方:
  1. 最小构成是:primary,secondary,arbiter,一般部署是:primary,2 secondary。
  2. 成员数应该为奇数,如果为偶数的情况下添加arbiter,arbiter不保存数据,只投票。
  3. 最大50 members,但是只能有 7 voting members,其他是non-voting members。
  借用网上找的两张架构图说明一下:
DSC0000.png

  由图可以看到客户端连接到整个副本集,不关心具体哪一台机器是否挂掉。主服务器负责整个副本集的读写,副本集定期同步数据备份,一但主节点挂掉,副本节点就会选举一个新的主服务器,这一切对于应用服务器不需要关心。我们看一下主服务器挂掉后的架构:
DSC0001.png

  副本集中的副本节点在主节点挂掉后通过心跳机制检测到后,就会在集群内发起主节点的选举机制,自动选举一位新的主服务器。更加详细的副本机制请参考搭建高可用mongodb集群(三)—— 深入副本集内部机制
  官方推荐的副本集机器数量至少为3个,我这里就以三个节点为例介绍。
  1. 环境准备
  192.168.221.161:27017作为主节点,192.168.221.161:27018,192.168.221.161:27019作为两个副本节点
  2. 分别创建三个节点所需要的文件夹
mkdir /data/db{1..3} #存放三个节点数据文件  
touch /usr/local/mongodb/mongodb{1..3}.log #存放三个节点的日志
  3. 创建三个节点的配置文件
[root@MidApp mongodb]# cat mongodb1.conf  
dbpath=/data/db1
  
logpath=/usr/local/mongodb/logs/mongodb1.log
  
logappend=true
  
port=27017
  
fork=true
  
auth=false
  
nohttpinterface=false
  
bind_ip=192.168.221.161
  
journal=true
  
quiet=true
  
replSet=repset
[root@MidApp mongodb]# cat mongodb2.conf  
dbpath=/data/db2
  
logpath=/usr/local/mongodb/logs/mongodb2.log
  
logappend=true
  
port=27018
  
fork=true
  
auth=false
  
nohttpinterface=false
  
bind_ip=192.168.221.161
  
journal=true
  
quiet=true
  
replSet=repset
[root@MidApp mongodb]# cat mongodb3.conf  
dbpath=/data/db3
  
logpath=/usr/local/mongodb/logs/mongodb3.log
  
logappend=true
  
port=27019
  
fork=true
  
auth=false
  
nohttpinterface=false
  
bind_ip=192.168.221.161
  
journal=true
  
quiet=true
  
replSet=repset
  4. 分别启动三个节点
mongod -f mongodb1.conf  
mongod -f mongodb2.conf
  
mongod -f mongodb3.conf
  查看日志输出,没有找到replica的配置信息
2017-11-13T16:34:46.212-0800 I CONTROL  [initandlisten] options: { config: "mongodb1.conf", net: { bindIp: "192.168.221.160", http: { enabled: true }, port: 27017 }, processManagement: { fork: true }, replication: { replSet: "repset" }, security: { authorization: "disabled" }, storage: { dbPath: "/data/db1", journal: { enabled: true } }, systemLog: { destination: "file", logAppend: true, path: "/usr/local/mongodb/logs/mongodb1.log", quiet: true } }  
2017-11-13T16:34:46.214-0800 I INDEX    [initandlisten] allocating new ns file /data/db1/local.ns, filling with zeroes...
  
2017-11-13T16:34:46.216-0800 I JOURNAL  [journal writer] Journal writer thread started
  
2017-11-13T16:34:46.492-0800 I STORAGE  [FileAllocator] allocating new datafile /data/db1/local.0, filling with zeroes...
  
2017-11-13T16:34:46.492-0800 I STORAGE  [FileAllocator] creating directory /data/db1/_tmp
  
2017-11-13T16:34:46.501-0800 I STORAGE  [FileAllocator] done allocating datafile /data/db1/local.0, size: 64MB,  took 0.001 secs
  
2017-11-13T16:34:46.520-0800 I REPL     [initandlisten] Did not find local replica set configuration document at startup;  NoMatchingDocument Did not find replica set configuration document in local.system.replset
  5. 初始化副本集
  任选一个节点登录进去,可以看到show dbs是不可用,因为还没初始化副本集
[root@MidApp mongodb]# mongo 192.168.221.161  
MongoDB shell version: 3.0.6
  
connecting to: 192.168.221.161/test
  
Welcome to the MongoDB shell.
  
For interactive help, type "help".
  
For more comprehensive documentation, see
  
http://docs.mongodb.org/
  
Questions? Try the support group
  
http://groups.google.com/group/mongodb-user
  
> show dbs
  
2017-11-13T16:39:33.235-0800 E QUERY    Error: listDatabases failed:{ "note" : "from execCommand", "ok" : 0, "errmsg" : "not master" }
  
    at Error ()
  
    at Mongo.getDBs (src/mongo/shell/mongo.js:47:15)
  
    at shellHelper.show (src/mongo/shell/utils.js:630:33)
  
    at shellHelper (src/mongo/shell/utils.js:524:36)
  
    at (shellhelp2):1:1 at src/mongo/shell/mongo.js:47
  
> use admin
  
switched to db admin
  定义副本集配置变量,这里的 _id:”repset” 和上面配置文件的参数“ –replSet repset” 要保持一样
>config= {_id:"repset",members:[  
{_id:0,host:"192.168.221.161:27017"},
  
{_id:1,host:"192.168.221.161:27018"},
  
{_id:2,host:"192.168.221.161:27019"}]
  
}
  查看输出信息:
{  
"_id" : "repset",
  
"members" : [
  
{
  
"_id" : 0,
  
"host" : "192.168.221.161:27017"
  
},
  
{
  
"_id" : 1,
  
"host" : "192.168.221.161:27018"
  
},
  
{
  
"_id" : 2,
  
"host" : "192.168.221.161:27019"
  
}
  
]
  
}
  初始化副本集配置
> rs.initiate(config);  
{ "ok" : 1 }
  查看集群节点状态:
repset:OTHER> rs.status()  
{
  
"set" : "repset",
  
"date" : ISODate("2017-11-14T00:49:25.782Z"),
  
"myState" : 1,
  
"members" : [
  
{
  
"_id" : 0,
  
"name" : "192.168.221.161:27017",
  
"health" : 1,
  
"state" : 1,
  
"stateStr" : "PRIMARY",
  
"uptime" : 695,
  
"optime" : Timestamp(1510620540, 1),
  
"optimeDate" : ISODate("2017-11-14T00:49:00Z"),
  
"electionTime" : Timestamp(1510620544, 1),
  
"electionDate" : ISODate("2017-11-14T00:49:04Z"),
  
"configVersion" : 1,
  
"self" : true
  
},
  
{
  
"_id" : 1,
  
"name" : "192.168.221.161:27018",
  
"health" : 1,
  
"state" : 2,
  
"stateStr" : "SECONDARY",
  
"uptime" : 25,
  
"optime" : Timestamp(1510620540, 1),
  
"optimeDate" : ISODate("2017-11-14T00:49:00Z"),
  
"lastHeartbeat" : ISODate("2017-11-14T00:49:24.739Z"),
  
"lastHeartbeatRecv" : ISODate("2017-11-14T00:49:24.762Z"),
  
"pingMs" : 0,
  
"configVersion" : 1
  
},
  
{
  
"_id" : 2,
  
"name" : "192.168.221.161:27019",
  
"health" : 1,
  
"state" : 2,
  
"stateStr" : "SECONDARY",
  
"uptime" : 25,
  
"optime" : Timestamp(1510620540, 1),
  
"optimeDate" : ISODate("2017-11-14T00:49:00Z"),
  
"lastHeartbeat" : ISODate("2017-11-14T00:49:24.739Z"),
  
"lastHeartbeatRecv" : ISODate("2017-11-14T00:49:24.762Z"),
  
"pingMs" : 0,
  
"configVersion" : 1
  
}
  
],
  
"ok" : 1
  
}
  整个副本及已经搭建成功了!
  6. 测试副本集数据复制功能
  在主节点登录mongodb
[root@MidApp mongodb]# mongo 192.168.221.161:27017  
MongoDB shell version: 3.0.6
  
connecting to: 192.168.221.161:27017/test
  
repset:PRIMARY> use test;
  
switched to db test
  
repset:PRIMARY> db.testdb.insert({"test1":"item1"})
  
WriteResult({ "nInserted" : 1 })
  
repset:PRIMARY> exit
  
bye
  在副本节点登录查看数据:
[root@MidApp logs]# mongo 192.168.221.161:27018  
MongoDB shell version: 3.0.6
  
connecting to: 192.168.221.161:27018/test
  
repset:SECONDARY> use test
  
switched to db test
  
repset:SECONDARY> db.getMongo().setSlaveOk();#mongodb默认是从主节点读写数据的,副本节点上不允许读,需要设置副本节点可以读
  
repset:SECONDARY> db.testdb.find()
  
{ "_id" : ObjectId("5a0a3e8d40637405ab003b39"), "test1" : "item1" }
  7. 测试副本集failover功能
  手动把现在的主节点停掉,查看集群状态:
repset:SECONDARY> rs.status()  
{
  
"set" : "repset",
  
"date" : ISODate("2017-11-14T00:57:14.753Z"),
  
"myState" : 2,
  
"members" : [
  
{
  
"_id" : 0,
  
"name" : "192.168.221.161:27017",
  
"health" : 0,
  
"state" : 8,
  
"stateStr" : "(not reachable/healthy)",
  
"uptime" : 0,
  
"optime" : Timestamp(0, 0),
  
"optimeDate" : ISODate("1970-01-01T00:00:00Z"),
  
"lastHeartbeat" : ISODate("2017-11-14T00:57:13.304Z"),
  
"lastHeartbeatRecv" : ISODate("2017-11-14T00:57:09.285Z"),
  
"pingMs" : 0,
  
"lastHeartbeatMessage" : "Failed attempt to connect to 192.168.221.161:27017; couldn't connect to server 192.168.221.161:27017 (192.168.221.161), connection attempt failed",
  
"configVersion" : -1
  
},
  
{
  
"_id" : 1,
  
"name" : "192.168.221.161:27018",
  
"health" : 1,
  
"state" : 2,
  
"stateStr" : "SECONDARY",
  
"uptime" : 1167,
  
"optime" : Timestamp(1510620813, 2),
  
"optimeDate" : ISODate("2017-11-14T00:53:33Z"),
  
"infoMessage" : "could not find member to sync from",
  
"configVersion" : 1,
  
"self" : true
  
},
  
{
  
"_id" : 2,
  
"name" : "192.168.221.161:27019",
  
"health" : 1,
  
"state" : 1,
  
"stateStr" : "PRIMARY",
  
"uptime" : 17,
  
"optime" : Timestamp(1510620813, 2),
  
"optimeDate" : ISODate("2017-11-14T00:53:33Z"),
  
"lastHeartbeat" : ISODate("2017-11-14T00:57:13.317Z"),
  
"lastHeartbeatRecv" : ISODate("2017-11-14T00:57:13.330Z"),
  
"pingMs" : 0,
  
"electionTime" : Timestamp(1510621032, 1),
  
"electionDate" : ISODate("2017-11-14T00:57:12Z"),
  
"configVersion" : 1
  
}
  
],
  
"ok" : 1
  
}
  可以看到原来的主节点状态现在已经变成了不可达,192.168.221.161:27019已经变成新的主节点
  8. 再次启动原来的主节点,发现192.168.221.161:27017还是SECONDARY
repset:SECONDARY> rs.status()  
{
  
"set" : "repset",
  
"date" : ISODate("2017-11-14T17:02:13.837Z"),
  
"myState" : 2,
  
"members" : [
  
{
  
"_id" : 0,
  
"name" : "192.168.221.161:27017",
  
"health" : 1,
  
"state" : 2,
  
"stateStr" : "SECONDARY",
  
"uptime" : 5,
  
"optime" : Timestamp(1510620813, 2),
  
"optimeDate" : ISODate("2017-11-14T00:53:33Z"),
  
"lastHeartbeat" : ISODate("2017-11-14T17:02:12.642Z"),
  
"lastHeartbeatRecv" : ISODate("2017-11-14T17:02:11.902Z"),
  
"pingMs" : 0,
  
"configVersion" : 1
  
},
  
{
  
"_id" : 1,
  
"name" : "192.168.221.161:27018",
  
"health" : 1,
  
"state" : 2,
  
"stateStr" : "SECONDARY",
  
"uptime" : 59066,
  
"optime" : Timestamp(1510620813, 2),
  
"optimeDate" : ISODate("2017-11-14T00:53:33Z"),
  
"configVersion" : 1,
  
"self" : true
  
},
  
{
  
"_id" : 2,
  
"name" : "192.168.221.161:27019",
  
"health" : 1,
  
"state" : 1,
  
"stateStr" : "PRIMARY",
  
"uptime" : 57916,
  
"optime" : Timestamp(1510620813, 2),
  
"optimeDate" : ISODate("2017-11-14T00:53:33Z"),
  
"lastHeartbeat" : ISODate("2017-11-14T17:02:12.308Z"),
  
"lastHeartbeatRecv" : ISODate("2017-11-14T17:02:12.080Z"),
  
"pingMs" : 0,
  
"electionTime" : Timestamp(1510621032, 1),
  
"electionDate" : ISODate("2017-11-14T00:57:12Z"),
  
"configVersion" : 1
  
}
  
],
  
"ok" : 1
  
}
  现在,mongodb的副本集群已经完成了。
  关于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.iyunv.com/thread-626062-1-1.html 上篇帖子: 高可用mongodb集群的学习记录(二mongodb主从配置) 下篇帖子: 高可用mongodb集群的学习记录(四mongodb分片集群搭建)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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