• MongoDB之分片


    本文介绍分片的思想和MongoDB中的实现方法。


    首先须要介绍一些主要的概念。


    分片

    分片。也叫做分区。是一种经常使用的数据库优化技术。其含义就是将数据拆分,将数据分散到不同机器上的过程。这样就能够使得系统能够存储很多其它的数据,处于更大的负载。
    差点儿全部的数据库软件都能够进行手动分片,通过应用程序管理不同server上的不同数据,查询也须要寻找正确的server。这样尽管能够减轻负载,可是却难以维护,比方我们向集群加入节点或者删除节点。都须要相应的调整数据的分布。
    MongoDB在这一点上做得不错,它支持自己主动分片,集群能够自己主动切分数据,达到负载均衡,从而使管理人员能够摆脱手动分片。


    分片原理

    以下说说分片的原理。MongoDB分片的基本思想就是将集合切分成小块,这些块分散到若干片里面。每一个片仅仅负责总数据的一部分。


    应用程序不须要知道哪些片相应哪些数据,也不须要知道数据是否已经拆分

    MongoDB通过另外一个独立的路由进程mongos来实现这个功能。


    mongos路由进程知道全部数据的存放位置,所以应用能够连接它来正常发送请求。而对于应用来说。自己仅仅知道连接了一个普通的mongod。

    也就是说,mongos相应用隐藏了分片的细节
    为什么要隐藏了?事实上就是为了拓展的时候,不必改动应用程序的代码。

    应用场景

    说完了原理。那什么时候须要用到分片呢?有以下几种情况:
    1. 机器的磁盘不够用了
    2. 单个mongodb已经不再满足性能须要
    3. 想将大量数据放入内存提高性能

    一般来说,先从不分片開始。然后在须要的时候将其转换成分片。

    片键

    设置分片时,须要从集合里面选一个键,用该键的值作为数据拆分的根据。这个键成为片键


    假设有个文档集合表示的是人员,假设选择名字”name”做为片键,第一篇可能会存放名字以A-F开头的文档;第二片存G-P开头的文档;第三篇存Q-Z的文档。


    随着添加或删除片,MongoDB会又一次平衡数据,使得每片的流量比較均衡,数据量也在合理范围内。

    那么我们应该怎样选择片键呢?
    假设我们选择了时间属性的键作为片键。那么随着时间增长。全部的文档都会以最后一片插入。这就不适合写入操作负载非常高的情况,可是查询起来就比較方便。


    假设我们选择了分布均匀的片键,就会提高写入操作的负载能力,可是就会影响查询的性能。
    我们也能够选择复合片键,将两个属性键结合为一个片键。
    事实上和索引的原理类似,事实上,片键也是最经常使用的索引。

    说了半天的概率,也累了,以下看看实际操作吧。


    建立分片

    建立分片有两步:启动server,然后决定怎么切分数据。


    分片一般由三个部分组成:
    1.
    片就是保存子集合数据的容器。片能够是单个mongodserver。也能够是副本集。


    2. mongos
    路由进程,它接收全部的请求。然后将结果聚合,它本身并不存储数据或者配置信息,可是会缓存配置server的信息。


    3. 配置server
    存储集群的配置信息:数据和片的相应关系。

    配置server是帮mongos存放分片的配置信息的,mongos自己不存放数据。直接同步配置server中数据就可以。

    以下介绍具体过程:

    首先要启动配置server和mongos。
    配置server须要先启动,由于mongos会用到其上的配置信息。


    第一步,启动配置server

    配置server的启动就像普通的mongod一样:

    mongod – config d:mongodbmongo.config --port 20000

    这里写图片描写叙述


    第二步,建立mongos进程

    建立mongos进程。以供应用程序连接。这样的路由server连接数据文件夹都不须要,但一定要指明配置server的位置:

    mongos --port 30000 --configdb 127.0.0.1:20000

    这里写图片描写叙述

    分片管理一般是通过mongos完毕的,完毕后效果例如以下:
    这里写图片描写叙述


    第三步,加入片

    加入片。片就是普通的mongod:
    这里写图片描写叙述
    这里写图片描写叙述
    连接刚才启动的mongos,为集群加入一个片。


    启动shell,连接mongos:
    确定连接的是mongos而不是mongod,通过addshard命令加入片:

    >mongo 127.0.0.1:30000
    mongos> use admin
    switched to db admin
    mongos> db.runCommand(
    ... {
    ... "addshard":"127.0.0.1:10000",
    ... "allowLocal":1
    ... }
    ... )
    { "shardAdded" : "shard0000", "ok" : 1 }
    mongos> db.runCommand(
    ... {
    ... "addshard":"127.0.0.1:10001",
    ... "allowLocal":1
    ... }
    ... )
    { "shardAdded" : "shard0001", "ok" : 1 }
    

    这里写图片描写叙述
    这里写图片描写叙述
    这里写图片描写叙述

    当在本机执行片的时候,得设定allowLocal键为true。MongoDB尽量避免由于错误的配置,将集群配置到本地,所以得让它知道这仅仅是开发,并且我们非常清楚自己在做什么。


    假设是生产环境中,则要将其部署在不同的机器上。


    想加入片的时候,就执行addshard,MongoDB会负责将片集成到集群


    第四步,切分数据

    MongoDB不会将存储的每一条数据都直接公布,得先在数据库和集合的级别将分片功能打开。
    假设是连接配置server,

    E:mongoin>mongo 127.0.0.1:20000
    MongoDB shell version: 2.0.6
    connecting to: 127.0.0.1:20000/test
    > use admin
    switched to db admin
    > db.runCommand({"enablesharding":"test"})
    {
    "errmsg" : "no such cmd: enablesharding",
    "bad cmd" : {
    "enablesharding" : "test"
    },
    "ok" : 0
    }
    

    这里写图片描写叙述

    应该是连接路由server,

    db.runCommand({"enablesharding":"test"})//将test数据库启用分片功能.

    对数据库分片后,其内部的集合便会存储到不同的片上,同一时候也是对这些集合分片的前置条件。
    在数据库级别启用了分片以后,就能够使用shardcollection命令堆积和进行分片:

    db.runCommand({"shardcollection":"test.refactor","key":{"name":1}})//对test数据库的lf集合进行分片,片键是name

    假设如今对lf集合加入数据,就会根据”name”的值自己主动分散到各个片上。

    这样分片就建立完毕啦!


    管理分片

    分片建立完毕后,怎样管理分片呢?
    分片信息主要存放在config数据库上,这样就能被不论什么连接到mongos的进程訪问到了。
    在shell中连接了mongos,并使用了use config数据库。

    查看分片
    通过db.shards.find()方法:
    这里写图片描写叙述

    查看状态
    db.printShardingStatus()
    这里写图片描写叙述

    删除分片

    db.runCommand({"removeshard":"127.0.0.1:10001"})
  • 相关阅读:
    《Java从入门到放弃》入门篇:Struts2的基本数据传递方式
    《Java从入门到放弃》入门篇:Struts2的常用基本标签
    《Java从入门到放弃》入门篇:Struts2的基本访问方式(二)
    《Java从入门到放弃》入门篇:Struts2的基本访问方式
    《Java从入门到放弃》入门篇:XMLHttpRequest的基本用法
    Unity 从StreamingAssets文件夹和PersistentData文件夹 保存读取AssetBundle资源 路径详解
    海外版本修改总结
    unity A*寻路 (三)A*算法
    unity A*寻路 (二)读取NavMesh数据
    unity A*寻路 (一)导出NavMesh数据
  • 原文地址:https://www.cnblogs.com/liguangsunls/p/7349859.html
Copyright © 2020-2023  润新知