启动mongo

通过配置文件方式启动mongodb实例。

[root@server1 bin]# mongod --config /usr/local/mongodb/conf/mongod.conf
about to fork child process, waiting until server is ready for connections.
forked process: 2162
child process started successfully, parent exiting

mongod.conf文件内容:

[root@server1 conf]# vim mongod.conf
#端口号
port=28028
#开启验证
#auth=true
#数据文件存储位置
dbpath=/usr/local/mongodb-linux-x86_64-3.0.7/data/db/
#日志文件存储位置,需要手动创建文件夹
logpath=/usr/local/mongodb-linux-x86_64-3.0.7/log/mongodb.log
#以追加方式写入日志,默认为覆盖写入
logappend=true
#以守护进程方式启动
fork=true
#开启http请求查询端口为port+1000
#httpinterface=true
#复制集名称,相同复制集名称应该相同
replSet=MONGODB

连接mongodb

确认启动后,使用$ mongo连接mongodb shell,值得注意的是要以之前启动mongod实例的端口连接mongodb,没有指定数据库默认连接test数据库。

[root@server1 bin]# ./mongo --port 28028
MongoDB shell version: 3.0.7
connecting to: 127.0.0.1:28028/test

初次配置replicaSet

配置本机DNS,编辑/etc/hosts文件,需要在每台服务器配置对应ip映射提供服务器之间相互访问,配置完成后重启服务器。

[root@server1 /]# vim /etc/hosts
本机内网ip server1
其它mongod实例部署服务器外网ip server2
[root@server1 /] shutdown -r now

[root@server2 /]# vim /etc/hosts
本机内网ip server2
其它mongod实例部署服务器外网ip server1
[root@server2 /] shutdown -r now

查看复制集状态

在mongodb shell里使用$ rs.status()命令查看当前mongodb复制集状态,如下状态为未配置replicaSet。

> rs.status()
{
	"info" : "run rs.initiate(...) if not yet done for the set",
	"ok" : 0,
	"errmsg" : "no replset config has been received",
	"code" : 94
}

初始化replicaSet

直接在mongodb shell里使用$ rs.initiate()命令初始化。注意:$ rs.initiate()方法是可以直接指定所有replicaSet配置参数的,这里没有直接指定,且只能在一个mongod实例中使用$ rs.initiate()命令。

> rs.initiate()
{
	"info2" : "no configuration explicitly specified -- making one",
	"me" : "server1:28028",
	"ok" : 1
}
MONGODB:OTHER>db(这里随便输入一条mongo命令刷新一下)
MONGODB:PRIMARY>rs.status()
{
	"set" : "hongwei",
	"date" : ISODate("2015-12-11T09:18:50.688Z"),
	"myState" : 1,
	"members" : [
		{
			"_id" : 0,
			"name" : "server1:28028",
			"health" : 1,
			"state" : 1,
			"stateStr" : "PRIMARY",
			"uptime" : 537,
			"optime" : Timestamp(1449825284, 1),
			"optimeDate" : ISODate("2015-12-11T09:14:44Z"),
			"electionTime" : Timestamp(1449825284, 2),
			"electionDate" : ISODate("2015-12-11T09:14:44Z"),
			"configVersion" : 1,
			"self" : true
		}
	],
	"ok" : 1
}

加载结点

在上述完成DNS解析,同时开启要添加的mongod实例,然后在primary结点上使用$ rs.add()命令添加新的结点,配置完成后登陆新结点的mongod实例,也能查看当前replicaSet状态的改变。

MONGODB:PRIMARY> rs.add("server2:28028")
{ "ok" : 1 }

删除结点

注意:无论增加还是删除结点只能在Primary结点操作,因为mongodb具有高度的数据一致性,从根本杜绝对从结点进行写操作(区别于传统的mast-slave结构)。

MONGODB:PRIMARY> rs.remove("server2:28028")
{ "ok" : 1 }

查看复制集配置

MONGODB:SECONDARY> rs.config()
{
	"_id" : "hongwei",
	"version" : 2,
	"members" : [
		{
			"_id" : 0,
			"host" : "server1:28028",
			"arbiterOnly" : false,
			"buildIndexes" : true,
			"hidden" : false,
			"priority" : 1,
			"tags" : {
				
			},
			"slaveDelay" : 0,
			"votes" : 1
		},
		{
			"_id" : 1,
			"host" : "server2:28028",
			"arbiterOnly" : false,
			"buildIndexes" : true,
			"hidden" : false,
			"priority" : 1,
			"tags" : {
				
			},
			"slaveDelay" : 0,
			"votes" : 1
		}
	],
	"settings" : {
		"chainingAllowed" : true,
		"heartbeatTimeoutSecs" : 10,
		"getLastErrorModes" : {
			
		},
		"getLastErrorDefaults" : {
			"w" : 1,
			"wtimeout" : 0
		}
	}
}

删除复制集

去掉mongod.conf配置文件中replSet属性,启动mongod,并连接到mongodb shell,对其它server执行相同操作。

> use local
> db.system.replset.remove({})
WriteResult({ "nRemoved" : 1 })

复制集配置参数

priority 0 | 至少为1,默认为1,为0时表示该节点不能转换为主节点。
hidden false | true ,默认为false,不会被驱动所发现,driver通过使用$ rs.isMaster()命令查找可用节点。
slaveDelay second,默认单位为秒,设置延迟节点。
buildIndexes true | false,默认为true,是否复制主节点索引。
votes: 0 | 1,默认为1,设置是否具有投票功能。
注意:隐藏节点、延迟节点、无索引节点配置前提是priority为0。