zoukankan      html  css  js  c++  java
  • mongodb的sharding架构搭建

    mongodb的sharding架构搭建

    sharding是一种将海量数据水平扩展的集群系统,数据分表存储在sharding的各个节点上,使用者通过简单的配置就可以很方便地构建一个分布式mongodb集群. sharding不是某个特定数据库软件附属的功能,而是具体技术细节上的抽象处理,是水平扩展(横向扩展或向外扩展)的解决方案,主要目的是突破单个数据库服务的I/O能力限制,最终解决数据库扩展性问题.sharding也有其不适合的场景,比如处理事务的应用就会非常复杂.对于跨DB的事务来说,很难保证完整性.

     

    数据库sharding主要有以下优点:

    提高了近似线性扩展的架构,可以随着应用的增长线性地增加更多的服务器

    提高了数据库的可用性。如果只有一个数据库,一旦当掉,对其提供的service影响是100%,如果拆成10台那么,每台当掉的影响就为10%

    小型数据库的压力比较小,风险小,性能更好.

     

    MongoDB将数据分块称为chunk,每个chunk都是collection中一段连续的数据记录,通常最大尺寸是200MB,超出则生成新的数据块.

    MongoDBSharding架构

    构建一个mongoDB Sharding Cluster需要三种角色:shard服务器(Shard Server)、配置服务器(config Server)、路由进程(Route Process)

    Shard服务器

    shard服务器即存储实际数据的分片,每个shard可以是一个mongod实例,也可以是一组mongod实例构成的Replica Sets.为了实现每个Shard内部的故障自动转换,MongoDB官方建议每个shard为一组Replica Sets.

    配置服务器

    为了将一个特定的collection存储在多个shard,需要为该collection指定一个shard key,决定该条记录属于哪个chunk.配置服务器可以存储以下信息.

    每个shard节点的配置信息

    每个chunkshard key范围

    chunk在各shard的分布情况

    集群中所有DBcollectionsharding配置信息.

    路由进程

    它是一个前段路由,客户端由此接入,首先询问配置服务器需要到哪个shard上查询或保存记录,然后连接相应的shard执行操作,最后将结果返回给客户端,客户端只需要将原本发给mongod的查询或更新请求原封不动地发给路由进程,而不必关心所操作的记录存储在哪个shard.

    构建一个简单的Sharding Cluster

    复制集是由一系列物理机器组成的,用一个机器作为主库,其他的机器作为从库,为了演示方便,在同一台物理机器上构建一个简单的sharding cluster.包括启动和配置服务器,路由进程等方法.

    创建对应的文件夹

    复制代码
    数据存放目录:
    D:\program files\mongo\data\shard\sv0
    D:\program files\mongo\data\shard\sv1
    D:\program files\mongo\data\shard\config
    日志存放目录:
    D:\program files\mongo\logs\shard\sv0.log
    D:\program files\mongo\logs\shard\sv1.log
    D:\program files\mongo\logs\shard\config.log
    D:\program files\mongo\logs\shard\route.log
    复制代码

    启动shardserver[启动2个窗口]

    mongod --shardsvr --port 8888 --dbpath=../data/shard/sv0 --logpath=../logs/shard/sv0.log --directoryperdb
    mongod --shardsvr --port 8889 --dbpath=../data/shard/sv1 --logpath=../logs/shard/sv1.log --directoryperdb

    如下图:


    另起一个窗口

    启动Config Server(新建窗口)

    mongod --configsvr --port 6000 --dbpath=../data/shard/config --logpath=../logs/shard/config.log --directoryperdb

    如图:

    启动RouteProcess(新建窗口)

    mongos --port 8000 --configdb localhost:6000 --logpath=../logs/shard/route.log --chunkSize 1

    参数说明:

    chunkSize用来指定chunk的大小(单位:MB),默认值为200

    配置Sharding

    使用mongo客户端登录路由控制器添加shard节点.

    复制代码
    D:\program files\mongo\bin>mongo admin --port 8000
    MongoDB shell version: 1.8.1
    connecting to: 127.0.0.1:8000/admin
    > db.runCommand({ addshard:"localhost:8888" })
    { "shardAdded" : "shard0000", "ok" : 1 }
    > db.runCommand({ addshard:"localhost:8889" })
    { "shardAdded" : "shard0001", "ok" : 1 }
    > db.runCommand({ enablesharding:"test" })
    { "ok" : 1 }
    > db.runCommand({ shardcollection:"test.users", key:{ _id:1 }})
    { "collectionsharded" : "test.users", "ok" : 1 }
    >
    说明:
    mongo admin --port 8000 表示连接到路由控制器的admin数据库.
    db.runCommand({ addshard:"localhost:8888" }) 表示添加本地端口8888的shard server实例.
    db.runCommand({ enablesharding:"test" })表示要在test数据库上执行分片,其中的test代表要分片的数据库.
    db.runCommand({ shardcollection:"test.users", key:{ _id:1 }}) 设置要在test数据库的users表上分片,同时指明shard key是id这一列.
    复制代码

    如图:

    至此,一个完整的sharding环境部署完毕.

     

    验证sharding

    循环向test.users表中插入20万条数据,然后使用命令test.users.stats()查看表的分片情况.

    > use test
    switched to db test
    > for(var i=1; i<200000; i++) db.users.insert({name:"user"+i, age:i, email:"dennisit@163.com" })
    > db.users.stats()

    如图:

     

    新增Shard Server

    启动一个新Shard Server进程,如下面代码所示.

    D:\program files\mongo\data\shard\sv2

    mongod --shardsvr --port 8887 --dbpath=../data/shard/sv2 --logpath=../logs/shard/sv2.log

    配置新shard server.

    D:\program files\mongo\bin>mongo admin --port 8000
    MongoDB shell version: 1.8.1
    connecting to: 127.0.0.1:8000/admin
    > db.runCommand({ addshard:"localhost:8887"})
    { "shardAdded" : "shard0002", "ok" : 1 }

    如图:


    接下来看分片表状态,以验证新的shard server已生效.

    复制代码
    > use test
    switched to db test
    > db.users.stats()
    {
            "sharded" : true,
            "ns" : "test.users",
            "count" : 599998,
            "size" : 50399116,
            "avgObjSize" : 83.99880666268888,
            "storageSize" : 102398720,
            "nindexes" : 1,
            "nchunks" : 42,
            "shards" : {
                    "shard0000" : {
                            "ns" : "test.users",
                            "count" : 233266,
                            "size" : 19594344,
                            "avgObjSize" : 84,
                            "storageSize" : 47822848,
                            "numExtents" : 9,
                            "nindexes" : 1,
                            "lastExtentSize" : 14495232,
                            "paddingFactor" : 1,
                            "flags" : 1,
                            "totalIndexSize" : 9723904,
                            "indexSizes" : {
                                    "_id_" : 9723904
                            },
                            "ok" : 1
                    },
                    "shard0001" : {
                            "ns" : "test.users",
                            "count" : 230087,
                            "size" : 19327336,
                            "avgObjSize" : 84.00012169309869,
                            "storageSize" : 33327616,
                            "numExtents" : 8,
                            "nindexes" : 1,
                            "lastExtentSize" : 12079360,
                            "paddingFactor" : 1,
                            "flags" : 1,
                            "totalIndexSize" : 9592832,
                            "indexSizes" : {
                                    "_id_" : 9592832
                            },
                            "ok" : 1
                    },
                    "shard0002" : {
                            "ns" : "test.users",
                            "count" : 136645,
                            "size" : 11477436,
                            "avgObjSize" : 83.99455523436643,
                            "storageSize" : 21248256,
                            "numExtents" : 7,
                            "nindexes" : 1,
                            "lastExtentSize" : 10066176,
                            "paddingFactor" : 1,
                            "flags" : 1,
                            "totalIndexSize" : 7684096,
                            "indexSizes" : {
                                    "_id_" : 7684096
                            },
                            "ok" : 1
                    }
            },
            "ok" : 1
    }
    >
    复制代码

    查看Sharding信息

    printShardingStatus()

    如图:

    移除Shard Server

    移除Shard Server,系统首先会将即将移除的Shard Server上的数据平均分配到其他Shard Server,然后将这个Shard Server踢下线.

    注意:移除Shard Server的操作对客户端完全是透明的,不影响用户正常使用,也不需要待机进行.

    例如要移除8889端口的shard Server, 需要不停地调用以下命令来观察这个移除操作执行到哪里了.

    db.runCommand({ "removeshard":"localhost:8889" );

    移除过程中会出现3种状态.

    状态一如图,表示移除的动作是刚刚开始.

    状态二如图,ongoing表示移除已经开始

    状态三如图,completed表示移除完成


    使用 printShardingStatus();查看Sharding信息

    判断是否是Sharding

    通过执行 db.runCommand({ isdbgrid:1 })命令查看当前实例是否在Sharding环境中.

    列出所有Shard Server

    转载请注明出处:[http://www.cnblogs.com/dennisit/archive/2013/02/18/2916159.html]

     

      在线交谈

    热爱生活,热爱Coding,敢于挑战,用于探索 ...
     
    分类: NoSQL
  • 相关阅读:
    唐寅 《桃花庵歌》
    asp.net 后台隐藏div
    dataset的用法
    C#中的DateTime类型加减
    discuz! x2.5 文章添加分享按钮
    asp.net学习小网站
    table固定行和表头
    aspx.net开源的画图组件
    Global.asax详解
    int.Parse() int.TryParse
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2917179.html
Copyright © 2011-2022 走看看