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
相关文件位置(与手工安装差别很大):
数据库的启停控制:
service mongod start|stop|restart
MongoDB服务监听在27017端口,还有一个可选的28017端口可通过http访问,别的机器访问之前需配置防火墙打开端口。如果服务器在一个可信的环境,也可禁用防火墙。
接下来配置复制集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的文档链接:Sharding,同样建议详读。
分片可以是单机,也可以是复制集,在生产环境下,每个分片都应该是复制集。故开始分片之前,我们再搭建一组复制集。
同样三台机器模拟:
主机名 | 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):
主机名 | 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服务:
主机名 | 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" }
至此,分片集群建立完毕!后续就可以对具体的数据库和集合进行分片了。