手机版
你好,游客 登录 注册 搜索
背景:
阅读新闻

MongoDB的数据复制和数据切片

[日期:2015-09-20] 来源:Linux社区  作者:ljbaby [字体: ]

MongoDB数据分片

随着数据集的扩大和吞吐量的提升,单个MongoDB服务器可能在cpu,内存或IO这些资源上出现瓶颈,这是需要对MongoDB进行扩展,比较经济的方式是水平扩展,将数据集分布到多个节点上来分散访问压力。这里的每个节点也称作分片,每个分片都是一个独立的数据库。所有的分片组合在一起才是一个完整的数据库。

MongoDB的分片框架中有3个角色:

1)Query Routers:路由

2)Config servers:元数据服务器

3)Shards:数据节点

MongoDB的数据复制和数据切片

工作机制:Query Routers用于接收用户的请求,将请求路由到对应的分片上(shards)执行,然后将结果返回给客户端。Config servers存储服务器集群的元数据,Query Routers通过使用这些元数据将请求定位至特定的shard节点。Shards节点存储数据,为了提供高可用性和数据一致性,每个shard都可以是一个副本集。在生产环境中,为了避免单点故障,Query Routers和Config servers往往有多个节点。

实现过程

实验环境:

Config server:192.168.1.106

Query Routers:192.168.1.131

Shared:192.168.1.138,192.168.1.127


1)配置config server

在192.168.1.106上更改配置文件信息:

[root@node1 ~]# vim /etc/mongod.conf
#replSet=rs0
#replIndexPrefetch = _id_only
configsvr = true

配置完成后启动服务:

[root@node1 ~]# service mongod start
Starting mongod:                                          [  OK  ]

MongoDB的数据复制和数据切片

可以看到对应的服务监听在27019上。

2)配置Query Routers

Query Routers节点只需要安装mongodb-org-mongos即可,无需安装其他的软甲包。

[root@node4 mongodb-2.6.5]# yum install mongodb-org-mongos-2.6.5-1.x86_64.rpm

默认情况下,mongos监听于27017端口,在启动mongos是需要指定config服务器的地址。

启动mongos:

[root@node4 ~]# mkdir /var/log/mongodb
[root@node4 ~]# mongos --configdb=192.168.1.106 --fork --logpath=/var/log/mongodb/mongo.log

也可以直接编辑配置文件:

1)注释dbpath指令

2)添加configdb指令,并指定config服务器的地址

3)启动mongos,命令:mongos -f /etc/mongod.conf

 

3)配置shard节点

shard(数据节点)的配置与配置mongodb一致,如果不是副本集,把以下两项注销。

#replSet=rs0
#replIndexPrefetch = _id_only
 

在两个shard节点上启动mongod服务:

[root@node2 ~]# service mongod start
Starting mongod:                                          [  OK  ]
###################
[root@node3 ~]# service mongod start
Starting mongod:                                          [  OK  ]

4)向分区集群中添加各shard服务器或副本集

连接mongos节点,添加shard。由于在mongos节点上仅安装了mongos的包,没有mongo命令,可以在其他节点上使用mongo --host 来连接。

[root@node1 ~]# mongo --host 192.168.1.131
MongoDB shell version: 2.6.5
connecting to: 192.168.1.131:27017/test
mongos>

添加shard节点:

mongos> sh.addShard("192.168.1.127")
{ "shardAdded" : "shard0000", "ok" : 1 }
mongos> sh.addShard("192.168.1.138")
{ "shardAdded" : "shard0001", "ok" : 1 }

MongoDB的数据复制和数据切片

可以看到节点已经添加成功,只是上面还没有数据,没有进行分片。

5)启用sharding功能

启用指定数据库的sharding功能:

mongos> sh.enableSharding("student_db")
{ "ok" : 1 }
################################
mongos> sh.status()
--- Sharding Status ---
  sharding version: {
    "_id" : 1,
    "version" : 4,
    "minCompatibleVersion" : 4,
    "currentVersion" : 5,
    "clusterId" : ObjectId("55e89a17f0cf218cb7edd0c5")
}
  shards:
    {  "_id" : "shard0000",  "host" : "192.168.1.127:27017" }
    {  "_id" : "shard0001",  "host" : "192.168.1.138:27017" }
  databases:
    {  "_id" : "admin",  "partitioned" : false,  "primary" : "config" }
    {  "_id" : "student_db",  "partitioned" : true,  "primary" : "shard0000" }    #显示该数据库已经支持分片

最后一行显示student_db数据库的partition为true,已支持数据分片功能。

 

指定需要分片的Collection及索引:

mongos> sh.shardCollection("student_db.students",{"age":1})
{ "collectionsharded" : "student_db.student", "ok" : 1 }
#################################
#插入数据
mongos> for (i=1;i<=100000;i++) db.students.insert({name:"student"+i,age:(i%120),address:"china_nb"});
WriteResult({ "nInserted" : 1 })

 

查看集群的状态信息:

mongos> sh.status()
--- Sharding Status ---
  sharding version: {
    "_id" : 1,
    "version" : 4,
    "minCompatibleVersion" : 4,
    "currentVersion" : 5,
    "clusterId" : ObjectId("55e89a17f0cf218cb7edd0c5")
}
  shards:
    {  "_id" : "shard0000",  "host" : "192.168.1.127:27017" }
    {  "_id" : "shard0001",  "host" : "192.168.1.138:27017" }
  databases:
    {  "_id" : "admin",  "partitioned" : false,  "primary" : "config" }
    {  "_id" : "student_db",  "partitioned" : true,  "primary" : "shard0000" }
        student_db.students
            shard key: { "age" : 1 }
            chunks:
                shard0001  1
                shard0000  2
            { "age" : { "$minKey" : 1 } } -->> { "age" : 1 } on : shard0001 Timestamp(2, 0)
            { "age" : 1 } -->> { "age" : 119 } on : shard0000 Timestamp(2, 1)
            { "age" : 119 } -->> { "age" : { "$maxKey" : 1 } } on : shard0000 Timestamp(1, 4)

可以看到数据已经分别存储在不同的shard上。

若需要分片时,数据已经存在,则需要对collection中的某一字段先创建索引,然后才能够分片。以上是MongoDB的简单应用。.................^_^

MongoDB 的详细介绍请点这里
MongoDB 的下载地址请点这里

本文永久更新链接地址http://www.linuxidc.com/Linux/2015-09/123320.htm

linux
相关资讯       MongoDB副本集  MongoDB数据切片 
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款