在上一篇博客中介绍了MongoDB复制和副本集的概念,这次将我查阅资料在单机下搭建的副本集展现给大家。
下面是在单机上搭建一个三个节点的副本集。一个主节点(primary),两个从节点(secondary),其中一个是仲裁者(arbiter)。
环境:Ubuntu14.04,MongoDB3.2
sudo mkdir /data
sudo mkdir /data/node1
sudo mkdir /data/node2
sudo mkdir /data/arbiter
运行三个节点,其中,replica是副本集的名称;端口号分别为10001,10002,10003,而10001为主节点的端口。
sudo /usr/local/mongodb/bin/mongod --replSet replica --dbpath /data/node1/ --port 10001 --oplogSize 1024
sudo /usr/local/mongodb/bin/mongod --replSet replica --dbpath /data/node2/ --port 10002 --oplogSize 1024
sudo /usr/local/mongodb/bin/mongod --replSet replica --dbpath /data/arbiter/ --port 10003 --oplogSize 1024
另外打开一个shell,进入主节点。
sudo /usr/local/mongodb/bin/mongo localhost:10001
初始化副本集需要配置表并逐步添加节点的数据信息,_id和副本集启动的共享名称一致。
config = {_id: "replica", members: []}
config.members.push({_id: 0, host: "localhost:10001"})
config.members.push({_id: 1, host: "localhost:10002"})
config.members.push({_id: 2, host: "localhost:10003", arbiterOnly: true})
初始化副本集
rs.initiate(config)
执行命令确认配置,可以看到10001的端口实例ismaster为true,secondary为false,为主节点。hosts有两个实例,arbiters有一个实例。
rs.isMaster()
输入命令查看副本集的状态信息。
rs.status()
查看当前副本集的配置表
rs.conf()
插入测试数据:
for(i=1;i<=10;i++) {db.users.insert({"username":"user"+i})}
进入从节点10002,查看集合信息,显示查询失败,这是为了避免从节点读取到过期的数据。
sudo /usr/local/mongodb/bin/mongo localhost:10002
show collections
设置标识并查询集合信息。
rs.slaveOk()
show collections
查询测试数据
<span style="font-size:12px;">db.users.find()</span>
在从节点插入数据,写入错误,不是主节点。
db.users.insert({username: "user11"})
进入端口10003,可以看到为仲裁节点。
sudo/usr/local/mongodb/bin/mongo localhost:10003
replica:ARBITER>
关掉10001端口的mongod实例,shell显示10001处于down状态,进入之前的从节点10002,发现它变成了主节点,提示符为
“replica:PRIMARY>”,再将10001上线,它有恢复成主节点。这就是MongoDB副本集的故障转移。
到这里,MongoDB单机搭建副本集就结束了,关于在多台机器上部署的例子会在以后的文章中给大家带来。