分片
1. 分片(sharding)是指将数据拆分,将其分散存放在不同的机器上的过程。有时也用分区(partitioning)来表示这个概念。将数据分散到不同的机器上,不需要功能强大的大型计算机就可以
存储更多的数据,处理更大的负载。
2. MongoDB支持自动分片(autosharding),可以使数据库架构对应用程序不可见,也可以简化系统管理。对应用程序而言,好像始终在使用一个单机的MongoDB服务器一样。另一方面,
mongoDB自动处理数据在分片上的分布,也更容易添加和删除分片技术。
3. 复制与分片的区别:复制时让多台服务器都拥有同样的数据副本,每一台服务器都是其他服务器的镜像,而每一个分片都和其他分片拥有不同的数据子集。
4. 路由服务器:为了对应用程序隐藏数据库架构的细节,在分片之前要先执行mongos进行一次路由过程。这个路由服务器维护这一个"内容列表",指明了每个分片包含什么数据内容。应用
程序只需要连接路由服务器,就可以像使用单机一样进行正常的请求了。
5. 运行sh.status()可以看到集群的状态:分片摘要信心、数据库摘要信息、集合摘要信息。
6. 要对一个集合分片,首先你要对这个集合的数据库启用分片,执行如下命令:sh.enableSharding("test")
7. 片键:片键是集合的一个键,MongoDB根据这个键拆分数据。例如:username 。在启用分片之前,现在希望作为片键的键上创建索引:db.users.ensureIndex({"username":1})
8. 对集合分片:sh.shardCollection("test.users",{"username":1})
9. 集合被拆分为多个数据块,每个数据块都是集合的一个数据子集。这是按照片键的范围排列的({"username":minValue}-->>{"username":maxValue}指出了每个数据块的范围)。
10. 包含片键的查询能够直接被发送到目标分片或者是集群分片的一个子集。这样的查询叫做定向查询(targetd query)。有些查询必须被发送到所有分片,这样的查询叫做分散-聚合查询(
scatter-gather query);mongos将查询分散到所有的分片上,然后经各个分片的查询结果聚集起来。
11. cluster.stop() 关闭整个集群。
BSON类型
配置分片:
1. 何时进行分片:决定何时分片是一个值得权衡的问题。通常不必太早分片,因为分片不仅会增加部署的操作复杂度,还要求做出设计决策,而改决策以后很难再改。另外最好也不要在系统
运行太久之后再分片,因为在一个过载的系统上不停机进行分配是很困难的。
2. 分片的目的:增加可用的RAM,增加可用磁盘空间,减轻单台服务器的负载,处理单个mongod无法承受的吞吐量。
3. 一般情况下至少应该创建3个或者以上的分片。
4. 启动服务器:
1). 配置服务器:配置服务器相当于集群的大脑,保存着集群和分片的元数据,即各分片包含哪些数据的信息。因此,应该首先建立配置服务器,监狱它所包含的的数据极端重要性,必须启用
其日志功能,并确保其数据保存在非易失性驱动器上。每个配置服务器都应该位于单独的物理机上,最好是分布在不同地址位置的机器行。
a. 启动配置服务器:mongod --configsvr --dbpath /var/lib/mongodb -f /var/lib/config/mognd.conf 。需要启动三台配置服务器,且都是可写的。
为什么是3台配置服务器?因为我们需要考虑不时之需。但是,也不需要过多的配置服务器,因为配置服务器上的确认操作比较耗时。另外,如果有服务器宕机了,集群元数据就会变成只读的。
--configsvr 选项指定mongod为新配置服务器。该选项并非必选项,因为它所做的不过是将mongod的默认监听端口改为27019,并大默认的数据目录改为/data/configdb而已(可以使用
--port 和 --dbpath 选项修改这两项配置)。但建议使用--configsvr选项,因为它比价直白地说明了这些配置服务器的用途。
配置服务器的1KB相当于200MB知识数据,它保存的真实数据的分布表。由于配置服务器并不需要太多的资源,因此可以将其部署在运行着其他程序的服务器上。
2). mongos进程:三个配置服务器均处于运行状态后,启动一个mongos进程供应用程序连接。mongos进程需要配置服务器的地址,所以必须使用--configdb选项启动mongos:
mongos --configdb config-1:27019,config-2:27019,config-3:27019 -f /var/lib/mongos.conf
默认情况下,mongos运行在27017端口。mongos本身不保存数据,它会在启动时从配置服务器加载集群数据。
可以启动任意数量的mongos进程。通常的设置时每个应用程序服务器使用一个mongos进程(与应用服务器运行在同一台机器上)
每个mongos进程必须按照列表排序,使用相同的配置服务器列表。
3). 将副本集转换为分片:有两种可能性:已经有一个副本集,或者从零开始建立集群。下例假设我们已经拥有了一个副本集。如果是从零开始的话,可先初始画一个空的副本集,然后按照本例操作。
a. 告知mongos副本集名称和副本集成员列表:sh.addShard("spock/server-1:27017,server-2:27017,server-4:27017") mongos能够自动检测到没有包含在副本集成员表中的成员。
b. 副本集作为分片添加到集群后,就可以将应用程序设置从连接到副本集改为连接到mongos。
c. 副本集名称spokc被作为分片名称。如果之后希望移除这个分片或者是向这个分片迁移数据,可以使用spock来标志这个分片。
d. 配置完分片后,必须将客户端设置为将所有请求发送到mongos,而不是副本集。同时配置防火墙规则,以确保客户单不能直接将请求发送到分片。
e. 有一个--shardsvr选项,与前面介绍的--configsvr选项类似,它也没什么实用性(只是将默认端口改为27018),但在操作中建议使用该选项。
f. 不建议创建单mongod服务器分片(而不是副本集分片),将单一服务器分片转换为副本集需要停机操作。
4). 增加集群容量:通过增加分片来增加集群容量。
5). 数据分片:除非明确指定规则,否则MongoDB不会自动对数据进行拆分。如果有必要,必须明确告知数据库和集合。加入对music数据库中的artists集合按照name进行分片,
db.enableSharding("music") 对数据库分片是对集合分片的先决条件
sh.shardCollection("music.artists",{"name":1}) 对集合分片,集合会按照name键进行分片。如果是对已存在的集合分片,那么name键上必须有索引,否则会返回错误。
shardCollection()命令会经集合拆分为多个数据块,这是MongoDB迁移数据的基本单元。命令执行后,MongoDB会均衡的将数据分散到集群的分片上。