益盛:服务器技术知识第六讲:mongdb分片服务器

服务器知识

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字段。

继续阅读