您当前的位置: 首页 > 学无止境 > 心得笔记 网站首页心得笔记
mongodb-replication复制集
发布时间:2017-11-22 18:46:57编辑:雪饮阅读()
复制集:多个实例互为副本。
这里以3台实例来实践。
primary:主
secondary:副
第0步:创建目录
mkdir -p /home/m17 /home/m18 /home/m19 /home/mlog
第1步:启动3个实例且声明其所属相同的复制集
设置每个实例所属复制集都是rs2
./bin/mongod --dbpath /home/m17 --logpath /home/mlog/m17.log --fork --port 27017 --replSet rs2 --smallfiles
./bin/mongod --dbpath /home/m18 --logpath /home/mlog/m18.log --fork --port 27018 --replSet rs2 --smallfiles
./bin/mongod --dbpath /home/m19 --logpath /home/mlog/m19.log --fork --port 27019 --replSet rs2 --smallfiles
第2步:配置复制集
随便连接一个实例use admin数据库执行声明变量语句如:
var rsconf={
_id:'rs2',
members:[
{
_id:0,
host:'192.168.101.108:27017'
},
{
_id:1,
host:'192.168.101.108:27018'
},
{
_id:2,
host:'192.168.101.108:27019'
},
]
}
_id为0的将作为默认的primary实例
该变量中配置复制集id和该复制集的成员信息
确保变量声明无误:
printjson(rsconf)
第3步:初始化复制集
初始化成功后会提示将在分钟内就上线
rs.initiate(rsconf)
如下命令可查看复制集状态信息:
rs.status()
该命令的结果随着时间而改变,等完全上线后。三个实例的statestr字段应该分别为
"stateStr" : "PRIMARY",
"stateStr" : "SECONDARY",
"stateStr" : "SECONDARY",
登录一个非主实例则会显示如:
至此复制集搭建完成。
复制集管理:
个人认为节点的增删改后应该都需要重新配置下
登录到主实例中进行复制集管理
重新配置
rs.reconfig(rsconf)
删除复制集节点
rs.remove('192.168.101.108:27019')
这里出现这个异常可无视
添加复制集节点:
rs.add('192.168.101.108:27019')
如果上面的删除复制集节点还没有完全生效前又执行添加节点并且删除和添加的这两个节点是相同的则有可能会出现报错提示(个人观点)
检查复制集
第一步:检查数据同步情况
在主副实例中分别通过show dbs;命令查看数据库数量以及每个数据库的存储占用大小是否一致。
主实例中建立新的库并在库中建立一个表然后在该表中添加一些测试数据
在副实例中查看刚才主实例中所建立的库、表、数据
可能会出现该错误
是因为slave默认不许读也不许写,只和主实例保持通信,执行如下命令
rs.slaveOk()
然后另外一个副实例遇到该错误也同样处理,最后确保两个副实例的数据和主实例的数据都是一致的就ok。
第二步:主实例宕机测试
关闭主实例,关闭复制集中的节点,只能在该节点中的admin库中执行关闭命令
db.shutdownServer()
然后随便在某一个副实例中查看复制集的状态信息:
发现健康状况为0,数据同步也失败的
稍微过些时间再次观察复制集的状况信息,会发现复制集中已经有副实例字段做为主实例,承担了之前宕机掉的主实例的职务。
此时如果当前这个实例不是主实例,则无法添加数据
检查当前实例是否是主实例
db.isMaster()
接下来换到新的主实例中添加数据后再次测试下整个复制集中的数据同步情况,如果无误则复制集宕机测试ok。
编写一键搭建复制集脚本:
start.sh
给脚本添加执行权限
chmod a+x start.sh
启动脚本
sh start.sh
番外:
添加节点与删除节点的两种方法
1、用新的json数组(相比原来配置变量中的json数组新增了或删除了某个节点段)来赋值之前的配置变量,并执行重新配置函数rs.reconfig(rsconf)。
2、直接add或remove方法来添加或删除,这种形式不用每次执行重新配置函数。
关键字词:mongodb,replication,复制集