Mongodb分片服务器。Mongodb支持自动分片和划分架构,可以利用它构建一个水平扩展的数据库集群系统,将数据库分表存储在各个sharding节点上。
在mongodb里面存在另一种集群,就是分片技术,跟sql server的表分区类似,我们知道当数据量达到T级别的时候,我们的磁盘,内存就吃不消了。
一:什么是分片
分片(sharding)是MongoDB 用来将大型集合分割到不同服务器(或者说一个集群)上所采用的方法。尽管分片起源于关系型数据库分区,但它(像MongoDB 的大部分方面一样)完全是另一回事。 mongodb采用将集合进行拆分,然后将拆分的数据均摊到几个片上的一种解决方案。
下面我对这张图解释一下:
人脸:代表客户端,客户端肯定说,你数据库分片不分片跟我没关系,我叫你干啥就干啥,没什么好商量的。
mongos: 首先我们要了解”片键“的概念,也就是说拆分集合的依据是什么?按照什么键值进行拆分集合....好了,mongos就是一个路由服务器,它会根据管理员设置的“片键”将数据分摊到自己管理的mongod集群,数据和片的对应关系以及相应的配置信息保存在"config服务器"上。
mongod: 一个普通的数据库实例,如果不分片的话,我们会直接连上mongod。
二:Mongodb分片优缺点
(1)mongodb的不足之处
1、在群集分片中的数据分布不均匀
2、单机可靠性比较差
3、大数据量持续插入,写入性能有较大波动
4、磁盘空间占用比较大
(2)mongodb优点
1、无模式
2、查询与索引方式灵活,是最像SQL的Nosql
3、支持复制集、主备、互为主备、自动分片等特性
三: 实战
172.16.1.170(config服务器)
172.16.1.171(mongos服务器)
172.16.1.172(分片服务器)
172.16.1.173(分片服务器)
首先我们准备4台服务器开启mongod,也可以在本机开启4个mongd程序
1:开启config服务器172.16.1.170
先前也说了,mongos要把mongod之间的配置放到config服务器里面,理所当然首先开启它,我这里就建立2222端口。
[root@nagios ~]# mongod --dbpath /2222/ --port 2222
Wed Feb 27 14:27:26 [initandlisten] MongoDB starting : pid=31745 port=2222 dbpath=/2222/ 64-bit host=nagios
Wed Feb 27 14:27:26 [initandlisten] db version v2.0.4, pdfile version 4.5
Wed Feb 27 14:27:26 [initandlisten] git version: 329f3c47fe8136c03392c8f0e548506cb21f8ebf
Wed Feb 27 14:27:26 [initandlisten] build info: Linux ip-10-110-9-236 2.6.21.7-2.ec2.v1.2.fc8xen #1 SMP Fri Nov 20 17:48:28 EST 2009 x86_64 BOOST_LIB_VERSION=1_41
Wed Feb 27 14:27:26 [initandlisten] options: { dbpath: "/2222/", port: 2222 }
Wed Feb 27 14:27:26 [initandlisten] journal dir=/2222/journal
Wed Feb 27 14:27:26 [initandlisten] recover : no journal files present, no recovery needed
Wed Feb 27 14:27:27 [websvr] admin web console waiting for connections on port 3222
Wed Feb 27 14:27:27 [initandlisten] waiting for connections on port 2222
2: 开启mongos服务器172.16.1.171
这里要注意的是我们开启的是mongos,不是mongod,同时指定下config服务器,这里我就开数据存放在/3333目录上的mongodb,端口3333。
[root@171 ~]# mongos --port 3333 --configdb 172.16.1.170:2222
Wed Feb 27 14:33:31 warning: running with 1 config server should be done only for testing purposes and is not recommended for production
Wed Feb 27 14:33:31 [mongosMain] MongoS version 2.2.3 starting: pid=4589 port=3333 64-bit host=171 (--help for usage)
Wed Feb 27 14:33:31 [mongosMain] git version: f570771a5d8a3846eb7586eaffcf4c2f4a96bf08
Wed Feb 27 14:33:31 [mongosMain] build info: Linux ip-10-2-29-40 2.6.21.7-2.ec2.v1.2.fc8xen #1 SMP Fri Nov 20 17:48:28 EST 2009 x86_64 BOOST_LIB_VERSION=1_49
Wed Feb 27 14:33:31 [mongosMain] options: { configdb: "172.16.1.170:2222", port: 3333 }
Wed Feb 27 14:33:55 [websvr] admin web console waiting for connections on port 4333
Wed Feb 27 14:33:55 [mongosMain] waiting for connections on port 3333
Wed Feb 27 14:33:55 [Balancer] about to contact config servers and shards
Wed Feb 27 14:33:55 [Balancer] config servers and shards contacted successfully
3:启动mongod服务器172.16.1.172
对分片来说,也就是要添加片了,分别在172.16.1.172和172.16.1.173上开启mongodb,端口为:4444,5555。
[root@172 ~]# mongod --dbpath /4444/ --port 4444
Wed Feb 27 17:32:14 [initandlisten] MongoDB starting : pid=8922 port=4444 dbpath=/4444/ 64-bit host=172
Wed Feb 27 17:32:14 [initandlisten] db version v2.2.2, pdfile version 4.5
Wed Feb 27 17:32:14 [initandlisten] git version: d1b43b61a5308c4ad0679d34b262c5af9d664267
Wed Feb 27 17:32:14 [initandlisten] build info: Linux ip-10-2-29-40 2.6.21.7-2.ec2.v1.2.fc8xen #1 SMP Fri Nov 20 17:48:28 EST 2009 x86_64 BOOST_LIB_VERSION=1_49
Wed Feb 27 17:32:14 [initandlisten] options: { dbpath: "/4444/", port: 4444 }
Wed Feb 27 17:32:15 [initandlisten] journal dir=/4444/journal
Wed Feb 27 17:32:15 [initandlisten] recover : no journal files present, no recovery needed
Wed Feb 27 17:32:15 [websvr] admin web console waiting for connections on port 5444
Wed Feb 27 17:32:15 [initandlisten] waiting for connections on port 4444
[root@173 ~]# mongod --dbpath /5555/ --port 5555
Thu Feb 28 08:12:58 [initandlisten] MongoDB starting : pid=12173 port=5555 dbpath=/5555/ 64-bit host=173
Thu Feb 28 08:12:58 [initandlisten] db version v2.2.3, pdfile version 4.5
Thu Feb 28 08:12:58 [initandlisten] git version: f570771a5d8a3846eb7586eaffcf4c2f4a96bf08
Thu Feb 28 08:12:58 [initandlisten] build info: Linux ip-10-2-29-40 2.6.21.7-2.ec2.v1.2.fc8xen #1 SMP Fri Nov 20 17:48:28 EST 2009 x86_64 BOOST_LIB_VERSION=1_49
Thu Feb 28 08:12:58 [initandlisten] options: { dbpath: "/5555/", port: 5555 }
Thu Feb 28 08:12:58 [initandlisten] journal dir=/5555/journal
Thu Feb 28 08:12:58 [initandlisten] recover : no journal files present, no recovery needed
Thu Feb 28 08:12:59 [initandlisten] waiting for connections on port 5555
Thu Feb 28 08:12:59 [websvr] admin web console waiting for connections on port 6555
四: 服务配置
<1> 先前图中也可以看到,我们client直接跟mongos打交道,也就说明我们要连接mongos服务器,然后将4444,5555的mongod交给mongos,添加分片也就是addshard()
[root@173 ~]# mongo 172.16.1.171:3333/admin
MongoDB shell version: 2.2.3
connecting to: 172.16.1.171:3333/admin
mongos> db.runCommand({"addshard":"172.16.1.172:4444",allowLocal:true})
{ "shardAdded" : "shard0000", "ok" : 1 }
mongos> db.runCommand({"addshard":"172.16.1.173:5555",allowLocal:true})
{ "shardAdded" : "shard0001", "ok" : 1 }
这里要注意的是,在addshard中,我们也可以添加副本集,这样能达到更高的稳定性。
<2>片已经集群了,但是mongos不知道该如何切分数据,也就是我们先前所说的片键,在mongodb中设置片键要做两步
①:开启数据库分片功能,命令很简单 enablesharding(),这里我就开启test数据库。
②:指定集合中分片的片键,这里我就指定为person.name字段
mongos> db.runCommand({"enablesharding":"test"})
{ "ok" : 1 }
mongos> db.runCommand({"shardcollection":"test.person","key":{"name":1}})
{ "collectionsharded" : "test.person", "ok" : 1 }
五: 查看效果
好了,至此我们的分片操作全部结束,接下来我们通过mongos向mongodb插入10w记录,然后通过printShardingStatus命令
查看mongodb的数据分片情况
mongos> use test
switched to db test
mongos> for(var i=0;i<100000;i++){
... db.person.insert({"name":"zhangfang"+i,"age":i})
... }
mongos> db.printShardingStatus()
--- Sharding Status ---
sharding version: { "_id" : 1, "version" : 3 }
shards:
{ "_id" : "shard0000", "host" : "172.16.1.172:4444" }
{ "_id" : "shard0001", "host" : "172.16.1.173:5555" }
databases:
{ "_id" : "admin", "partitioned" : false, "primary" : "config" }
{ "_id" : "test", "partitioned" : true, "primary" : "shard0000" }
test.person chunks:
shard00011
shard00001
{ "name" : { $minKey : 1 } } -->> { "name" : "zhangfang0" } on : shard0001 Timestamp(2000, 0)
{ "name" : "zhangfang0" } -->> { "name" : { $maxKey : 1 } } on : shard0000 Timestamp(2000, 1)
注意
蓝色字体部分说明有两台分片服务器分别是172.16.1.172,172.16.1.173
红色字体部分说明数据分片写入到不同的分片服务器上
可以改成后台启动的方式
mongod --dbpath /2222 --port 2222 --fork --logpath /2222/mongodb.log
--dbpath:指定数据存放的路径
--port:指定服务监听端口
--fork;以后台方式启动
--logpath;指定日志的路径
登陆mongodb时候
mongodb --port 端口号
Show dbs 查看数据库
db.runCommand({"enablesharding":"test"}):开启对test数据的分片
db.runCommand({"addshard":"172.16.1.172:4444",allowLocal:true}):添加分片服务器
db.runCommand({"shardcollection":"test.person","key":{"name":1}}):指定集合中分片的片键,这里我就指定为person.name字段。