最近一套mongodb replica sets损坏,原来的主节点损坏,从节点切换位主节点接替服务,但是业务程序没有重启,造成切过去以后,没有写入数据,不过业务不是很重要,所以影响不大,重启程序后,一个节点服务。接下来进行重建工作。
主节点起来后,加入到集群,显示加入成功,状态也正常,可是主备切换的时候始终切不回来,再看从节点,数据根本没同步,强制切换一样无效,于是把local文件全部拷贝过来,重启加入集群,效果还是一样。以下方法均失败:
1. copy local数据文件,加入集群,状态正常,日志有错误,一样数据无法同步,主从无法切换
2. copy local+相关数据库文件,加入集群,日志报错,数据文件较大,由于业务一直写入,所以copy的文件不一致,导致从节点起后,主节点变成从节点,原来的从节点自己趴下了。
实在无奈,想停业务进行copy,看看200G的数据文件,好纠结,进数据库看看了所有表大小加起来不超过15G(注意:数据文件会膨胀,但是不会自己压缩),果断通过mongodump导出相关数据库,将从库的local,损坏的数据库文件删除,iptables限制原来的业务连接,以单节点方式启动,导入数据,成功后,(注意:这里如果相关的数据库文件没有损坏,是一致的话,可以直接copy到dbpath路径下即可,数据库启动会自动探查加载),成功启动后,查看日志无异常。那么,这里关闭数据库,重新以集群的方式启动,主节点将改节点加入,数据库会慢慢同步,看了一下,同步的都是变动的数据,而且会扩展数据文件,但是不会和主节点扩展成一样的,以下可以看出数据库文件相差还是很大。
主节点:mongolog 145.8212890625GB
从节点:mongolog 33.8759765625GB
注意:copy数据文件要保证主从文件一致,所以要加只读锁,并把内存数据写入磁盘
加锁:db.runCommand({fsync:1,lock:1})
解锁:db.fsyncUnlock()
改变节点的优先级别:
主节点操作:
cfg = rs.conf()
cfg.members[0].priority = 0.5
cfg.members[1].priority = 2
cfg.members[2].priority = 2
rs.reconfig(cfg)
priority值从0~100,如果是0,则不会选举为primary节点,值越大优先级越高