mongoDB 分片(shard)

来源:互联网 发布:淘宝买酒靠谱吗 编辑:程序博客网 时间:2024/05/17 06:15

mongoDB 的分片技术(shard)

其功能是把mongoDB数据库上的数据进得分片存储,以便于实现类似的负载均衡

规划

从流程上来说  分片需要有三个步骤

1. 数据请求交给   mongos服务器,它相当于一个路由器,是数据请求的总入口,

2. 需要一个mongo  configsvr服务器  ,它相当于一个路由表,  mongos(路由器)接到请求后,会去找 configsvr 服务器(查找路由表)

3. 实际存储数据的数据库 , 可以是N多台 , configsvr 会自动分配数据存储到其中


二.实现步骤

1. 首先配置一个 路由表服务器 configsvr

#> ./mongod --dbpath   /var/www/monogdb/dbpath   --logpaht   /var/www/mongodb/logpath    --fork   --port  20000  --configsvr   [--smallfiles]

//命令解释   --configsvr  :这个选项一定不能少   表示本台服务器是 分片的路由服务器  -- fork:表示在后台运得   --prot:表示服务中运行在20000 端口上的

2. 开启一个路由服务器,也就 是mongos

#> ./mongos --logpath /var/www/mongologpath  --fork --configdb 127.0.0.1:20000  --port  30000

//命令解释   --configdb 127.0.0.1:20000  这个选项不能少  表示路由表服务器的位置  及其运行的端口    而mongos服务运行在30000端口上

3.  开启N个存储数据的服务器

#> ./mongod --dbpath  /var/mongodbpath  --logpath /var/mongologpath --port 27017  --fork  [--smallfiles]

#> ./mongod --dbpath  /var/mongodbpath  --logpath /var/mongologpath --port 27018  --fork  [--smallfiles]

// 命令解释:这是在27017  和  27018 两个端口上开启了两个mongo数据库

//到这个地方,可以看到   路由器服务器,路由表服务器两个之间有了联系,,但是两个数据服务器 其它们好像一点关系都没有

//接下来把两个数据服务器 的关系建立起来

具体做法如下:

4. 使用./mongo  命令进入mongos的管理命令行

./mongo 127.0.0.1:30000     //因为  mongos服务运行在本机的30000端口上   回车后出现的命令行提示符就是   mongos

//在 mongos 命令行中 输入   sh.help()   可以看到所有的命令

这里我们那两台数据服务器加入进来

mongos> sh.addShard("127.0.0.1:27017")

mongos> sh.addShard("127.0.0.1:27018")

这样就已经把两个数据服务器加入到了分片中,可以使用sh.status(),看到有两个分片的数据存储服务器

shards:

{  "_id" : "shard0000",  "host" : "127.0.0.1:27017" }

{  "_id" : "shard0001",  "host" : "127.0.0.1:27018" }

但这样子并不能使数据分片,    因为分片是  基于数据库   或者数据表的    所在应该使用 sh.enableSharding()  和 sh.shardCollection() 来指明数据库或数据表

5.指定可以分片的数据库   比出说 我的数据库中有一个  名为  mytestDatabase 的数据库

mongos> sh.enableSharding("mytestDatabase")

这里选择了可以分片的数据库,但是还是不能分片,因为分片的规则还没有说明,根本不知道按照什么来分片

所以,分片的规则是在 下面一个命令中出

6.指定可以分片的数据表,并且给出  分片的规则,按数据表中的哪一个字段来进行分片  (假设mytestDatabas库中有一个 user的数库表,字段有 “user_id"  "user_name" 等

mongos > sh.shardCollection("user",{"user_id":1})   //这个命令的意思是说  对 user表  根据 user_id 作为参照来进得分片

至此,就完成了   mytestDatabase 数据库中的  user表 来  进行分片的操作


(over)











原创粉丝点击