MongoDB Sharding 机制分析
转载请注明出处:http://xiezhenye.com/2012/12/mongodb-sharding-%e6%9c%ba%e5%88%b6%e5%88%86%e6%9e%90.html
MongoDB 是一种流行的非关系型数据库。作为一种文档型数据库,除了有无 schema 的灵活的数据结构,支持复杂、丰富的查询功能外,MongoDB 还自带了相当强大的 sharding 功能。
要说 MongoDB 的 sharding,首先说说什么是 sharding。所谓 sharding 就是将数据水平切分到不同的物理节点。这里着重点有两个,一个是水平切分,另一个是物理节点。一般我们说数据库的分库分表有两种类型。一种是水平划分,比如按用户 id 取模,按余数划分用户的数据,如博客文章等;另一种是垂直划分,比如把用户信息放一个节点,把文章放另一个节点,甚至可以把文章标题基本信息放一个节点,正文放另一个节点。sharding 指的是前一种。而物理节点,主要是和如 mysql 等提供的表分区区分。表分区虽然也对数据进行了划分,但是这些分区仍然是在同一个物理节点上。
那么,为什么要使用 sharding 呢?sharding 解决了什么问题,带来了什么好处呢?不少人都经历过自己的网站、应用由小到大,用户越来越多,访问量越来越大,数据量也越来越大。这当然是好事。但是,以前一个服务器就可以抗下的数据库现在不行了。开始还可以做做优化,再加个缓存。但是再后来,无论如何都不是一个服务器能承受了。数据量也会很快超过服务器的硬盘容量。这时候,就不得不进行拆分,做 sharding 了。这里,sharding 可以利用上更多的硬件资源来解决了单机性能极限的问题。此外,将数据进行水平切分后,还会减小每个索引的体积。由于一般数据库的索引都是 B树结构,索引体积减小后,索引深度也会随之减小,索引查找的速度也会随之提高。对于一些比较费时的统计查询,还可以由此把计算量分摊到多个机器上同时运算,通过分布式来提高速度。
虽然 sharding 有很多好处,但是传统数据库做 sharding 会遇到很多麻烦事。首先是扩容和初始化的问题。比如,原来按用户 id 模 5,分了 5 个节点,后来随着数据增长,这 5 个也不够用了,需要再增加。这时候如果改成 10 个,则至少要挪动一半数据。如果不是整倍数,比如扩展到 7 个节点,那绝大部分数据都会被挪一遍。对于已经做了 sharding 的大规模数据库来说,这是一件相当可怕的事情。而且在数据迁移期间,通常都无法继续提供服务,这将造成很长时间的服务中断。对从一个未做 sharding 的数据库开始创建也是同样。如果使用虚拟节点,比如将数据划分成 1000 个虚拟节点,然后通过映射关系来找到对应的物理节点,可以有所改善。但仍然无法避免迁移过程中的服务中断。另一个麻烦事是数据路由。数据拆分以后,应用程序就需要去定位数据位于哪个节点。还需要将涉及多个节点的查询的结果合并起来。这个工作如果没有使用数据库中间件的话,就需要花不少功夫自己实现,即使使用了中间件,也很难做到透明。由于关系型数据库功能的复杂性,很多功能在 sharding 上将无法正常使用。比如 join 、事务等。因此会造成应用层的大量修改测试工作。
sharding 会有这许多麻烦事,那么 MongoDB 的 sharding 又如何呢?
MongoDB 的 sharding 的特色就是自动化。具体体现为可以动态扩容、自动平衡数据、以及透明的使用接口。可以从一个普通的 replica set,或者单个实例平滑升级,可以动态增加删除节点,响应数据快速增长。可以自动在节点间平衡数据量,避免负载集中在少数节点,而在这期间不影响数据库读写访问。对客户端,可以使用完全相同的驱动,大部分功能可用,基本不需要更改任何代码。
MongoDB 的 sharding 有如此强大的功能,它的实现机制是怎样的呢?下图就是 MongoDB sharding 的结构图。
从图中可以看出,MongoDB sharding 主要分为 3 大部分。shard 节点、config 节点和 config 节点。对客户端来说,直接访问的是图中绿色的 mongos 节点。背后的 config 节点和 shard 节点是客户端不能直接访问的。mongos 的主要作用是数据路由。从元数据中定位数据位置,合并查询结果。另外,mongos 节点还负责数据迁移和数据自动平衡,并作为 sharding 集群的管理节点。它对外的接口就和普通的 mongod 一样。因此,可以使用标准 mongodb 客户端和驱动进行访问。mongos 节点是无状态的,本身不保存任何数据和元数据,因此可以任意水平扩展,这样任意一个节点发生故障都可以很容易的进行故障转移,不会造成严重影响。
其中蓝色的 shard 节点就是实际存放数据的数据节点。每个 shard 节点可以是单个 mongod 实例,也可以使一个 replica set 。通常在使用 sharding 的时候,都会同时使用 replica set 来实现高可用,以免集群内有单个节点出故障的时候影响服务,造成数据丢失。同时,可以进一步通过读写分离来分担负载。对于每个开启 sharding 的 db 来说,都会有一个默认 shard 。初始时,第一个 chunk 就会在那里建立。新数据也就会先插入到那个 shard 节点中去。
图中紫色的 config 节点存储了元数据,包括数据的位置,即哪些数据位于哪些节点,以及集群配置信息。config 节点也是普通的 mongod 。如图所示,一组 config 节点由 3 个组成。这 3 个 config 节点并非是一个 replica set。它们的数据同步是由 mongos 执行两阶段提交来保证的。这样是为了避免复制延迟造成的元数据不同步。config 节点一定程度上实现了高可用。在一个或两个节点发生故障时,config 集群会变成只读。但此时,整个 sharding 集群仍然可以正常读写数据。只是无法进行数据迁移和自动均衡而已。
config 节点里存放的元数据都有些啥呢?连上 mongos 后,
use config; show collections
结果是
settings
shards
databases
collections
chunks
mongos
changelog
还可以进一步查看这些东西的数据。这个 config 库就是后端 config 节点上的数据的映射,提供了一个方便的读取元数据的入口。这些 collection 里面都是什么呢? settings 里是 sharding 的配置信息,比如数据块大小,是否开启自动平衡。shards 里存放的是后端 shard 节点的信息,包括 ip,端口等。databases 里存放的是数据库的信息,是否开启 sharding,默认 shard 等。collections 中则是哪些 collection 启用了 sharding,已经用了什么 shard key。chunks 里是数据的位置,已经每个 chunk 的范围等。mongos 里是关于 mongos 的信息,changelog 是一个 capped collection,保存了最近的 10m 元数据变化记录。
mongodb sharding 的搭建也很容易。简单的几步就能完成。
先启动若干 shard 节点
mongod --shardsvr
启动 3 个 config 节点
mongod --configsvr
启动 mongos
mongos --configdb=192.168.1.100, 192.168.1.101, 192.168.1.102
这里,–shardsvr 参数只起到修改默认端口为 27018 作用,–configsvr 则修改默认端口为 27019 以及默认路径为 /data/configdb。此外并没有什么直接作用。实际使用时,也可以自己指定端口和数据路径。此外,这两个参数的另一个作用就是对进程进行标记,这样在 ps aux 的进程列表里,就很容易确定进程的身份。–configdb 参数就是 config 节点的地址。如果更改了默认端口,则需要在这里加上。
然后我们把数据节点加入集群:在 mongos 上运行
use admin
sh.addShard(’ [hostname]:[port]’)
如果使用的事 replicaSet,则是
use admin
sh.addShard(’replicaSetName/,,’)
接着就是启用 sharding 了。
sh.enableSharding(dbname)
sh.shardCollection(fullName, key, unique)
这样就可以了。还是很简单的吧。如果 collection 里有数据,则会自动进行数据平衡。
之前说过,mongodb 的 sharding 把数据分成了数据块(chunk)来进行管理。现在来看看 chunk 究竟是怎么回事。在 mongodb sharding 中,chunk 是数据迁移的基本单位。每个节点中的数据都被划分成若干个 chunk 。一个 chunk 本质上是 shard key 的一个连续区间。chunk 实际上是一个逻辑划分而非物理划分。sharding 的后端就是普通的 mongod 或者 replica set,并不会因为是 sharding 就对数据做特殊处理。一个 chunk 并不是实际存储的一个页或者一个文件之类,而是仅仅在 config 节点中的元数据中体现。mongodb 的sharding 策略实际上就是一个 range 模式。
如图,第一个 chunk 的范围就是 uid 从 -∞ 到 12000 范围内的数据。第二个就是 12000 到 58000 。以此类推。对于一个刚配置为 sharding 的 collection ,最开始只有一个 chunk,范围是从 -∞ 到 +∞。
随着数据的增长,其中的数据大小超过了配置的 chunk size,默认是 64M 则这个 chunk 就会分裂成两个。因为 chunk 是逻辑单元,所以分裂操作只涉及到元数据的操作。数据的增长会让 chunk 分裂得越来越多。这时候,各个 shard 上的 chunk 数量就会不平衡。这时候,mongos 中的一个组件 balancer 就会执行自动平衡。把 chunk 从 chunk 数量最多的 shard 节点挪动到数量最少的节点。
最后,各个 shard 节点上的 chunk 数量就会趋于平衡。当然,balance 不一定会使数据完全平均,因为移动数据本身有一定成本,同时为了避免极端情况下早晨数据来回迁移,只有在两个 shard 的 chunk 数量之差达到一定阈值时才会进行。默认阈值是 8 个。也就是说,默认情况下,只有当两个节点的数据量差异达到 64M * 8 == 256M 的时候才会进行。这样就不用对刚建好的 sharding ,插入了不少数据,为什么还是都在一个节点里感到奇怪了。那只是因为数据还不够多到需要迁移而已。
在数据迁移的过程中,仍然可以进行数据读写,并不会因此而影响可用性。那么 mongodb 是怎么做到的呢?在数据迁移过程中,数据读写操作首先在源数据节点中进行。待迁移完毕后,再将这期间的更新操作同步到新节点中去。最后再更新 config 节点,标记数据已经在新的地方,完成迁移。只有在最后同步迁移期间的操作的时候,需要锁定数据更新。这样就讲锁定时间尽可能缩小,大大降低数据迁移对服务的影响。
mongodb 的 sharding 和传统 sharding 的最大区别就在于引入了元数据。看似增加了复杂度,并增加了一些额外的存储,但是由此带来的灵活性却是显而易见的。传统的 sharding 本质上是对数据的静态映射,所有那些数据迁移的困难都是由此而来。而引入元数据以后,就变静态映射为动态映射。数据迁移就不再是难事了。从而从根本上解决了问题。另一方面,用元数据实现 chunk 则降低了实现难度,后端节点仍然可以使用原有的技术。同时,因为不需要对后端数据进行变动,也使部署迁移变得更容易,只需要另外加上 mongos 节点和 config 节点即可。
再说说数据路由功能。mongos 的最主要功能就是作为数据路由,找到数据的位置,合并查询结果。来看看它是如何处理的。如果查询的条件是 shard key ,那么 mongos 就能从元数据直接定位到 chunk 的位置,从目标节点找到数据。
如果查询条件是 shard key 的范围,由于 chunk 是按 shard key 的范围来划分的,所以 mongos 也可以找到数据对应 chunk 的位置,并把各个节点返回的数据合并。
如果查询的条件不是任何一个索引,原来的全 collection 遍历仍然不可避免。但是会分发到所有节点进行。所以,还是可以起到分担负载的作用。
如果查询的条件是一个索引,但不是 shard key,查询也会被分发到所有节点,不过在每个节点上索引仍然有效。
如果是按查询 shard key 进行排序,同样由于 chunk 是一个 shard key 的范围,则会依次查询各 chunk 所在节点,而无需返回所有数据再排序。如果不是按 shard key 排序,则会在每个节点上执行排序操作,然后由 mongos 进行归并排序。由于是对已排序结果的归并排序,所以在 mongos 上不会有多少压力,查询结果的游标也会变成在每个节点上的游标。并不需要把所有数据都吐出来。
从上面可以看到,对 sharding 集群来说,shard key 的选择是至关重要的。shard key 其实就相当于数据库的聚簇索引,所以选择聚簇索引的原则和选择 shard key 的原则是差不多的。同样, shard key 一旦设定就无法再更改,所以,选择的时候就要谨慎。shard key 的选择主要就这么几点。
首先,shard key 的值要是固定的,不会被更改的。因为一旦这个值被更改,就有可能会从一个节点被挪动到另一个节点,从而带来很大的开销。
第二,shard key 要有足够的区分度。同样因为 chunk 是一个 shard key 的范围,所以 shard key 相同的值只能位于同一个 chunk 。如果 shard key 相同的值很大,致使一个 chunk 的大小超过了 chunk size,也无法对 chunk 进行分裂,数据均衡。同时,和一般的数据库索引一样,更好的区分度也能提高查询性能。
第三,shard key 还要有一定的随机性而不是单向增长。单向增长的 shard key 会导致新插入的数据都位于一个 chunk 中,在在某一个 shard 节点中产生集中的写压力。所以,最好避免直接使用 _id ,时间戳这种单向增长的值作为 shard key。
mongodb 的 sharding 有很多优势,但是也同样有其局限性。
首先,mongodb 只提供了 range 模式的 sharding。这种模式虽然可以对按 shard key进行 range 查询、排序进行优化,但是也会造成使用单向增长的值时,写入集中的结果。
第二,启用了 sharding 之后,就无法保证除 shard key 以为其他的索引的唯一性。即使设为 unique,也只是保证在每个节点中唯一。有一个办法是,把索引设为 {<shard_key>:1, <unique_key>:1} 。但是这样并不一定满足业务逻辑需求。
第三,启用 sharding 后,无法直接使用 group() 。但是可以用 map reduce 功能作为替代。
第四,虽然数据迁移操作对读写影响很小,但是这个过程需要先把数据从磁盘中换入内存才能进行,所以可能会破坏热数据缓存。此外,数据迁移也还是会增大 io 压力,所以可以考虑平时关闭自动平衡,在凌晨压力小的时候再进行。
最后,config 节点的元数据同步对时钟准确性要求比较高,一旦各 config 时钟误差大了,就会出现无法上锁,从而无法更改,导致数据集中。因此 ntp 时钟同步时必不可少的。
在这里再说一下 sharding 集群的备份问题。由于后端数据节点仍然是普通的 mongod 或 replica set,所以备份其实和原先差不多。只是需要注意的是,备份前需要停止自动平衡,保证备份期间 sharding 的元数据不会变动,然后备份 shard 节点和 config 节点数据即可。
配置mongodb分片群集(sharding cluster)
Sharding cluster介绍
这是一种可以水平扩展的模式,在数据量很大时特给力,实际大规模应用一般会采用这种架构去构建monodb系统。
要构建一个 MongoDB Sharding Cluster,需要三种角色:
Shard Server: mongod 实例,用于存储实际的数据块,实际生产环境中一个shard server角色可由几台机器组个一个relica set承担,防止主机单点故障
Config Server: mongod 实例,存储了整个 Cluster Metadata,其中包括 chunk 信息。
Route Server: mongos 实例,前端路由,客户端由此接入,且让整个集群看上去像单一数据库,前端应用可以透明使用。
Sharding架构图:
本例实际环境架构
本例架构示例图:
<!--[if !supportLists]-->1. <!--[endif]-->分别在3台机器运行一个mongod实例(称为mongod shard11,mongod shard12,mongod shard13)组织replica set1,作为cluster的shard1
<!--[if !supportLists]-->2. <!--[endif]-->分别在3台机器运行一个mongod实例(称为mongod shard21,mongod shard22,mongod shard23)组织replica set2,作为cluster的shard2
<!--[if !supportLists]-->3. <!--[endif]-->每台机器运行一个mongod实例,作为3个config server
<!--[if !supportLists]-->4. <!--[endif]-->每台机器运行一个mongs进程,用于客户端连接
主机 |
IP |
端口信息 |
Server1 |
10.1.1.1 |
mongod shard11:27017 |
Server2 |
10.1.1.2 |
mongod shard12:27017 |
Server3 |
10.1.1.3 |
mongod shard13:27017 |
软件准备
软件准备
1. 创建用户
groupadd -g 20001 mongodb
useradd -u 20001 -g mongodb mongodb
passwd mongodb
2. 安装monodb软件
su – mongodb
tar zxvf mongodb-linux-x86_64-1.6.2.tar
安装好后,目录结构如下:
$ tree mongodb-linux-x86_64-1.6.2
mongodb-linux-x86_64-1.6.2
|– GNU-AGPL-3.0
|– README
|– THIRD-PARTY-NOTICES
`– bin
|– bsondump
|– mongo
|– mongod
|– mongodump
|– mongoexport
|– mongofiles
|– mongoimport
|– mongorestore
|– mongos
|– mongosniff
`– mongostat
1 directory, 14 files
3. 创建数据目录
根据本例sharding架构图所示,在各台sever上创建shard数据文件目录
Server1:
su – monodb
cd /home/monodb
mkdir -p data/shard11
mkdir -p data/shard21
Server2:
su – monodb
cd /home/monodb
mkdir -p data/shard11
mkdir -p data/shard22
Server3:
su – monodb
cd /home/monodb
mkdir -p data/shard13
mkdir -p data/shard23
配置relica sets
1. 配置shard1所用到的replica sets:
Server1:
cd /home/mongodb/mongodb-linux-x86_64-1.6.2/bin
./mongod –shardsvr –replSet shard1 –port 27017 –dbpath /home/mongodb/data/shard11 –oplogSize 100 –logpath /home/mongodb/data/shard11.log –logappend –fork
Server2:
cd /home/mongodb/mongodb-linux-x86_64-1.6.2/bin
./mongod –shardsvr –replSet shard1 –port 27017 –dbpath /home/mongodb/data/shard12 –oplogSize 100 –logpath /home/mongodb/data/shard12.log –logappend –fork
Server3:
cd /home/mongodb/mongodb-linux-x86_64-1.6.2/bin
./mongod –shardsvr –replSet shard1 –port 27017 –dbpath /home/mongodb/data/shard13 –oplogSize 100 –logpath /home/mongodb/data/shard13.log –logappend –fork
初始化replica set
用mongo连接其中一个mongod,执行:
> config = {_id: ‘shard1′, members: [
{_id: 0, host: '10.1.1.1:27017'},
{_id: 1, host: '10.1.1.2:27017'},
{_id: 2, host: '10.1.1.3:27017'}]
}
> rs.initiate(config);
同样方法,配置shard2用到的replica sets:
server1:
cd /home/mongodb/mongodb-linux-x86_64-1.6.2/bin
./mongod –shardsvr –replSet shard2 –port 27018 –dbpath /home/mongodb/data/shard21 –oplogSize 100 –logpath /home/mongodb/data/shard21.log –logappend –fork
server2:
cd /home/mongodb/mongodb-linux-x86_64-1.6.2/bin
./mongod –shardsvr –replSet shard2 –port 27018 –dbpath /home/mongodb/data/shard22 –oplogSize 100 –logpath /home/mongodb/data/shard22.log –logappend –fork
server3:
cd /home/mongodb/mongodb-linux-x86_64-1.6.2/bin
./mongod –shardsvr –replSet shard2 –port 27018 –dbpath /home/mongodb/data/shard23 –oplogSize 100 –logpath /home/mongodb/data/shard23.log –logappend –fork
初始化replica set
用mongo连接其中一个mongod,执行:
> config = {_id: ‘shard2′, members: [
{_id: 0, host: '10.1.1.1:27018'},
{_id: 1, host: '10.1.1.2:27018'},
{_id: 2, host: '10.1.1.3:27018'}]
}
> rs.initiate(config);
到此就配置好了二个replica sets,也就是准备好了二个shards
配置三台config server
Server1:
mkdir -p /home/mongodb/data/config
./mongod –configsvr –dbpath /home/mongodb/data/config –port 20000 –logpath /home/mongodb/data/config.log –logappend –fork #config server也需要dbpath
Server2:
mkdir -p /home/mongodb/data/config
./mongod –configsvr –dbpath /home/mongodb/data/config –port 20000 –logpath /home/mongodb/data/config.log –logappend –fork
Server3:
mkdir -p /home/mongodb/data/config
./mongod –configsvr –dbpath /home/mongodb/data/config –port 20000 –logpath /home/mongodb/data/config.log –logappend –fork
配置mongs
在server1,server2,server3上分别执行:
./mongos –configdb 10.1.1.1:20000,10.1.1.2:20000,10.1.1.3:20000 –port 30000 –chunkSize 5 –logpath /home/mongodb/data/mongos.log –logappend –fork
#mongs不需要dbpath
Configuring the Shard Cluster
连接到其中一个mongos进程,并切换到admin数据库做以下配置
1. 连接到mongs,并切换到admin
./mongo 10.1.1.1:30000/admin
>db
Admin
2. 加入shards
如里shard是单台服务器,用>db.runCommand( { addshard : “<serverhostname>[:<port>]” } )这样的命令加入,如果shard是replica sets,用replicaSetName/<serverhostname>[:port][,serverhostname2[:port],…]这样的格式表示,例如本例执行:
>db.runCommand( { addshard : “shard1/10.1.1.1:27017,10.1.1.2:27017,10.1.1.3:27017″,name:”s1″,maxsize:20480} );
>db.runCommand( { addshard : “shard2/10.1.1.1:27018,10.1.1.2:27018,10.1.1.3:27018″,name:”s2″,maxsize:20480} );
注意:在添加第二个shard时,出现error:test database 已经存在的错误,这里用mongo命令连接到第二个replica set,用db.dropDatabase()命令把test数据库给删除然后就可加入
3. 可选参数
Name:用于指定每个shard的名字,不指定的话系统将自动分配
maxSize:指定各个shard可使用的最大磁盘空间,单位megabytes
4. Listing shards
>db.runCommand( { listshards : 1 } )
如果列出了以上二个你加的shards,表示shards已经配置成功
5. 激活数据库分片
命令:
> db.runCommand( { enablesharding : “<dbname>” } );
通过执行以上命令,可以让数据库跨shard,如果不执行这步,数据库只会存放在一个shard,一旦激活数据库分片,数据库中不同的collection将被存放在不同的shard上,但一个collection仍旧存放在同一个shard上,要使单个collection也分片,还需单独对collection作些操作
Collecton分片
要使单个collection也分片存储,需要给collection指定一个分片key,通过以下命令操作:
> db.runCommand( { shardcollection : “<namespace>”,key : <shardkeypatternobject> });
注:
a. 分片的collection系统会自动创建一个索引(也可用户提前创建好)
b. 分片的collection只能有一个在分片key上的唯一索引,其它唯一索引不被允许
One note: a sharded collection can have only one unique index, which must exist on the shard key. No other unique indexes can exist on the collection.
分片collection例子
>db.runCommand( { shardcollection : “test.c1″,key : {id: 1} } )
>for (var i = 1; i <= 200003; i++) db.c1.save({id:i,value1:”1234567890″,value2:”1234567890″,value3:”1234567890″,value4:”1234567890″});
> db.c1.stats()
{
“sharded” : true,
“ns” : “test.c1″,
“count” : 200003,
“size” : 25600384,
“avgObjSize” : 128,
“storageSize” : 44509696,
“nindexes” : 2,
“nchunks” : 15,
“shards” : {
“s1″ : {
“ns” : “test.c1″,
“count” : 141941,
“size” : 18168448,
“avgObjSize” : 128,
“storageSize” : 33327616,
“numExtents” : 8,
“nindexes” : 2,
“lastExtentSize” : 12079360,
“paddingFactor” : 1,
“flags” : 1,
“totalIndexSize” : 11157504,
“indexSizes” : {
“_id_” : 5898240,
“id_1″ : 5259264
},
“ok” : 1
},
“s2″ : {
“ns” : “test.c1″,
“count” : 58062,
“size” : 7431936,
“avgObjSize” : 128,
“storageSize” : 11182080,
“numExtents” : 6,
“nindexes” : 2,
“lastExtentSize” : 8388608,
“paddingFactor” : 1,
“flags” : 1,
“totalIndexSize” : 4579328,
“indexSizes” : {
“_id_” : 2416640,
“id_1″ : 2162688
},
“ok” : 1
}
},
“ok” : 1
}
<!--[if !supportLineBreakNewLine]-->实例参考: <!--[endif]-->
mongod --shardsvr --port 27017 --dbpath data/shard1 --oplogSize 100 --logpath data/shard1.log --logappend --fork mongod --shardsvr --port 27018 --dbpath data/shard2 --oplogSize 100 --logpath data/shard2.log --logappend --fork mongod --shardsvr --port 27019 --dbpath data/shard3 --oplogSize 100 --logpath data/shard3.log --logappend --fork mongod --shardsvr --port 27017 --dbpath data/shard4 --oplogSize 100 --logpath data/shard4.log --logappend --fork mongod --shardsvr --port 27018 --dbpath data/shard5 --oplogSize 100 --logpath data/shard5.log --logappend --fork mongod --shardsvr --port 27019 --dbpath data/shard6 --oplogSize 100 --logpath data/shard6.log --logappend --fork mongod --shardsvr --port 27017 --dbpath data/shard7 --oplogSize 100 --logpath data/shard7.log --logappend --fork mongod --shardsvr --port 27018 --dbpath data/shard8 --oplogSize 100 --logpath data/shard8.log --logappend --fork mongod --shardsvr --port 27019 --dbpath data/shard9 --oplogSize 100 --logpath data/shard9.log --logappend --fork --config server mongod -configsvr -dbpath data/config -port 20000 -logpath data/config.log -logappend -fork --router server mongos -configdb 10.60.17.211:20000,10.60.17.212:20000,10.60.17.213:20000 -port 30000 -chunkSize 8 -logpath data/mongos.log -logappend -fork --listshard db.runCommand({listshards:1}) db.runCommand({addshard:"10.60.17.211:27017",name:"s1"}); db.runCommand({addshard:"10.60.17.211:27018",name:"s2"}); db.runCommand({addshard:"10.60.17.211:27019",name:"s3"}); db.runCommand({addshard:"10.60.17.212:27017",name:"s4"}); db.runCommand({addshard:"10.60.17.212:27018",name:"s5"}); db.runCommand({addshard:"10.60.17.212:27019",name:"s6"}); db.runCommand({addshard:"10.60.17.213:27017",name:"s7"}); db.runCommand({addshard:"10.60.17.213:27018",name:"s8"}); db.runCommand({addshard:"10.60.17.213:27019",name:"s9"}); db.runCommand({enablesharding:"antelope"}); db.runCommand({shardcollection:"antelope.LfqmPdfInfBean",key:{"pdfCertificate.pdfCreatTime":1,accpAuthority:1,boardPlank:1}}); db.LfqmPdfInfBean.stats(); --import data cp ./target/antelope-import-pdf-1.0.0-SNAPSHOT.jar ~/workspace/import/antelope-import-pdf.jar nohup java -jar antelope-import-pdf.jar data 12 kill -9 `lsof -i:9090 | tail -1 | awk ' "$1" != ""{print $2} '` mvn install -Dmaven.test.skip var a = new Date(); var b = new Date(); a.setFullYear(2009,0,1); b.setFullYear(2009,11,31); db.LfqmPdfInfBean.count({ "inDate" :{"$gte":a,"$lte":b}}); db.LfqmPdfInfBean.remove({ "inDate" :{"$gte":a,"$lte":b}}); var a = new Date(); var b = new Date(); a.setFullYear(2010,0,1); b.setFullYear(2010,11,31); db.LfqmPdfInfBean.count({ "inDate" :{"$gte":a,"$lte":b}}); db.LfqmPdfInfBean.remove({ "inDate" :{"$gte":a,"$lte":b}}); var a = new Date(); var b = new Date(); a.setFullYear(2013,0,1); b.setFullYear(2013,4,16); db.LfqmPdfInfBean.find({ "pdfCertificate.pdfCreatTime" : { "$gte" :a , "$lte" :b} , "accpAuthority" : { "$in" : [ "CC" , "NV"]} , "boardPlank" : "Y"}).limit(10); kill -9 `lsof -i:30000 | tail -1 | awk ' "$1" != ""{print $2} '` kill -9 `lsof -i:20000 | tail -1 | awk ' "$1" != ""{print $2} '` kill -9 `lsof -i:27017 | tail -1 | awk ' "$1" != ""{print $2} '` kill -9 `lsof -i:27018 | tail -1 | awk ' "$1" != ""{print $2} '` kill -9 `lsof -i:27019 | tail -1 | awk ' "$1" != ""{print $2} '` kill -9 `lsof -i:9091 | tail -1 | awk ' "$1" != ""{print $2} '`
相关推荐
以下是对MongoDB分片的详细说明: 1. **启动相关进程** - **Shard Server**: 在分片服务器上,需要启动`mongod`进程,并添加`--shardsvr`参数。如果是主从模式,还需使用`--pairwith`指定其伙伴节点。 - **Config...
k8s 安装 MongoDB 分片(Sharding)+ 副本集(Replica Set) k8s 安装 MongoDB 分片(Sharding)+ 副本集(Replica Set)是结合 Kubernetes(k8s)和 MongoDB 实现高可用性和高性能的解决方案。本解决方案通过使用 ...
本文将详细介绍MongoDB的分片备份以及复制集的备份方法。 **1. 分片备份** MongoDB 分片是将大数据集分散到多个物理节点上,以提高查询性能和存储容量。分片备份主要涉及配置服务器(Config Server)的备份。配置...
### 实验五 MongoDB分片部署与启动 #### 实验综述 本次实验旨在深入学习MongoDB的分片机制,理解并掌握如何部署一个基于多服务器的MongoDB分片集群。分片是MongoDB的一项重要特性,它允许将数据分散存储在多个物理...
MongoDB分片集群是一种分布式数据存储结构,可以实现水平扩展。分片集群由三部分组成:mongos路由服务器、config配置服务器和多个分片节点。mongos作为路由服务器,负责接收客户端请求并将其转发到正确的分片。...
MongoDB分片设计是针对大数据量的存储和处理提出的解决方案。在大数据环境下,单个数据库服务器往往难以满足高性能和高可用性的需求。MongoDB通过分片(Sharding)技术来解决这个问题。分片是一种将数据分散存储在多...
MongoDB分片副本级 详细的讲述了MongoDB分片副本级配置
13、MongoDB分片集群&高级集群架构详解_ev.rar13、MongoDB分片集群&高级集群架构详解_ev.rar13、MongoDB分片集群&高级集群架构详解_ev.rar13、MongoDB分片集群&高级集群架构详解_ev.rar13、MongoDB分片集群&高级集群...
MongoDB4.2分片及副本集群搭建 MongoDB集群 MongoDB分片 MongoDB副本 MongoDB副本集群
MongoDB的分片技术是一种用于处理大数据量的分布式数据库策略,它通过将数据水平分割并分布在多个服务器上,以提高存储容量和数据处理性能。在MongoDB中,分片(Sharding)是解决大规模数据存储和高并发访问的有效...
MongoDB 分片是大型数据库系统中用于横向扩展存储能力的关键技术。在 CentOS 7 上部署 MongoDB 分片集群是一项复杂但必要的任务,特别是当处理大量数据并需要高效读写性能时。以下是一个详细的步骤指南,涵盖了从...
一、MongoDB分片概念 1. 分片集群:由多个MongoDB服务器组成的系统,包括分片服务器、路由进程(Mongos)和配置服务器(Config Server)。路由进程负责处理客户端请求,确定数据应存储或检索的位置,并将请求转发到...
MongoDB的分片技术是为了解决大数据存储和高性能需求而设计的一种分布式数据库解决方案。...通过深入了解和熟练掌握这些概念,可以更好地管理和优化MongoDB分片集群,以应对大规模数据处理的挑战。
### MongoDB分片技术详解 #### 一、MongoDB分片概念 MongoDB 分片是一种将数据分布在网络中的多个服务器上的方法。它通过水平分割数据来提高可伸缩性和性能,适用于处理大量数据和高并发访问场景。分片的核心组件...
MongoDB 是一个高性能、分布式、开源的文档型数据库,它支持分片(sharding)和副本集(replica sets)来实现水平扩展和高可用性。分片是将数据分散到多个物理节点上,以处理大数据量和高并发场景;副本集则是为了...
首先,我们需要了解MongoDB分片的概念。在MongoDB中,分片(Sharding)是指将数据分布在多个物理节点上,以实现水平扩展,即增加存储容量和处理能力。每个分片可以看作是数据库的一部分,它们共同承载整个数据库的...
内容概要:本文提供了详细的MongoDB分片集群的搭建指导,涵盖了从环境准备、配置文件编写、副本集的建立、主节点的选择、配置服务器和数据分片服务器的配置到最后的路由节点的搭建与操作整个流程,以及对数据库的...
MongoDB分片副本集集群搭建的知识点包含了以下几个方面: 1. MongoDB分片架构的基本组成:MongoDB分片架构由mongos(路由服务器)、config-server(配置服务器)和shard(分片服务器)三部分组成。mongos负责作为...
MongoDB分片集群由以下组件组成: - **分片服务器(Shard)**:实际存储数据的MongoDB实例。 - **路由进程(Mongos)**:客户端与数据库之间的中间层,负责查询路由和数据分发。 - **配置服务器(Config Server...
以下是对MongoDB分片实例的详细说明: 1. **MongoDB 分片结构** - **客户端(Client)**:应用程序与MongoDB交互的接口。 - **mongos(路由服务器)**:作为客户端与数据存储之间的中间层,负责数据的路由和分发...