27、MongoDB 分片集群技术

本文详细解析了MongoDB分片技术的原理、优势及核心组件(ShardServer、ConfigServer、QueryRouters),并提供了从环境准备到配置的完整分片集群搭建步骤,帮助开发者应对单机存储不足、性能瓶颈等问题,实现数据库的水平扩展。

海量的数据使得单台 MongoDB 存储显得吃力且难以满足提供可接受的读写吞吐量

通过将数据分割到多台服务器就变得越来越重要,使得 MongoDB 数据库系统能存储和处理更多的数据

为什么使用分片

1、 复制所有的写入操作到主节点;
2、 延迟的敏感数据会在主节点查询;
3、 单个副本集限制在12个节点;
4、 当请求量巨大时会出现内存不足;
5、 本地磁盘不足;
6、 垂直扩展价格昂贵;

MongoDB分片

下图展示了 MongoDB 分片集群结构分布

 

MongoDB 分片集群技术主要有三个组件

1、 ShardServer

用于存储实际的数据块  
一个 shard server 角色可由几台机器组一个负载均衡承担防止主机单点故障

2、 ConfigServer

mongod 实例存储了整个 Cluster Metadata包括 chunk 信息

3、 QueryRouters

前端路由  
客户端由此接入且让整个集群看上去像单一数据库

MongoDB 分片技术搭建范例

假设 MongoDB 分片集群结构组件如下所示

Shard Server

Shard Server 1localhost:27020
Shard Server 2localhost:27021
Shard Server 3localhost:27022
Shard Server 4localhost:27023

Config Server

Config Server localhost:27100

Query Routers Server

Route Processlocalhost:40000

MongoDB 分片集群搭建步骤

1、 启动ShardServer

    [root@ddkk.com ~]# mkdir -p /mnt/data/www/mongodb/shared/s0
    [root@ddkk.com ~]# mkdir -p /mnt/data/www/mongodb/shared/s1
    [root@ddkk.com ~]# mkdir -p /mnt/data/www/mongodb/shared/s2
    [root@ddkk.com ~]# mkdir -p /mnt/data/www/mongodb/shared/s3
    [root@ddkk.com ~]# mkdir -p /mnt/data/www/mongodb/shared/log
    [root@ddkk.com ~]#        
    [root@ddkk.com ~]#
    [root@ddkk.com ~]# /usr/local/mongodb/bin/mongod --port 27020 --dbpath=/mnt/data/www/mongodb/shared/s0 --logpath=/mnt/data/www/mongodb/shared/log/s0.log --logappend --fork
    [root@ddkk.com ~]#
    [root@ddkk.com ~]# /usr/local/mongodb/bin/mongod --port 27021 --dbpath=/mnt/data/www/mongodb/shared/s1 --logpath=/mnt/data/www/mongodb/shared/log/s1.log --logappend --fork
    [root@ddkk.com ~]#
    [root@ddkk.com ~]# /usr/local/mongodb/bin/mongod --port 27022 --dbpath=/mnt/data/www/mongodb/shared/s2 --logpath=/mnt/data/www/mongodb/shared/log/s2.log --logappend --fork
    [root@ddkk.com ~]#
    [root@ddkk.com ~]# /usr/local/mongodb/bin/mongod --port 27023 --dbpath=/mnt/data/www/mongodb/shared/s3 --logpath=/mnt/data/www/mongodb/shared/log/s3.log --logappend --fork

2、 启动ConfigServer

    [root@ddkk.com ~]# mkdir -p /mnt/data/www/mongodb/shared/config
    [root@ddkk.com ~]# /usr/local/mongodb/bin/mongod --port 27100 --dbpath=/mnt/data/www/mongodb/shared/config --logpath=/mnt/data/www/mongodb/shared/log/config.log --logappend --fork
**注意** 我们可以像启动普通 mongodb 服务一样启动不需要添加 shardsvr  configsvr 参数因为这两个参数的作用就是改变启动端口的只要我们自行指定了端口就可以

3、 启动QueryRoutersServer

    [root@ddkk.com ~]# /usr/local/mongodb/bin/mongos --port 40000 --configdb localhost:27100 --fork --logpath=/mnt/data/www/mongodb/shared/log/route.log --chunkSize 500
    mongos 启动参数中chunkSize 这一项是用来指定 chunk 的大小的单位是 MB默认大小为 200MB

4、 配置Sharding

我们使用 MongoDB Shell 登录到 mongos 添加 Shard 节点
    [root@ddkk.com ~]# /usr/local/mongodb/bin/mongo admin --port 40000
    MongoDB shell version v3.4.9
    connecting to: mongodb://127.0.0.1:40000/admin
    MongoDB server version: 3.4.9
    mongos> db.runCommand({ addshard:"localhost:27020" })
    { "shardAdded" : "shard0000", "ok" : 1 }
    mongos> db.runCommand({ addshard:"localhost:27021" })
    { "shardAdded" : "shard0001", "ok" : 1 }
    mongos> db.runCommand({ addshard:"localhost:27022" })
    { "shardAdded" : "shard0002", "ok" : 1 }
    mongos> db.runCommand({ addshard:"localhost:27023" })
    { "shardAdded" : "shard0003", "ok" : 1 }
--------------------
    mongos> db.runCommand({ enablesharding:"test" })设置分片存储的数据库
    { "ok" : 1 }
    mongos> db.runCommand({ shardcollection: "test.log", key: { id:1,time:1}})
    { "collectionsharded" : "test.log", "ok" : 1 }

5、 程序代码内无需太大更改,直接按照连接普通的mongo数据库,但需要将数据库连接接入端口改为40000;