由于历史原因,生产环境的几台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的连接方式,从原先的单机方式改为复制集方式 【非常重要】