单节点部署
此部分的前提是你已经下载并且安装好了MongoDB,并能够正常运行。单节点上运行一个副本集,只能作为开发和测试使用,不能作为生产环境。
下面我们建立一个以rs0为名称的副本集。其中配置环境为ubuntu 12.10和MongoDB 2.4。
步骤:
1. 用下面的命令建立三个文件夹:
mkdir -p /srv/mongodb/rs0-0 /srv/mongodb/rs0-1 /srv/mongodb/rs0-2
2. 启动三个mongod进程,注意端口号不能相同,且未被占用。你可以使用三个终端来连接同一台Linux,然后分别在每个终端运行一条命令,一次来模拟使用的是三台服务器。
以下是启动三个mongod进程的命令:
mongod --port 27017 --dbpath /srv/mongodb/rs0-0 --replSet rs0 --smallfiles --oplogSize 128 --logpath /var/log/mongod1.log --fork
mongod --port 27018 --dbpath /srv/mongodb/rs0-1 --replSet rs0 --smallfiles --oplogSize 128--logpath /var/log/mongod2.log --fork
mongod --port 27019 --dbpath /srv/mongodb/rs0-2 --replSet rs0 --smallfiles --oplogSize 128--logpath /var/log/mongod3.log --fork
replSet参数后面跟着的是副本集名称;
smallfiles和oplogSize是为了降低磁盘的占用率,在这里仅用于测试,生产环境并不推荐;
logpath参数指定的是日志保存的路径;
--fork是指将这个进程作为后台进程运行。
3. 现在启动一个mongo进程,连接上刚才启动的那三个进程的其中一个:
mongo --port 27017
4. 建立一个副本集的配置对象,用于初始化副本集。对象内容如下所示:
rsconf = {
_id: "rs0",
members: [
{
_id: 0,
host: "<hostname>:27017"
}
]
}
其中hostname是指你的服务器名称,或者ip地址。因为是本地,所以可以用localhost。
5. 用rs.initiate()这个方法来初始化副本集:
rs.initiate( rsconf )
6. 运行上条命令后会提示稍等一段时间才能够看到结果。现在用rs.conf()查看副本集群信息:
rs.conf()
你会发现只有一个节点成员,这就是你当前操作的节点。
7. 现在再用rs.add()命令把剩下的两个mongod进程添加到副本集中:
rs.add("<hostname>:27018")
rs.add("<hostname>:27019")
注意要将hostname替换成你的服务器名称。稍等片刻。
然后用rs.status()查看当前的副本集群信息,会发现现在副本集成员有三个了。至此单节点副本集就部署完成了。
你可以尝试先插入一些测试数据,然后关掉其中一个mongod进程,模拟节点故障。然后用mongo连接到新的主节点,再尝试往数据库插入或读取信息,看是否能正常读写。多节点部署
多节点的生产环境与单节点的测试开发环境部署相差不大,只是mongod运行在不同的服务器上,但需确保在每个节点能够用名称解析。为了防止每次运行mongod的时候要添加繁多的参数,可以将参数保存到一个文件中,启动时用--config指定配置文件即可。
步骤
1. 首先指定三台服务器的名字,并将其加入到hostname文件中。其中服务器的IP地址和名称可以根据自己的实际环境进行修改。
服务器1:mdb1,10.6.12.79
服务器2:mdb2,10.6.12.80
服务器3:mdb3,10.6.12.81
服务器4:mdb4,10.6.12.82
配置好以后,用ping命令来相互测试是否能够解析服务器名称。
2. 编辑测试文件,文件名自定,这里命名为config.conf。内容如下:
port = 27017
#需要监听的客户端IP地址,即只接受来自这部分的IP连接,提高了安全性。(默认为接受所有的IP请求)
bind_ip = 10.6.12.79
dbpath = /srv/mongodb
fork = true
replSet = rs0
3. 将配置文件用scp命令复制到其他的两台服务器,并使用如下命令启动mongod进程:
mongod --config /src/config.conf
其中/src/config.conf为配置文件的路径。
4. 用mongo连接到其中一台的mongod进程,并用rs.initiate()来初始化副本集:
> rs.initiate()
{
"info2" : "no configuration explicitly specified -- making one",
"me" : "mdb2:27017",
"info" : "Config now saved locally. Should come online in about a minute.",
"ok" : 1
}
5. 用rs.conf()查看当前状况:
> rs.conf()
{
"_id" : "rs0",
"version" : 1,
"members" : [
{
"_id" : 0,
"host" : "mdb2:27017"
}
]
}
6. 用rs.add()来添加其他的三个节点到副本集中:
> rs.add("mdb1:27017")
{ "ok" : 1 }
rs0:PRIMARY> rs.add("mdb3:27017")
{ "ok" : 1 }
同时再添加一台仲裁节点:
rs0:PRIMARY> rs.addArb("mdb4:27017")
{ "ok" : 1 }
从上面的内容中可以看到,开始的时候没有出现rs0:PRIMARY,当添加了一个成员后这个节点就成为主节点了,这其实也说明你添加的节点已经成功加入到了这个副本集中。
至此集群节点部署完成。但在实际应用中,因为需要在不同的服务器上来回操作,所以建议使用脚本来自动启动部署过程。