====== 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}}