响水凹

欢迎来到 Guang-Wen Duan (Dennis Duan) 的个人 Wiki

用户工具

站点工具


computer:env:mongodb

MongoDB数据库集群的模拟

MongoDB是一个开源的NoSQL数据库,本文讲述用几台虚拟机来搭建一个MongoDB集群环境的过程。

MongoDB官方网站有详细的文档说明,下面将参考官方文档先配置一个单机数据库,然后配置复制集(Replica Sets),最后配置分片集群(Sharded Clusters)。

操作系统基于64位CentOS 6。

软件安装

安装MongoDB数据库软件,可通过手工方式下载软件包安装,也可基于特定发行版的包管理工具安装。这里选择后者,以便与操作系统更好的集成。

在CentOS下的安装方法可参考:Install MongoDB on Red Hat Enterprise, CentOS, or Fedora Linux,其他发行版可参考相关链接。

我们先在一台虚拟机上安装:

主机名 IP地址
mongodb1.example.org 192.168.176.61/24

首先配置软件源,新建文件/etc/yum.repos.d/10gen.repo:

[10gen]
name=10gen Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64
gpgcheck=0
enabled=1

安装软件包:

yum install mongo-10gen mongo-10gen-server

相关文件位置(与手工安装差别很大):

  • 配置文件:/etc/mongod.conf
  • 启动脚本:/etc/rc.d/init.d/mongod
  • 数据库目录:/var/lib/mongo
  • 日志目录:/var/log/mongo

数据库的启停控制:

service mongod start|stop|restart

MongoDB服务监听在27017端口,还有一个可选的28017端口可通过http访问,别的机器访问之前需配置防火墙打开端口。如果服务器在一个可信的环境,也可禁用防火墙。

复制集(Replica Sets)

接下来配置复制集Replica Sets,官方关于Replica Sets的文档链接:Replication,建议详读。

我们用三台虚拟机来搭建:

主机名 IP地址
mongodb1.example.org 192.168.176.61/24
mongodb2.example.org 192.168.176.62/24
mongodb3.example.org 192.168.176.63/24

每台机器都按前面软件安装的方法先装好MongoDB软件。

为便于管理,这里使用域名而不是IP地址进行访问。由于网络规模很小,故直接编辑/etc/hosts文件,在每台机器的/etc/hosts中添加:

192.168.176.61    mongodb1.example.org
192.168.176.62    mongodb2.example.org
192.168.176.63    mongodb3.example.org

编辑MongoDB配置文件/etc/mongod.conf,添加(每台机器都要操作):

replSet = rs0

准备完毕,重启数据库服务。

接下来开始配置复制集,在mongodb1.example.org上运行mongo:

$ mongo
>> rs.initiate();
>> rs.add("mongodb2.example.org");
>> rs.add("mongodb3.example.org");
>> exit

查看配置结果:

$ mongo
rs0:PRIMARY> rs.conf();
{
	"_id" : "rs0",
	"version" : 3,
	"members" : [
		{
			"_id" : 0,
			"host" : "mongodb1.example.org:27017"
		},
		{
			"_id" : 1,
			"host" : "mongodb2.example.org:27017"
		},
		{
			"_id" : 2,
			"host" : "mongodb3.example.org:27017"
		}
	]
}

服务监听端口依旧是27017,需对防火墙进行相应设置。

分片(Sharded Clusters)

最后我们来配置一个分片集群(Sharded Clusters),官方关于Sharded Clusters的文档链接:Sharding,同样建议详读。

复制集#2

分片可以是单机,也可以是复制集,在生产环境下,每个分片都应该是复制集。故开始分片之前,我们再搭建一组复制集。

同样三台机器模拟:

主机名 IP地址
mongodb4.example.org 192.168.176.64/24
mongodb5.example.org 192.168.176.65/24
mongodb6.example.org 192.168.176.66/24

复制集名称为rs1,即/etc/mongod.conf的设置为:

replSet = rs1

配置服务器(Config Servers)

我们部署三台配置服务器(Config Servers):

主机名 IP地址
mongodb7.example.org 192.168.176.67/24
mongodb8.example.org 192.168.176.68/24
mongodb9.example.org 192.168.176.69/24

编辑每台配置服务器的配置文件/etc/mongod.conf,添加:

configsvr = true

配置服务器的监听端口与数据库服务器不同,缺省为27019,注意防火墙的设置。

Mongos路由服务器

Mongos作为应用程序与实际数据分片的桥梁,一般与应用服务器部署在一起。当然也可有多个独立的Mongos服务,为多个应用程序服务并提供负载均衡。

这里配置三台Mongos服务:

主机名 IP地址
mongos1.example.org 192.168.176.70/24
mongos2.example.org 192.168.176.71/24
mongos3.example.org 192.168.176.72/24

Mongos需要知道所有相关的节点信息,包括配置服务器,数据库服务器(单机/复制集)。编辑每个Mongos的/etc/hosts,添加:

192.168.176.61    mongodb1.example.org
192.168.176.62    mongodb2.example.org
192.168.176.63    mongodb3.example.org
192.168.176.64    mongodb4.example.org
192.168.176.65    mongodb5.example.org
192.168.176.66    mongodb6.example.org
192.168.176.67    mongodb7.example.org
192.168.176.68    mongodb8.example.org
192.168.176.69    mongodb9.example.org

编辑每个Mongos的配置文件/etc/mongod.conf,添加所有配置服务器的信息:

configdb = mongodb7.example.org:27019,mongodb8.example.org:27019,mongodb9.example.org:27019

此外,Mongos上不含任何数据库数据,故注释掉:

#dbpath = /var/lib/mongo

Mongos服务进程的程序是mongos,不再是mongod。这里不想新建脚本,故在启动脚本/etc/init.d/mongod上做些修改:

27c27
< mongod=${MONGOD-/usr/bin/mongod}
---
> mongod=${MONGOD-/usr/bin/mongos}
58c58
<   killproc -p "$PIDFILE" -d 300 /usr/bin/mongod
---
>   killproc -p "$PIDFILE" -d 300 /usr/bin/mongos

这样,执行mongod脚本时,实际运行的是mongos。

Mongos服务监听端口是27017,与数据库服务器一致。

分片配置

这里把每个复制集作为一个分片,整个集群共有两个分片。

分片配置必须通过Mongos进行,执行mongo连接到任何一台Mongos,执行:

$ mongo
>> sh.addShard("rs0/mongodb1.example.org:27017");
>> sh.addShard("rs1/mongodb4.example.org:27017");
>> exit

查看配置结果:

$ mongo
mongos> sh.status();
--- Sharding Status --- 
  sharding version: {
	"_id" : 1,
	"version" : 3,
	"minCompatibleVersion" : 3,
	"currentVersion" : 4,
	"clusterId" : ObjectId("51baa670676745ec9a53fa2d")
}
  shards:
	{  "_id" : "rs0",  "host" : "rs0/mongodb1.example.org:27017,mongodb2.example.org:27017,mongodb3.example.org:27017" }
	{  "_id" : "rs1",  "host" : "rs1/mongodb4.example.org:27017,mongodb5.example.org:27017,mongodb6.example.org:27017" }
  databases:
	{  "_id" : "admin",  "partitioned" : false,  "primary" : "config" }
	{  "_id" : "test_db1",  "partitioned" : false,  "primary" : "rs0" }
	{  "_id" : "test_db2",  "partitioned" : false,  "primary" : "rs1" }

至此,分片集群建立完毕!后续就可以对具体的数据库和集合进行分片了。

computer/env/mongodb.txt · 最后更改: 2014/11/01 02:02 由 127.0.0.1