====== MongoDB数据库集群的模拟 ======
[[http://www.mongodb.org/|MongoDB]]是一个开源的NoSQL数据库,本文讲述用几台虚拟机来搭建一个MongoDB集群环境的过程。
MongoDB官方网站有详细的文档说明,下面将参考官方文档先配置一个单机数据库,然后配置复制集(Replica Sets),最后配置分片集群(Sharded Clusters)。
操作系统基于64位[[http://www.centos.org/|CentOS]] 6。
===== 软件安装 =====
安装MongoDB数据库软件,可通过手工方式下载软件包安装,也可基于特定发行版的包管理工具安装。这里选择后者,以便与操作系统更好的集成。
在CentOS下的安装方法可参考:[[http://docs.mongodb.org/manual/tutorial/install-mongodb-on-red-hat-centos-or-fedora-linux/|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的文档链接:[[http://docs.mongodb.org/manual/replication/|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的文档链接:[[http://docs.mongodb.org/manual/sharding/|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" }
至此,分片集群建立完毕!后续就可以对具体的数据库和集合进行分片了。
{{tag>MongoDB}}