分片介绍
分片是使用多个机器存储数据的方法,MongoDB使用分片以支持巨大的数据存储量与对数据操作.
分片的目的
高数据量和吞吐量的数据库应用会对单机的性能造成较大压力,大的查询量会将单机的CPU耗尽,大的数据量对单机的存储压力较大,最终会耗尽系统的内存而将压力转移到磁盘IO上.
为了解决这些问题,有两个基本的方法: 纵向扩展 和 分片 .
分片为应对高吞吐量与大数据量提供了方法.
-
使用分片减少了每个分片需要处理的请求数,因此,通过 水平扩展 ,集群可以提高自己的存储容量和吞吐量.
举例来说,当插入一条数据时,应用只需要访问存储这条数据的分片.
-
使用分片减少了每个分片存储的数据.
举例来说,如果一个数据库有1TB数据,并有4个分片,则每个分片只需要存储256GB数据,如果数据库有40个分片,则每个分片只需要存储25GB数据
数据分区
MongoDB中数据的分片是以集合为基本单位的,集合中的数据通过 片键 被分成多部分.
片键
对集合进行分片时,你需要选择一个 片键 , shard key 是每条记录都必须包含的,且建立了索引的单个字段或复合字段,MongoDB按照片键将数据划分到不同的 数据块 中,并将 数据块 均衡地分布到所有分片中.为了按照片键划分数据块,MongoDB使用 基于范围的分片方式 或者 基于哈希的分片方式 ,参见 片键 获得更多信息.
以范围为基础的分片
对于 基于范围的分片 ,MongoDB按照片键的范围把数据分成不同部分.假设有一个数字的片键:想象一个从负无穷到正无穷的直线,每一个片键的值都在直线上画了一个点.MongoDB把这条直线划分为更短的不重叠的片段,并称之为 数据块 ,每个数据块包含了片键在一定范围内的数据.
在使用片键做范围划分的系统中,拥有”相近”片键的文档很可能存储在同一个数据块中,因此也会存储在同一个分片中.
基于哈希的分片
对于 基于哈希的分片 ,MongoDB计算一个字段的哈希值,并用这个哈希值来创建数据块.
在使用基于哈希分片的系统中,拥有”相近”片键的文档 很可能不会 存储在同一个数据块中,因此数据的分离性更好一些.
部署一个集群
分片和”localhost”地址
如果你使用”localhost”或者 127.0.0.1 在任意一处地方作为主机标识,比如使用 addShard 命令时的host 参数或者 --configdb <mongos --configdb>`作为启动参数,你必须保证在所有地方使用其中一个,如果混用了"localhost"和 ``127.0.0.1` ,MongoDB会报错.
启动配置服务器
配置服务器是存储集群元信息的 mongod 实例.使用 --configsvr 指定一个 mongod 为配置服务器,每个配置服务器都存储了集群的一份完整的元信息.
在生产环境下,你必须部署三个配置服务器,每个配置服务器都运行在不同的服务器上以保证良好的正常运行时间和数据安全.在测试环境下,你可以将三台配置服务器运行在一台服务器上.
-
为三个配置服务器创建数据目录,默认情况下,配置服务器将数据文件存储在 /data/configdb 目录下.你也可以自己指定不同的位置用来存储数据文件.通过简单的命令创建数据目录:
mkdir /data/configdb
-
启动三台配置服务器,每台都通过一下命令启动:
mongod --configsvr --dbpath <path> --port <port>
配置服务器的默认端口是 27019 .你也可以自己指定.以下示例使用默认的端口和默认的数据目录启动一个配置服务器.
mongod --configsvr --dbpath /data/configdb --port 27019
参见 mongod 或者 Configuration File Options 以获得更多命令选项.
注解
初始化 sharded cluster 时所有配置服务器必须正常运行并且可以访问.
启动 mongos 实例
mongos 实例是轻量服务,并且不需要数据目录,你可以将 mongos 运行在已经部署了其他服务的系统中,比如应用服务器或者 运行了 mongod 的机器上.:program:mongos 默认运行在 27017 端口上.
在启动 mongos 时,需要指定三台配置服务器的域名,可以在配置文件或者启动命令参数中指定.
TIP
To avoid downtime, give each config server a logical DNS name (unrelated to the server’s physical or virtual hostname). Without logical DNS names, moving or renaming a config server requires shutting down every mongod and mongos instance in the sharded cluster.
使用以下语法启动 mongos 实例:
mongos --configdb <config server hostnames>
示例:使用以下配置服务器,在默认端口上启动 mongos :
- cfg0.example.net
- cfg1.example.net
- cfg2.example.net
你需要使用以下命令:
mongos --configdb cfg0.example.net:27019,cfg1.example.net:27019,cfg2.example.net:27019
每个 mongos 必须使用 configDB 按照相同的顺序指定配置服务器列表.
如果你启动一个 mongos 时,指定的配置服务器列表与其他 mongos 中指定的不同, mongos 会返回 配置服务器字符串错误 错误并退出启动.
向集群中添加分片
一个 shard 可以是一个单独的:program:mongod 或者一个 replica set.在生产环境中,每个分片都应该是一个复制集.参见 部署复制集 将每个分片部署为复制集.
-
mongo --host <hostname of machine running mongos> --port <port mongos listens on>
示例:如果 mongos 部署在 mongos0.example.net``的 ``27017 端口上,使用以下命令进行连接:
mongo --host mongos0.example.net --port 27017
-
正如下面的示例,使用 sh.addShard() 在集群中添加分片.每次使用 sh.addShard() 添加一个分片.如果分片是复制集,需要指定复制集的名字与一个成员名字.在生产环境中,所有分片都应该是复制集.
可选配置
You can instead use the addShard database command, which lets you specify a name and maximum size for the shard. If you do not specify these, MongoDB automatically assigns a name and maximum size. To use the database command, see addShard.
以下是使用 sh.addShard() 添加分片的例子:
-
假设一个分片使用了复制集,复制集名字为 rs1 ,有一个运行在 mongodb0.example.net 且端口为27017 的成员,使用以下命令添加这个分片:
sh.addShard( "rs1/mongodb0.example.net:27017" )
在 2.0.3 版更改.
在2.0.3之前的版本,你必须指定复制集中所有的成员,示例:
sh.addShard( "rs1/mongodb0.example.net:27017,mongodb1.example.net:27017,mongodb2.example.net:27017" )
-
添加运行在 mongodb0.example.net 端口为 27017 的单机 mongod 分片,需要执行以下命令:
sh.addShard( "mongodb0.example.net:27017" )
注解
将 数据块 迁移到新的分片需要花费一些时间.
-
为集群开启分片
在对集合进行分片之前,必须开启数据库的分片.对数据库开启分片不会导致数据的重新分配,但这是对这个数据库中集合进行分片的前提.
一旦为数据库开启了分片,MongoDB就会为这个数据库指定一个 primary shard,所有未分片的数据都会存储在这个分片上.
-
mongo --host <hostname of machine running mongos> --port <port mongos listens on>
-
使用 sh.enableSharding() 需要指定要开启分片的数据库的名字,语法如下:
sh.enableSharding("<database>")
你也可以使用 enableSharding 命令对数据库开启分片,语法如下:
db.runCommand( { enableSharding: <database> } )
对集合开启分片
分片以集合为基本单位.
-
首先选择一个 shard key ,所选择的片键会影响集群的效率.参见 选择片键的注意事项. 获得注意事项.
-
如果集合中已经包含有数据,需要使用 ensureIndex() 在片键上创建索引.如果集合是空的,MongoDB会在 sh.shardCollection() 过程中自动创建索引.
-
在 mongo 终端中使用 sh.shardCollection() 对一个集合开启分片,语法如下:
sh.shardCollection("<database>.<collection>", shard-key-pattern)
将 <database>.<collection> 字符串换成你数据库的ns,由数据库的全名,一个点(即 . ),和集合的全名组成, shard-key-pattern 换成你的片键,名字为 创建索引 时指定的名字.
示例
The following sequence of commands shards four collections:
sh.shardCollection("records.people", { "zipcode": 1, "name": 1 } ) sh.shardCollection("people.addresses", { "state": 1, "_id": 1 } ) sh.shardCollection("assets.chairs", { "type": 1, "_id": 1 } ) sh.shardCollection("events.alerts", { "_id": "hashed" } )
按照顺序操作分片:
-
records 数据库中的 people 集合使用 { "zipcode": 1, "name": 1 } 片键开启分片.
这个集合使用 zipcode 字段重新分配数据.如果很多文档都有相同的 zipcode 值, chunk 会按照name 的值进行 分裂.
-
people 数据库中的 addresses 集合使用片键 { "state": 1, "_id": 1 }.
这个片键使用 state 字段重新分配数据.如果很多文档都有相同的 state 值, chunk 会按照 _id的值进行 分裂.
-
assets 数据库中的 chairs 集合使用 { "type": 1, "_id": 1 } 做片键.
这个片键使用 type 字段重新分配数据.如果很多文档都有相同的 type 值, chunk 会按照 _id 的值进行 分裂.
-
events 数据库中的 alerts 集合使用 { "_id": "hashed" } 做片键.
2.4 新版功能.
这个片键使用 _id 的散列值重新分配数据.MongoDB为 散列索引 计算 _id 的值,可以保证集群中数据的均衡.
-
相关推荐
"Mongodb shard 简介" MongoDB shard 是一种水平方向的多节点数据分散存储技术,它可以将大量数据分布到多个服务器上,以提高数据库的存储能力和查询效率。下面是 MongoDB shard 的一些特性和部署架构: Shard 的...
用于Shard和Config服务器的Pod的部署: 此处,分片副本集存储实际数据或块(文档集合),而配置服务器副本集存储mongodb集群的元数据和配置信息。 在k8s集群中,我们创建了无头服务和状态集,用于部署分片和配置...
### MongoDB核心知识点解析 #### MongoDB概述 MongoDB是一款高性能、开源、无模式的文档型数据库。作为一款介于关系数据库和非关系数据库之间的解决方案,MongoDB在很多应用场景中可以替代传统的关系型数据库或是...
- shard 服务器日志路径:`/data/mongodb/shard1/log/shard1.log`,`/data/mongodb/shard2/log/shard2.log`,`/data/mongodb/shard3/log/shard3.log` #### 四、启动配置服务器 (Config Server) 配置服务器是 ...
mkdir -p /data/mongodb/shard311 ./mongod -f /opt/mongodb-linux-x86_64-2.2.0/conf/mongod_3.conf #16 mkdir -p /data/mongodb/shard32 ./mongod -f /opt/mongodb-linux-x86_64-2.2.0/conf/mongod_3.conf #...
- 创建相应的目录结构,如 `/usr/local/mongodb/conf`、`/usr/local/mongodb/mongos/log`、`/usr/local/mongodb/config/data`、`/usr/local/mongodb/config/log`、`/usr/local/mongodb/shard1/data`、`/usr/local/...
- `/data/mongodbtest/shard1/data` 和 `/data/mongodbtest/shard1/log`、`/data/mongodbtest/shard2/data` 和 `/data/mongodbtest/shard2/log`、`/data/mongodbtest/shard3/data` 和 `/data/mongodbtest/shard3/log...
1. **创建配置文件**:分别在服务器nosql01、nosql02和nosql03的`/shard/configFile/`目录下创建配置文件`mongodb_shard1.conf`、`mongodb_shard2.conf`和`mongodb_shard3.conf`。 2. **启动Shard**:在三台服务器的...
mongodb集群 shard replset 分片 包括windows 和 linux两个版本
./bin/mongod --shardsvr --replSet shard1 --port 27017 --dbpath /usr/local/server/mongodb/data/shard11 --oplogSize 2048 --logpath /usr/local/server/mongodb/data/shard11.log --logappend --fork ...
MongoDB Community Server(mongodb-src-r5.0.4.tar.gz)源代码 MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB是一个介于关系数据库和非...
MongoDB使用分片键(Shard Key)来决定数据应存储在哪个分片上。分片集群通常包括分片服务器、路由进程(Mongos)和配置服务器(Config Server)。路由进程负责接收客户端请求,根据分片键将请求路由到正确的分片,...
- 分区键(PartitionKey)在MongoDB中称为分片键(ShardKey) 10. MongoDB文档示例: MongoDB的文档是一种以BSON格式存储的数据结构,类似于JSON。文档包含一个唯一的_id字段,可以通过ObjectId进行索引,字段可以...
kubernetes-mongodb分片 在kubernetes上部署mongodb分片集群。 这适用于最少具有3个节点的小型集群和具有100多个节点的大型集群。 先决条件 具有至少3个可调度节点的Kubernetes集群。 Kubernetes v1.2.3或更高版本 ...
首先,我们需要了解MongoDB集群的基本架构,它由三个主要部分组成:Shard服务器(用于存储数据)、Config server(配置服务器)和Mongos服务器(路由服务器)。在本案例中,我们有3台Mongos服务器(172.16.0.41-43)...
视频目录: 01-mongodb文档型数据库特点介绍 01-NoSQL简介 02-mongodb安装过程 02-mongodb操作1 03-mongodb操作2 ...04-mongodb操作3 ...09-mongoDB备份与恢复 ...11-shard分片 11-分片 12-使用java操作mongodb
### 分布式计算中的MongoDB扩展 #### 一、分布式计算与MongoDB扩展概述 《Scaling MongoDB》一书由Kristina Chodorow撰写,详细介绍了MongoDB如何在分布式环境中进行扩展,以支持大规模数据集和高并发访问。本书...
- `/data/mongodb/shard1/data` - `/data/mongodb/shard1/log` - `/data/mongodb/shard2/data` - `/data/mongodb/shard2/log` - `/data/mongodb/shard3/data` - `/data/mongodb/shard3/log` 5. **规划端口号*...