加入收藏 | 设为首页 | 会员中心 | 我要投稿 聊城站长网 (https://www.0635zz.com/)- 智能语音交互、行业智能、AI应用、云计算、5G!
当前位置: 首页 > 服务器 > 系统 > 正文

MongoDB复制集配置流程

发布时间:2023-09-26 15:14:24 所属栏目:系统 来源:
导读:MongoDB复制集配置步骤

1. 配置三个节点的配置文件(/etc/28001.conf)

28002.conf

#bind_ip=192.168.20.144

port=28001

logpath=/data/db/mongodb_log/28001.log

logappend=true
MongoDB复制集配置步骤
 
1.       配置三个节点的配置文件(/etc/28001.conf)
 
28002.conf
 
#bind_ip=192.168.20.144
 
port=28001
 
logpath=/data/db/mongodb_log/28001.log
 
logappend=true
 
pidfilepath=/data/db/mongodb_data28001/28001.pid
 
oplogSize=500
 
dbpath=/data/db/mongodb_data28001
 
replSet=imooc
 
fork=true
 
28002.conf
 
#bind_ip=192.168.20.144
 
port=28002
 
logpath=/data/db/mongodb_log/28002.log
 
logappend=true
 
pidfilepath=/data/db/mongodb_data28002/28002.pid
 
oplogSize=500
 
dbpath=/data/db/28002
 
replSet=imooc
 
fork=true
 
28003.conf
 
#bind_ip=192.168.20.144
 
port=28003
 
logpath=/data/db/mongodb_log/28003.log
 
logappend=true
 
pidfilepath=/data/db/mongodb_data28003/28003.pid
 
oplogSize=500
 
dbpath=/data/db/28003
 
replSet=imooc
 
fork=true
 
2.       使用配置文件启动mongod服务
 
/usr/local/mongodb/bin/mongod -f /usr/local/mongodb/conf/28001.conf
 
/usr/local/mongodb/bin/mongod -f /usr/local/mongodb/conf/28002.conf
 
/usr/local/mongodb/bin/mongod -f /usr/local/mongodb/conf/28003.conf
 
3.       登录到运行的monogd机器
 
/usr/local/mongodb/bin/mongo 127.0.0.1:28001/admin
 
4.       配置复制集节点配置文件
 
config={_id : "imooc",members : [{_id : 1, host : "127.0.0.1:28001"},{_id : 2, host : "127.0.0.1:28002"},{_id : 3, host : "127.0.0.1:28003"}]}
 
5.       查看节点成员
 
config.members
 
6.       设置3节点为仲裁节点
 
config.members[3] ={"_id":3,"host":"127.0.0.1:28003",arbiterOnly:true}
 
或在主节点中输入:
 
rs.addArb("127.0.0.1:28003")
 
7.       初始化副本集
 
rs.initiate(config)  (如果初始化一直报已经初始化过,需要将数据备份后,重新创建主节点。)
 
8.       重新加载config参数(每次修改config之后都要reconfig一次,但reconfig会使复制集的连接短暂断开,要避免在生产环境中随便执行,需要维护时间窗口才可执行)
 
rs.reconfig(cnf,{force:true})
 
(运行此命令必须在primary节点,如果不是显示primary,可能是other,则需要加上force的参数)
 
9.       查看复制集状态
 
rs.status()
 
10. mongodb的前端引用程序是通过isMaster命令来区分主从节点的(隐藏节点可以通过rs.status()看到其信息,而rs.isMaster是没法看到的)
 
rs.isMaster()
 
维护:
 
添加副本,在登录到主节点下输入:
 
rs.add("ip:port")
 
删除副本
 
rs.remove("ip:port")
 
(前提是这个ip:port必须是使用了同一个relpSet名称的mongodb实例即可)
 
导入原有数据后,导入命令
 
mongorestore -h 127.0.0.1:12345 -d syt --directoryperdb /mnt/mongo_data/
 
其中/mnt/mongo_data为要导入的json文件,后发现从节点都变成recovering状态。
 
问题原因
 
出现这个问题的原因主要是secondary节点同步oplog的速度追不上primary几点的速度,造成一直处于recovering状态。
 
解决办法:
 
    首先停掉从节点mongod进程,然后删除目录(rs)下面所有的数据,然后重启mongod进程,这里有一点需要注意,如果有arbiter的mongod进程也需要停掉,启动的时候,先启动replSet的mongod进程,再启动arbiter的mongod进程,启动之后,会自动由recovering状态切换为startup2状态,最后切换为secondary状态
 
第二种办法就是先将recovering节点下的data目录删除,再将primary里的data都拷贝到该节点下,再重启就好了!操作前,务必要停止所有的mongodb数据库!
 
可以看到,在从节点使用show tables 报错,显示“此节点非主节点,从节点的ok状态是失败的”。如果需要在从节点读取数据的话,需要将slave做设置:
 
rs.slaveOk(true)
 
再执行show tables就可以成功了。
 
模拟宕机:
 
在主节点执行:db.shutdownServer()
 
出现报错"errmsg" : "shutdown must run from localhost when running db without auth",
 
此报错说明在没有开启验证的情况下需要到localhost下执行,如果启动配置文件里指定了bin_ip,则只能通过bin_ip去执行,这里我们没法登录localhost执行,只能通过kill的方式。
 
通过查看ps –ef|grep ****查找到对应进程号
 
使用kill -2 **** (不到万不得已不建议使用kill来关闭进程实例,即使是要使用,也要用较温和的方式kill -2 {SIGINT} 的方式来关闭, kill -2 会把实例中所有队列的进程都关闭后再关闭实例)
 
关闭之后测试:
 
查看原先主节点,敲enter已经出现报错
 
查看原先从节点,在两个从节点中敲enter,可发现有一个节点已经变为PRIMARY
 
通过show log rs可以看到节点的切换情况。
 
MongoDB Enterprise imooc:PRIMARY> show log rs
 
2017-10-30T01:53:15.617-0700 I REPL     [replExecDBWorker-0] New replica set config in use: { _id: "imooc", version: 1, protocolVersion: 1, members: [ { _id: 1, host: "127.0.0.1:28001", arbiterOnly: false, buildIndexes: true, hidden: false, priority: 1.0, tags: {}, slaveDelay: 0, votes: 1 }, { _id: 2, host: "127.0.0.1:28002", arbiterOnly: false, buildIndexes: true, hidden: false, priority: 1.0, tags: {}, slaveDelay: 0, votes: 1 }, { _id: 3, host: "127.0.0.1:28003", arbiterOnly: false, buildIndexes: true, h
 
2017-10-30T01:53:15.617-0700 I REPL     [replExecDBWorker-0] transition to STARTUP2
 
2017-10-30T01:53:15.618-0700 I REPL     [rsSync] transition to RECOVERING
 
2017-10-30T01:53:15.619-0700 I REPL     [rsSync] transition to SECONDARY
 
2017-10-30T01:53:15.621-0700 I REPL     [ReplicationExecutor] Member 127.0.0.1:28001 is now in state SECONDARY
 
2017-10-30T01:53:20.624-0700 I REPL     [ReplicationExecutor] Member 127.0.0.1:28003 is now in state SECONDARY
 
2017-10-30T01:53:25.625-0700 I REPL     [ReplicationExecutor] Member 127.0.0.1:28001 is now in state PRIMARY
 
2017-10-30T02:13:53.329-0700 I REPL     [rsBackgroundSync] could not find member to sync from
 
2017-10-30T02:14:01.816-0700 I REPL     [ReplicationExecutor] transition to PRIMARY
 
2017-10-30T02:14:03.033-0700 I REPL     [rsSync] transition to primary complete; database writes are now permitted
 
(待验证)
 
如果出现有一个节点找不到oplog(通过日志看出),可通过将主节点的oplog 复制到从节点上
 
1.       备份出来:
 
./mongodump --port 28011 -d local -c oplog.rs  -o  /opt/backup/0706local/
 
2.       恢复到另外一台单节点MONGODB服务器
 
./mongorestore --port 28011 -d temp_local -c shard1_oplog  --dir /opt/backup/0706local/local/oplog.rs.bson
 
如果恢复时出现报错Failed: error connecting to db server: no reachable servers
 
…………….
 
…………..
 
如果出现有一个节点有问题,删除monogd.lock, 在启动时加上—repair,再启动还是启动不了,而且只是作为一个不存储数据的仲裁节点的话,最简单粗暴的方法是通过将节点下的data数据都删除,然后再重启,则可启动成功。
 
 

(编辑:聊城站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章