分片是数据跨多台机器存储,MongoDB使用分片来支持具有非常大的数据集和高吞吐量操作的部署。
具有大型数据集或高吞吐量应用程序的数据库系统可能会挑战单个服务器的容量。例如,高查询率会耗尽服务器的CPU容量。工作集大小大于系统的RAM会强调磁盘驱动器的I / O容量。
有两种解决系统增长的方法:垂直和水平缩放。
垂直扩展涉及增加单个服务器的容量,例如使用更强大的CPU,添加更多RAM或增加存储空间量。可用技术的局限性可能会限制单个机器对于给定工作负载而言足够强大。此外,基于云的提供商基于可用的硬件配置具有硬性上限。结果,垂直缩放有实际的最大值。
水平扩展涉及划分系统数据集并加载多个服务器,添加其他服务器以根据需要增加容量。虽然单个机器的总体速度或容量可能不高,但每台机器处理整个工作负载的子集,可能提供比单个高速大容量服务器更高的效率。扩展部署容量只需要根据需要添加额外的服务器,这可能比单个机器的高端硬件的总体成本更低。权衡是基础架构和部署维护的复杂性增加。
MongoDB支持通过分片进行水平扩展。
一、组件
- shard:每个分片包含分片数据的子集。每个分片都可以部署为副本集(replica set)。可以分片,不分片的数据存于主分片服务器上。部署为3成员副本集
- mongos:mongos充当查询路由器,提供客户端应用程序和分片集群之间的接口。可以部署多个mongos路由器。部署1个或者多个mongos
- config servers:配置服务器存储群集的元数据和配置设置。从MongoDB 3.4开始,必须将配置服务器部署为3成员副本集
注意:应用程序或者客户端必须要连接mongos才能与集群的数据进行交互,永远不应连接到单个分片以执行读取或写入操作。
shard的replica set的架构图:
config servers的replica set的架构图:
分片策略
1、散列分片
- 使用散列索引在共享群集中分区数据。散列索引计算单个字段的哈希值作为索引值; 此值用作分片键。
- 使用散列索引解析查询时,MongoDB会自动计算哈希值。应用程序也不会需要计算哈希值。
- 基于散列值的数据分布有助于更均匀的数据分布,尤其是在分片键单调变化的数据集中。
2、范围分片
- 基于分片键值将数据分成范围。然后根据分片键值为每个块分配一个范围。
- mongos可以将操作仅路由到包含所需数据的分片。
- 分片键的规划很重要,可能导致数据不能均匀分布。
二、部署
1、环境说明
| 服务器名称 | IP地址 | 操作系统版本 | MongoDB版本 | 配置服务器(Config Server)端口 | 分片服务器1(Shard Server 1 | 分片服务器2(Shard Server 2) | 分片服务器3(Shard Server 3) | 功能 |
| mongo1.example.net | 10.10.18.10 | Centos7.5 | 4.0 | 27027(Primary) | 27017(Primary) | 27018(Arbiter) | 27019(Secondary) | 配置服务器和分片服务器 |
| mongo2.example.net | 10.10.18.11 | Centos7.5 | 4.0 | 27027(Secondary) | 27017(Secondary) |
27018(Primary) | 27019(Arbiter) | 配置服务器和分片服务器 |
| mongo3.example.net | 10.10.18.12 | Centos7.5 | 4.0 | 27027(Secondary) | 27017(Arbiter) | 27018(Secondary) | 27019(Primary) | 配置服务器和分片服务器 |
| mongos.example.net | 192.168.11.10 | Centos7.5 | 4.0 | mongos的端口:27017 | mongos |
官方推荐配置中使用逻辑DNS,所以该文档中,将服务器名称和IP地址的DNS映射关系写入到各服务器的/etc/hosts文件中。
2、部署MongoDB
环境中4台服务器的MongoDB的安装部署,详见:MongoDB安装
创建环境需要的目录:
mkdir -p /data/mongodb/data/{configServer,shard1,shard2,shard3} mkdir -p /data/mongodb/{log,pid}
3、创建配置服务器(Config Server)的 Replica Set(副本集)
3台服务器上配置文件内容: /data/mongodb/configServer.conf
mongo1.example.net服务器上
systemLog: destination: file path: "/data/mongodb/log/configServer.log" logAppend: true storage: dbPath: "/data/mongodb/data/configServer" journal: enabled: true wiredTiger: engineConfig: cacheSizeGB: 2 processManagement: fork: true pidFilePath: "/data/mongodb/pid/configServer.pid" net: bindIp: mongo1.example.net port: 27027 replication: replSetName: cs0 sharding: clusterRole: configsvr
mongo2.example.net服务器上
systemLog: destination: file path: "/data/mongodb/log/configServer.log" logAppend: true storage: dbPath: "/data/mongodb/data/configServer" journal: enabled: true wiredTiger: engineConfig: cacheSizeGB: 2 processManagement: fork: true pidFilePath: "/data/mongodb/pid/configServer.pid" net: bindIp: mongo2.example.net port: 27027 replication: replSetName: cs0 sharding: clusterRole: configsvr
mongo3.example.net服务器上
systemLog: destination: file path: "/data/mongodb/log/configServer.log" logAppend: true storage: dbPath: "/data/mongodb/data/configServer" journal: enabled: true wiredTiger: engineConfig: cacheSizeGB: 2 processManagement: fork: true pidFilePath: "/data/mongodb/pid/configServer.pid" net: bindIp: mongo3.example.net port: 27027 replication: replSetName: cs0 sharding: clusterRole: configsvr
启动三台服务器Config Server
mongod -f /data/mongodb/configServer.conf
连接到其中一个Config Server
mongo --host mongo1.example.net --port 27027
结果:
1 MongoDB shell version v4.0.10 2 connecting to: mongodb://mongo1.example.net:27027/?gssapiServiceName=mongodb 3 Implicit session: session { "id" : UUID("1a4d4252-11d0-40bb-90da-f144692be88d") } 4 MongoDB server version: 4.0.10 5 Server has startup warnings: 6 2019-06-14T14:28:56.013+0800 I CONTROL [initandlisten] 7 2019-06-14T14:28:56.013+0800 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database. 8 2019-06-14T14:28:56.013+0800 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted. 9 2019-06-14T14:28:56.013+0800 I CONTROL [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended. 10 2019-06-14T14:28:56.013+0800 I CONTROL [initandlisten] 11 2019-06-14T14:28:56.013+0800 I CONTROL [initandlisten] 12 2019-06-14T14:28:56.013+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'. 13 2019-06-14T14:28:56.013+0800 I CONTROL [initandlisten] ** We suggest setting it to 'never' 14 2019-06-14T14:28:56.014+0800 I CONTROL [initandlisten] 15 2019-06-14T14:28:56.014+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'. 16 2019-06-14T14:28:56.014+0800 I CONTROL [initandlisten] ** We suggest setting it to 'never' 17 2019-06-14T14:28:56.014+0800 I CONTROL [initandlisten] 18 >