Welcome 微信登录

首页 / 数据库 / MySQL / MongoDB分片实战

环境准备

Linux环境

主机OS备注
192.168.32.13 CentOS6.3 64位 普通PC
192.168.71.43 CentOS6.2 64位 服务器,NUMA CPU架构
MongoDB版本:mongodb-linux-x86_64-2.4.1,下载地址:www.mongodb.org/downloads.MongoDB安装:分别在两台机器上安装好mongodb 2.4.1,安装路径都为/url/local/mongodb-2.4.1/cd /usr/local/src/wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.4.1.tgztar -zxvf mongodb-linux-x86_64-2.4.1.tgzcp -r mongodb-linux-x86_64-2.4.1 /usr/local/mongodb-2.4.1cd /usr/local/mongodb-2.4.1/bin/ll可以看到mongodb安装成功有如下模块: mongodb启动和关闭等在后面集群搭建中有详细说明,在此不再赘述。

Sharding集群搭建

Mongodb一共有三种集群搭建的方式:Replica Set(副本集)、Sharding(切片)和Master-Slaver(主从)。下面要搭建的是Sharding,Sharding集群也是三种集群中最复杂的。配置服务器启动(192.168.32.13:10000):1../bin/mongod --fork --dbpath data/config/ --logpath log/config.log –port 10000路由服务器启动(192.168.32.13:20000):1../bin/mongos --port 20000 --configdb 192.168.32.13:10000 --logpath log/mongos.log--fork注意1:配置--conigdb的时候ip地址不能填localhost或127.0.0.1否则添加分片时会返回如下错误信息:1.{2."ok" : 0,3."errmsg" : "can"t use localhost as a shard since all shards need to communicate. either use all shards and configdbs in localhost or all in actual IPshost: 192.168.71.43:27017 isLocalHost:0"4.}启动分片1(192.168.32.13:27019):1../bin/mongod --dbpath data/shard3/ --logpath log/shard3.log--fork --port 27019启动分片2(192.168.32.13:27020):1../bin/mongod --dbpath data/shard3/ --logpath log/shard3.log--fork --port 27020启动分片3(192.168.71.43:27017):1.numactl --interleave=all ./bin/mongod --dbpath data/shard1/ --logpath log/shard1.log--fork --port 27017启动分片4(192.168.71.43:27018):1.numactl --interleave=all ./bin/mongod --dbpath data/shard2/ --logpath log/shard2.log--fork --port 27018说明:关于这里为什么加numactl --interleave=all,后面有详细说明。Note:在生产环境可以将启动的配置信息写入文件,然后启动的时候指定配置文件,这样便于管理:1.vi conf/config.conf2.bpath=data/config/3.logpath=log/config.log4.port=100005.fork=true6../bin/mongod -f conf/config.conf添加分片1(192.168.32.13:27019):1../bin/mongo --port 200002.mongos> use admin3.switched to db admin4.mongos> db.runCommand({addshard:"192.168.32.13:27019",allowLocal:true })注意2:同样这里的192.168.32.13不能用localhost或127.0.0.1代替,并且当路由进程和分片在同一台机器上要指定allowLocal为true,因为MongoDB尽量避免错误的配置,将集群配置在本地,所以这个配置指明当前仅仅是用于开发。添加分片3(192.168.71.43:27017):1.mongos> db.runCommand({addshard:"192.168.71.43:27017" })类似的添加分片2,4。分片添加成功返回类似下面的信息(当前mongodb版本为2.4.1):1.{ "shardAdded" : "shard0000", "ok" : 1 }删除分片:如果要删除分片的话可以removeshard命令:1.mongos> use admin2.switched to db admin3.mongos> db.runCommand({"removeshard":"192.168.32.13:27020"})4.{5."msg" : "draining started successfully",6."state" : "started",7."shard" : "shard0001",8."note" : "you need to drop or movePrimary these databases",9."dbsToMove" : [10."test3"11.],12."ok" : 113.}移除分片需要一个过程,MongoDB会把移除的片上的数据(块)挪到其他片上,移动中会显示进度:1.mongos> db.runCommand({"removeshard":"192.168.32.13:27020"})2.{3."msg" : "draining ongoing",4."state" : "ongoing",5."remaining" : {6."chunks" : NumberLong(0),7."dbs" : NumberLong(1)8.},9."note" : "you need to drop or movePrimary these databases",10."dbsToMove" : [11."test3"12.],13."ok" : 114.}注意:如果删除的片是数据库的大本营(基片),必须手动移动或删除数据库,用moveprimary命令,上面的示例中就提示192.168.32.13:27020是test3库的大本营(primary),这个信息可以通过查看config.databases看到:1.mongos> use config2.switched to db config3.mongos> db.databases.find()4.{ "_id" : "test3", "partitioned" : false, "primary" : "shard0001" }这里shard0001就是192.168.32.13:27020,下面通过moveprimary命令移除test3:1.mongos> use admin 2.switched to db admin3.mongos> db.runCommand({"moveprimary":"test3","to":"192.168.32.13:27019"})4.{ "primary " : "shard0000:192.168.32.13:27019", "ok" : 1 }这时再查看config.databases会发现test3的大本营变成了shard0000(192.168.32.13:27019)这时再执行removeshard命令则能成功移除分片了:1.mongos> db.runCommand({"removeshard":"192.168.32.13:27020"})2.{3."msg" : "removeshard completed successfully",4."state" : "completed",5."shard" : "shard0001",6."ok" : 17.}

管理分片

进入mongos进程config库可以看到目前分片的情况:1../bin/mongo –port 200002.use config3.db.shards.find()1.mongos> use config2.switched to db config3.mongos> db.shards.find()4.{ "_id" : "shard0000", "host" : "192.168.32.13:27019" }5.{ "_id" : "shard0001", "host" : "192.168.71.43:27017" }6.{ "_id" : "shard0002", "host" : "192.168.71.43:27018" }注意3:如果配置过程中发生过上面注意1中出现的情况,即配置configdb的时候用了localhost或127.0.0.1,则运行db.shards.find()可能会出现如下错误:1.mongos> db.shards.find()2.error: {3."$err" : "could not initialize sharding on connection 192.168.32.13:10000 :: caused by :: mongos specified a different config database string : stored : localhost:10000 vs given : 192.168.32.13:10000",4."code" : 159075.}解决方法是重新启动config进程。查看分片后的数据库:1../bin/mongo –port 200002.use test3.db.test.user.insert({“test”: “test”})4.……5.use config6.db.databases.find()7.{ "_id" : "admin", "partitioned" : false, "primary" : "config" }8.{ "_id" : "test", "partitioned" : false, "primary" : "shard0000" }9.{ "_id" : "test2", "partitioned" : false, "primary" : "shard0000" }10.{ "_id" : "test3", "partitioned" : false, "primary" : "shard0001" }“_id”,字符串。表示数据库名。“partioned”,布尔型。如果为true则表示开启了分片功能。“primary”,字符串,这个值与“_id”对应表示这个数据库的“大本营“在哪里,不论分片与否,数据库总是会有个“大本营”,创建数据库时会随机选择一个片,也就是说大本营是开始创建数据库文件的位置。虽然分片的时候数据库也会用到很多别的服务器,但是从这分片开始。至此整个mongodb分片集群基本搭建完成,但是想让分片正常、高效、稳定的运行还有很多工作要做,下一节将在此基础上做一些简单的测试。更多MongoDB相关???程见以下内容:CentOS 编译安装 MongoDB与mongoDB的php扩展 http://www.linuxidc.com/Linux/2012-02/53833.htmCentOS 6 使用 yum 安装MongoDB及服务器端配置 http://www.linuxidc.com/Linux/2012-08/68196.htmUbuntu 13.04下安装MongoDB2.4.3 http://www.linuxidc.com/Linux/2013-05/84227.htmMongoDB入门必读(概念与实战并重) http://www.linuxidc.com/Linux/2013-07/87105.htmUbunu 14.04下MongoDB的安装指南 http://www.linuxidc.com/Linux/2014-08/105364.htm《MongoDB 权威指南》(MongoDB: The Definitive Guide)英文文字版[PDF] http://www.linuxidc.com/Linux/2012-07/66735.htmNagios监控MongoDB分片集群服务实战 http://www.linuxidc.com/Linux/2014-10/107826.htm基于CentOS 6.5操作系统搭建MongoDB服务 http://www.linuxidc.com/Linux/2014-11/108900.htm更多详情见请继续阅读下一页的精彩内容: http://www.linuxidc.com/Linux/2016-04/130008p2.htm
  • 1
  • 2
  • 3
  • 下一页
MongoDB全文索引用法MongoDB 副本集+分片 架构部署相关资讯      MongoDB分片 
  • MongoDB 分片  (04月14日)
  • MongoDB分片简单实例  (02月13日)
  • MongoDB 自动分片 auto sharding  (03/30/2014 17:22:00)
  • MongoDB 副本集+分片 架构部署  (04月10日)
  • MongoDB的数据复制分片  (10/13/2014 11:34:30)
  • 配置MongoDB集群分片  (12/21/2012 08:45:18)
本文评论 查看全部评论 (0)
表情: 姓名: 字数