MongoDB数据库的自动分片技术就是将原先数据库中集合依据一定的规则切分成若干小块,这些分片小块统一由mongos路由管理,当有请求查询或写入时,路由会依据分片shard key规则找到对应的分片操作。分片解决了写密集操作,用于分散单一写服务器负载。亦或者原先的存储空间不够了,这个时候可能通过分片操作将之后的数据写入其它存储空间上。可以看出,集合的分片和数据库的分表类似,并且每个分片都支持写操作。
由于分片的出现,导致数据被分布式的存储到不同的服务器上,当某一服务器出现问题时就可能导致数据丢失,其次路由mongos也会出现问题,另外存储分片的信息的配置服务器也可能会发生问题。当然我们可以利用master salve/Replica sets机制去备份每个分片、Mongos、configs 。如下官网配置图示,即使我们使用服务器交叉备份也需要大量的服务器资源,因此分片是一件***耗费资源的事情。官网的配置图示
首先路由从config中读取配置信息,发生的分片动态增加也会通过mongos写入config servres中,当client有请求时通过mongos查找到对应的分片。可以看出分片使用的replica set备份模式,而mongos/config servrs则是多个服务器配置。下面就手动实现一下分片的过程。(换环境了继续昨天未完成的,前2天在笔记本上)
1)创建configs服务器
- ....bin>mongod --dbpath "e:\mongodb\data\configs" --port 23017
2)创建mongos服务器 并指定依赖的配置服务器 (mongos依赖于配置服务器,mongos查询的分片信息都存储在configs中)
- ....bin>mongos --port 25017 --configdb 127.0.0.1:23017
3)创建多个分片服务器 (负责数据存储)
- ....bin>mongod --port 27017 --dbpath "e:\mongodb\data\dbs\shard27017"
为shard27017分片服务器 创建test库foo集合,并且为foo集创建name索引。
4)连接mongos服务器添加shard27017分片服务器到configs服务器中。
- >use admin
- >db.runCommand({addshard:"127.0.0.1:27017",allowLoacl:true}) //添加分片服务器,allowLoacl 充许本地部署 默认情况不充许本地部署多个分片的
一旦分片添加成功,在mongos服务器中执行 show dbs就可以看到分片服务器的数据库,并且可以操作分片服务器的数据 ,下面为分片服务器的test库foo集合设置分片以及分片shard key。
- >db.runCommand({"enablesharding":"test"}) //对test库启用分片功能
注意:需要分片的集合 的shard key必须是索引键, (我们也可以在mongos为分片foo集合创建索引)
- >db.runCommand({"shardcollection":"test.foo","key":{"name":1}}) //数字代表排序
至此自动分片就创建完成了,可以在mongos或configs服务器查询分片信息。
当一个分片服务器存储不够时,通过像3)方式继续添加分片服务器,monogs会自实现这些分片的集群工作。
当需要移除分片时运行下面的命令,同时mongos路由会将此分片服务器上的信息移到其它分片上。
- >db.runCommand({"removeshard":"127.0.0.1:27017"})
简单的分析一下这个shard key,当不是写密集操作时,而仅仅是因为存储空间不够了,这个shard key我们可以选用一些无上限范围的key,如创建时间等,这样新创建的记录都会写入新的分片服务器上。
当需要使每个分片均匀分布数据时,或者写入密集时,***选用有一定范围值的key ,当然这个范围不能太小,像性别,真假等,这会导致只自动产生两个分片,所以一定要选择合适的shard key才能达到理想的效果。
关于MongoDB数据库的自动分片技术就介绍到这里,希望通过本次的介绍能够带给您一些收获。
【编辑推荐】