专栏首页二狗的DBA之路单机mongodb转为复制集的操作步骤

单机mongodb转为复制集的操作步骤

由于历史原因,生产环境的几台mongodb都是单机在运行,考虑到宕机等不确定的风险,需要给他们做一下高可用。mongodb原生的复制集方案非常简单好用。

下面,就是相关的测试环境实验笔记。。。。

单机mongodb转为复制集的操作步骤:

MongoDB版本: 3.2.16

实验环境中,3个mongodb实例运行在同一个虚拟机上。另外,从节约资源考虑,我们最终搭建完的结构是: 1主、1备、1仲裁节点

当前正在运行的单机节点:  192.168.10.10:27117

配置如下:

systemLog:
  destination: file
  quiet: true
  path: mongodb_27117.log
  logAppend: true
  logRotate: reopen
  
processManagement:
  fork: true
  pidFilePath: mongod_27117.pid
  
net:
  bindIp: 0.0.0.0
  port: 27117
  
setParameter:
  cursorTimeoutMillis: 60000
  
operationProfiling:
    slowOpThresholdMs: 500
    
storage:
  dbPath: /opt/mongodb/27117/
  directoryPerDB: true
  engine: wiredTiger
    journal:
      enabled: true

打算新增的2个节点:

192.168.10.10:27118     standby节点

192.168.10.10:27119     仲裁节点

下面开始操作:

1、业务低峰期,申请操作窗口时间。然后关闭当前的 27117 节点 ,并去修改配置如下:

> use admin
> db.shutdownServer()

修改 27117 的配置文件,在最后加上3行内容,设置10G的oplog大小,基本上够用了:

replication:

  oplogSizeMB: 10240

  replSetName: test01

2、再次启动 27117 进程

./mongod -f 27117.conf

3、初始化集群配置

./mongo --port 27117

> config = { _id:"test01", members:[
 {_id:0,host:"192.168.10.10:27117"}
 ]
}

> rs.initiate(config)

test01:PRIMARY> rs.status()
{
"set" : "test01",
"date" : ISODate("2019-06-20T14:07:03.057Z"),
"myState" : 1,
"term" : NumberLong(1),
"heartbeatIntervalMillis" : NumberLong(2000),
"members" : [
{
"_id" : 0,
"name" : "192.168.10.10:27117",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 58,
"optime" : {
"ts" : Timestamp(1561039618, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2019-06-20T14:06:58Z"),
"infoMessage" : "could not find member to sync from",
"electionTime" : Timestamp(1561039617, 2),
"electionDate" : ISODate("2019-06-20T14:06:57Z"),
"configVersion" : 1,
"self" : true
}
],
"ok" : 1
}

4、 启动 27118 27119 实例

编辑 27118 和 27119 的配置文件,大致如下:

systemLog:
  destination: file
  quiet: true
  path: mongodb_27119.log
  logAppend: true
  logRotate: reopen
  
processManagement:
  fork: true
  pidFilePath: mongod_27119.pid
  
net:
  bindIp: 0.0.0.0
  port: 27119
  
setParameter:
  cursorTimeoutMillis: 60000
  
storage:
  dbPath: /opt/mongodb/27119/
  directoryPerDB: true
  engine: wiredTiger
    journal:
      enabled: true
  
operationProfiling:
  slowOpThresholdMs: 500
  
replication:
  oplogSizeMB: 10240
  replSetName: test01

启动进程:

./mongod -f 27118.conf

./mongod -f 27119.conf

5、登录到 27117 实例里,将 27118 和 27119 加到集群中去

./mongo --port 27117

> rs.add("192.168.10.10:27118")
> rs.addArb("192.168.10.10:27119")

6、查看集群状态

> rs.status()

由于有数据正在同步过程中,这里可能看到新加的节点是startup或者其它的状态,稍等即可。

【注意:新加的节点在做全量同步的时候,大概率会造成主库内存占用过大,因此不要把主库的内存设得过大,防止同步数据的时候把主库拖垮了】

> rs.conf()

7、测试故障切换【可选】

> use admin
> rs.stepDown()

观察需要多久自动选出新的主节点,没问题后,再将主库切回到原先的状态

8、添加相关的监控

可以采用zabbix 或者 mongodb_exporter 来采集数据

9、联系业务方修改业务上mongodb的连接方式,从原先的单机方式改为复制集方式 【非常重要】

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • es数据的冷热分离实验

    PS:这里就没分 hot warm cold 这种三级存储,我们一般使用 hot warm 2种即可。

    二狗不要跑
  • 【案例】redis-server 大量key过期不释放空间的

    使用 rdb工具 (git地址:https://github.com/sripathikrishnan/redis-rdb-tools) 分析下rdb文件后,发...

    二狗不要跑
  • PostgreSQL drop table 空间不释放的问题解决

    先上结论: 有连接占用这个表(会话没提交),kill掉相关连接即可释放出磁盘空间。

    二狗不要跑
  • Python学习笔记(一)

    张树臣
  • Cobalt strike在内网渗透中的使用

    上一篇文章中,介绍了Cobalt strike 发送钓鱼邮件的利用,但是Cobalt strike不仅仅是用在钓鱼邮件,同时也是一款非常强大的内网渗透利器,下面...

    FB客服
  • 【5min+】更好的选项实践。.Net Core中的IOptions

    【五分钟的dotnet】是一个利用您的碎片化时间来学习和丰富.net知识的博文系列。它所包含了.net体系中可能会涉及到的方方面面,比如C#的小细节,Aspne...

    句幽
  • Redis学习系列四Hash(字典)

    Redis中的Hash字典相当于C#中的Hashtable,是一种无序字典,内存存储了很对的键值对,实现上和Hashtable一样,都是"数组+链表"二维结构,...

    郑小超.
  • 初入软件「江湖」的萌新需要了解的五个经验教训

    大概四年前我获得了计算机科学学位并开启了软件工程师的职业生涯。我将在这篇文章中分享一些我这一路过来学习到的经验教训。先归纳一下:

    机器之心
  • 零基础读懂分布式系统

    而不理解区块链的麻烦,在于会陷入到对「去中心化」、 「无需许可」等等概念以及「TPS」、「安全」等等问题失去语境的讨论中去。这不仅无助于我们去准确地分析和判断一...

    奋斗蒙
  • 最全的12个LOGO设计风格总结

    !今天要给大家分享的是Behance上的 Logo Design Trends 一文。汇总了时下流行的Logo设计形式。适合收藏以备不时之需!

    宇相

扫码关注云+社区

领取腾讯云代金券