配置mongodb复制集时遇见的坑
最近在做mangodb复制集的时候,遇到了很多问题,为了让以后的亲在遇到类似的问题时可以找到资料以供参考,下面我就分享一下我遇到的问题已经解决方案。
我的是在一台centos7的虚拟机上配置mongodb复制集的,包括一个主节点(mongo27017)、两个从节点(mongo27018/mongo27019)、一个投票节点(mongo27020)。四个mongodb数据库都在home文件夹下的DataBase文件夹内。27017、27018这些数值表示该数据库的端口。
首先,我们要在mongodb的配置文件后缀(.config)中设置一些参数(我的配置文件在bin目录下),以mongo27018为例
port=27018
logpath=/home/wopelo/DataBase/mongo27018/data/log/mongodb.log
dbpath=/home/wopelo/DataBase/mongo27018/data/db
fork=true //后台启动
logappend=true //以添加而不是覆盖的方式书写日志,
oplogSize=1024 //单位mb,同一复制集下该参数值须保持一致。当某个从节点从灾难中恢复回来时,如果由于从节点无法工作而没有写入从节点的数据大于该值时,从节点重新复制主节点的所有数据。默认值为磁盘储存空间的5%
replSet=iCopy //复制集名称
最关键的一个参数是replSet,它表示复制集的名称,在同一个复制集下的数据库,其配置文件里的replSet的值必须一致。
下面,打开并进入到mongo27017,切换到admin数据库,编写config配置文件
config={
_id:"iCopy",
members:[
{_id:0,host:"127.0.0.1:27017"},
{_id:1,host:"127.0.0.1:27018"},
{_id:2,host:"127.0.0.1:27019",arbiterOnly:true}
]
}
arbiterOnly设置投票节点。这里只写了三个成员,而且投票节点是mongo27019,我们将在下面利用添加、删除、修改和重新初始化这几个操作把mongo27019设置为从节点,mongo27020设置为投票节点。
现在初始化复制集(出现ok:1表示成功)
rs.initiate(config)
接下来可能会出现这样的问题
命令行提示投票节点中已有数据无法初始化,我不知道从节点会不会也发生这种问题,但我想这应该是因为mongodb为了保持数据一致性,数据只能写到主节点中,从节点从主节点中获取数据,投票节点不保存数据,如果非主节点中原本就有数据,那么主从节点的数据就不一样了。虽然我的mongo27019真的没有数据,但既然出现了问题,那就解决它。解决方法是先在mongo27019的配置文件中把replSet删掉,重启数据库之后在其每一个数据库中使用
db.dropDatabase()
注意是所有数据库,包括admin与local。如果不在配置文件中删除replSet的话,很可能会删除失败。在我们使用show dbs返回为空的时候就证明所有数据库都已经被删掉了,然后我们再把replSet添加回去,重新启动mongo27019,再初始化一次就ok了。初始化之后mongo27017为主节点、27018为从节点、27019为投票节点。
之后,我们要添加mongo20720并把它设置为投票节点。这里按道理我们可以直接修改config配置,把mongo27019设置为从节点,再添加一个新节点
config.members[2]={_id:2,host:"127.0.0.1:27019"}
config.members[3]={_id:3,host:"127.0.0.1:27020",arbiterOnly:true}
然后再重新初始化(如果出现ok:1就成功)
rs.reconfig(config)
虽然我们输入config查看配置文件时,显示的和我们预期的一样,但在重新初始化时会报一个错
我们就采取一个比较保守的方法,先把mongo27019与mongo27020从config中删除掉,再重新添加
rs.remove("127.0.0.1:27019")
rs.remove("127.0.0.1:27020")
rs.add("127.0.0.1:27019")
rs.add("127.0.0.1:27020")
config.members[3]={_id:3,host:"127.0.0.1:27020",arbiterOnly:true}
rs.reconfig(config)
之后我们再进入四个数据库中(已经进入的话按enter),发现主从节点以及投票节点命令行提示已经变成
使用
rs.status()
查看状态,在members一项中我们可以看到目前复制集的所有节点及其属性。比如在这里我们可以看到mongo27020确实是投票节点
我们随便在主节点中新建一个数据库,再随便插入一些数据,然后到从节点中去查看,如果出现下面的情况
这是因为mongodb为了保证数据一致性,默认禁止在从节点中进行绝大部分操作,我们通过
rs.slaveOk(true)
处理之后就可以查看从节点的数据了
而在投票节点中,虽然可以看到新建的数据库,但我们使用find查看里面的数据时,会出现
意思是这个节点不是主节点也不是从节点。作为投票节点的节点,不存储数据。
另外还有一点,上面的步骤都是通过config=…….类似的形式修改配置文件,这只适合第一次编写config的情况,也就是说你第一次在mongodb shell中配置config文件。但你退出shell之后,再次进入shell就不能用config=…….类似的形式修改配置文件,而且此时直接输入config 是会报错的,现在就只能通过rs.config()来查看配置文件。如果需要修改配置文件的话,则需要将rs.config()赋予一个变量,修改变量,再rs.reconfig(变量)的方式修改配置文件。
(这里报了一个错,意思是要设置复制延迟必须满足priority为0,大家可以自行百度slaveDelay和priority的含义)
现在,我们就完成了复制集的搭建,也看到和避开了一些坑。谢谢大家,我的表演结束。
上一篇: MongoDb 入门教程
下一篇: MongoDB的安装及基本操作