MongoDB 是一个非关系型数据库(NoSQL),也称文档型数据库。由于其良好的性能以及易用性在业内很是流行。在如今随处可见高并发读写,海量数据存储需求的背景下。数据库的容量越来越是个问题。提高容量一般有两个途径:1.垂直扩容、2.水平扩容。垂直扩容就是提高单机的容量(增加内存,CPU,磁盘空间)。水平扩容就是利用分布式使用多台服务器构建服务集群。MongoDB 就是通过 shard(分片)来构建分布式的数据库集群从而提高数据库系统的吞吐量和存储容量。今天就简单介绍下 MongoDB 的 shard 集群。
一、MongoDB 分片集群基本介绍
MongoDB shard 集群中有三个角色:
-
shard: Each shard contains a subset of the sharded data. Each shard can be deployed as a replica set.
-
mongos: The
mongos
acts as a query router, providing an interface between client applications and the sharded cluster. Starting in MongoDB 4.4,mongos
can support hedged reads to minimize latencies. -
config servers: Config servers store metadata and configuration settings for the cluster.
以上来自官方文档。翻译过来就是:
shard: 每个 shard 包含一个分片数据的子集,每个 shard 可以以副本集的方式部署。
mongos: mongos 作为查询的路由,在客户端应用和分片集群之间提供一个接口。
config servers: config servers 存储元数据和集群的配置信息。
shard cluster 架构图(来自官方文档)
一个数据库可以同时包含分片的集合和未分片的集合。分片的集合数据分布在不同的分片上,未分片的集合数据存储在一个主分片上。每个数据库都有它的主分片。
必须通过 mongos 路由器跟分片集群中的集合(分片的集合和未分片的集合)交互。客户端绝不应该连接一个单独的分片进行读写。
分片策略。
MongoDB在分片集群中有两种分片策略:
1.hashed sharding: 计算分片键字段值的哈希值。然后,根据散列的分片键值为每个块分配一个范围。
2. ranged sharding: 根据分片键值将数据划分为多个范围。然后,根据分片键值为每个块分配一个范围。
以上就是对 MongoDB 分片集群的简单介绍。由于篇幅所致,介绍的过于简单,更详细的可以参考官方文档:https://docs.mongodb.com/manual/sharding/
二、手动搭建一个分片集群
这里准备了三台机器。
OS | 主机名 | IP |
---|---|---|
Ubuntu 18.04 | mongodb-01.ninejy.io | 192.168.0.21 |
Ubuntu 18.04 | mongodb-02.ninejy.io | 192.168.0.22 |
Ubuntu 18.04 | mongodb-03.ninejy.io | 192.168.0.23 |
1. 下载安装包并解压,复制可执行文件到 PATH 路径下
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu1804-4.4.0.tgz # 工具包 # wget https://fastdl.mongodb.org/tools/db/mongodb-database-tools-ubuntu1804-x86_64-100.2.1.tgz tar zxf mongodb-linux-x86_64-ubuntu1804-4.4.0.tgz cp mongodb-linux-x86_64-ubuntu1804-4.4.0/bin/* /usr/local/bin/
2. 安装依赖包
apt-get update && apt-get install -y apt-transport-https libcurl4 openssl liblzma5
3. 创建数据目录和日志目录
mkdir -p /data/{mongodb/data/configdb,mongodb/data/sharddb,mongodb/conf,mongodb/run,mongodb/logs} cd /data/mongodb
4. 创建 config server 副本集
4.1 准备 config server 配置文件
# conf/config-server.conf systemLog: quiet: false path: /data/mongodb/logs/mongod-config-server.log logAppend: false destination: file processManagement: fork: true pidFilePath: /data/mongodb/run/mongod-config-server.pid sharding: clusterRole: configsvr replication: replSetName: config_rs net: port: 27019 bindIp: localhost,192.168.0.21 # 不同节点不同的IP。192.168.0.22,192.168.0.23 storage: dbPath: /data/mongodb/data/configdb
4.2 启动每个 config server 副本集的每个成员
mongod --config conf/config-server.conf --fork
4.3 连接到 config server 副本集的其中一个成员,初始化副本集
mongo --host 192.168.0.21 --port 27019 rs.initiate( { _id: "config_rs", configsvr: true, members: [ { _id : 0, host : "192.168.0.21:27019" }, { _id : 1, host : "192.168.0.22:27019" }, { _id : 2, host : "192.168.0.23:27019" } ] } ) # 查看副本集状态 rs.status()
5. 创建分片副本集
5.1 准备 shard server 配置文件
# conf/shard-server.conf systemLog: quiet: false path: /data/mongodb/logs/mongod-shard-server.log logAppend: false destination: file processManagement: fork: true pidFilePath: /data/mongodb/run/mongod-shard-server.pid sharding: clusterRole: shardsvr replication: replSetName: shard_rs net: port: 27018 bindIp: localhost,192.168.0.21 # 不同节点不同的IP。192.168.0.22,192.168.0.23 storage: dbPath: /data/mongodb/data/sharddb
5.2 启动 shard 副本集的每个成员
mongod --config conf/shard-server.conf --fork
5.3 连接到 shard 副本集的其中一个成员,初始化 shard 副本集
mongo --host 192.168.0.21 --port 27018 rs.initiate( { _id : "shard_rs", members: [ { _id : 0, host : "192.168.0.21:27018" }, { _id : 1, host : "192.168.0.22:27018" }, { _id : 2, host : "192.168.0.23:27018" } ] } ) # 查看分片状态 sh.status()
6. 创建 mongos 服务
6.1 准备 mongos 配置文件
# conf/mongos-server.conf systemLog: quiet: false path: /data/mongodb/logs/mongod-mongos-server.log logAppend: false destination: file processManagement: fork: true pidFilePath: /data/mongodb/run/mongod-mongos-server.pid sharding: configDB: config_rs/192.168.0.21:27019,192.168.0.22:27019,192.168.0.23:27019 net: port: 27017 bindIp: localhost,192.168.0.21 # 不同节点不同的IP。192.168.0.22,192.168.0.23
6.2 启动 mongos 服务
mongos --config conf/mongos-server.conf --fork
7. 连接分片集群,添加分片,创建库,开启分片
mongo --host 192.168.0.21 --port 27017 sh.addShard( "shard_rs/192.168.0.21:27018,192.168.0.22:27018,192.168.0.23:27018") # 创建库,存在就切换到该库,不存在则创建 use test; # test 库开启分片 sh.enableSharding("test");
以上一个基本的 MongoDB 分片集群就搭建好了。此时集群中只有一个分片,当需要扩容的时候,按照步骤 5 创建 shard 副本集,然后按照步骤 7 把 shard 加入到集群就实现了集群扩容。
本文只是简单的介绍了 MongoDB 分片集群的基本概念和搭建。mongo的官方文档很详细。更多内容请参考官方文档。https://docs.mongodb.com/manual/