一、概念
分片:满足MongoDB数据量大量增长的需求。
当MongoDB存储海量的数据时,一台机器可能不足以存储数据,也可能不足以提供可接受的读写吞吐量。这时,我们就可以通过在多台机器上分割数据,使得数据库系统能存储和处理更多的数据。
MongoDB使用分片集群结构图:
mongos:请求分发中心。数据库集群请求的入口,所有的请求都通过mongos进行协调。mongos负责把对应的数据请求请求转发到对应的shard服务器上。生产环境上通常由多个mongos作为请求的入口,防止因其中一个挂掉导致所有的mongoDB请求都没有办法操作。
config server:配置服务器。用来存储所有数据库源信息(路由、分片)的配置。mongos本身没有物里存储分片服务器和数据路由信息,只是缓存在内存中,配置服务器则实际存储这些数据。mongos第一次启动或者关掉重启就会从config server加载配置信息,之后如果config server信息变化就会通知到所有的mongos来更新自己的状态,这样nongod就能继续准确路由。生产环境上通常有三个config server配置服务器,防止分片路由的元数据丢失。
shard:分片。
例子:将一台机器的一个数据表Collection分给了4个机器,使得每个机器都是256G,这样就分摊了一台机器存储1T数据的压力。在mongodb中只要设置好了分片规则,通过mongos操作数据库就能自动把对应的数据操作请求转发到对应的分片机器上。
replica set:存在于分片中,如果分片中没有replica set是不完整的。假设其中的一个分片挂掉,那四分之一的数据就丢失了,所以在高可用性的分片架构还需要对每一个分片构建replica set副本集保证分片的可靠性。
分片集群构造:
组件 | 说明 |
Mongos | 数据路由,和客户端打交道的模块。mongos本身没有任何数据,也不知道怎么处理这些数据,去找config server。 |
config server | 所有存、取数据的方式,所有shard节点的信息,分片功能的一些配置信息。可以看作是真实数据的元数据。 |
shard | 真正的数据存储位置,以chunk为单位。 |
Mongos本身并不持久化数据,Sharded cluster所有的元数据都会存储到Config Server,而用户的数据会分散存储到各个shard。Mongos启动后,会从配置服务器加载元数据,开始提供服务,将用户的请求正确路由到对应的分片。
二、Windows上模拟分片集群
第一节:创建配置服务器复制集
这里部署了一个分片rs-a,分片包3个复制集,2个配置服务器复制集,一个路由服务器,对应的目录如下:
1、配置分片复制集,包含三个复制集的分片
(1)、成员一:新打开一份DOS窗口
mongod --port 3000 --shardsvr --replSet rs-a --dbpath E:\other_dev\mongodb\shard\rs-a-0
成员二:新打开一份DOS窗口
mongod --port 3001 --shardsvr --replSet rs-a --dbpath E:\other_dev\mongodb\shard\rs-a-1
成员三:新打开一份DOS窗口
mongod --port 3002 --shardsvr --replSet rs-a --dbpath E:\other_dev\mongodb\shard\rs-a-2
参数说明:
--shardsvr:要求使用分片;--replSet:使用复制集,复制集的名称为rs-a;创建的分片复制集的名称要统一。
(2)、初始化,配置Primary和Secondary
新打开一个DOS窗口,连接其中的一个服务器,使用命令:mongo --port 3000
在这个mongo shell环境中创建分片复制集配置对象:
rsconf = {
... ... _id: "rs-a",
... ... members: [
... ... {
... ... _id: 0,
... ... host: "localhost:3000"
... ... },
... ... {
... ... _id: 1,
... ... host: "localhost:3001"
... ... },
... ... {
... ... _id: 2,
... ... host: "localhost:3002"
... ... }
... ... ]
... ... }
使用rs.initiate()初始化,此实例便成为了Primary
使用rs.status()命令来检查分片复制集的状态以便检查它是否被正确配置
表明该分片已经被成功配置并初始化了。
第二节:配置 配置服务器 :包含两个实例的复制集
1、成员一:新打开DOS窗口
mongod --port 27019 --configsvr --replSet rs-conf --dbpath E:\other_dev\mongodb\shard\config0
成员二:新打开DOS窗口
mongod --port 27020 --configsvr --replSet rs-conf --dbpath E:\other_dev\mongodb\shard\config1
2、初始化,配置服务器
新打开一个DOS窗口,连接其中的一个服务器,使用命令:mongo --port 27019
在这个mongo shell环境中创建配置服务复制集配置对象:
使用rs.initiate()初始化配置信息:
使用rs.status()命令来检查配置服务器复制集的状态以便检查它是否被正确配置:
第三节:配置路由服务器
1、新打开一个DOS窗口
mongos --configdb rs-conf/localhost:27019,localhost:27020 --port 27018
第四节:添加创建的分片
1、新打开一个DOS窗口,登陆路由服务器:mongo --port 27018
2、执行添加分片的命令 sh.addShard("rs-a/localhost:3000,rs-a/localhost:3001,rs-a/localhost:3002")
3、使用sh.status()查看分片信息
第五节:为数据库启用分片
在对集合进行切分之前,必须为集合的数据库启用切分。为数据库启用分片不会重新分发数据,但是可以对数据库中的集合进行分片。
为数据库启用分片之后,MongoDB为数据库分配一个主分片,MongoDB将所有数据存储在这个数据库中。
命令:sh.enableSharding("<database>")。
第六节:对集合进行分片
要分割一个集合,使用sh.shardCollection()方法。必须指定集合的完整名称空间和包含切片分键的文档。前提数据库必须启用分片。
选择的切分键会影响切分的效率,以及利用某些切分特性的能力。
如果集合已经包含数据,在使用shardCollection()之前,必须使用db.collection.createIndex()方法在切分键上创建索引。
如果集合为空,MongoDB将创建索引作为sh.shardCollection()的一部分。
对目标集合进行切分:sh.shardCollection("<database>.<collection>",{<key>:<direction>})
第七节:查看分片复制集的一致性
1、登陆主节点3000,插入数据
2、登陆两个辅节点3001和3002
3、查看是否有主节点插入的数据