初探 MongoDB 分片集群

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 架构图(来自官方文档)

初探 MongoDB 分片集群

  

一个数据库可以同时包含分片的集合和未分片的集合。分片的集合数据分布在不同的分片上,未分片的集合数据存储在一个主分片上。每个数据库都有它的主分片。

初探 MongoDB 分片集群

  

必须通过 mongos 路由器跟分片集群中的集合(分片的集合和未分片的集合)交互。客户端绝不应该连接一个单独的分片进行读写。

初探 MongoDB 分片集群

  

分片策略。

    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/

 

上一篇:(31)ElasticSearch水平扩容的过程


下一篇:自定义实现一个loghub(或kafka)的动态分片消费者负载均衡?