Mongodb 分片

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mongodb 分片相关的知识,希望对你有一定的参考价值。

原文地址:伍仪洲的博客

介绍

分片是指将数据拆分,并分散放在多个服务器中组成一个集群,这可以将N台服务器的性能集中到一起来处理数据,这将很大程度的提高数据处理的速度。

在Mongodb的分片中必须具备三个角色:

  1. 路由服务器:用于处理和响应请求,并把各个分片服务器查询到的结果处理合并然后返回。
  2. 配置服务器(configServer):存储集群、数据的描述信息。
  3. 分片服务器:用于储存拆分的数据服务器。

而这三个角色都是普通的数据库,只是扮演的角色不一样。

它们的请求流程、响应就如下图中表示一样:

技术分享

因为所有的应用程序都是通过路由进行请求,所以对于应用程序来说,它没有什么不同就如请求一个普通数据服务器一样:

技术分享

搭建配置服务器

首先我们需要搭建配置服务器,配置服务器如同分片的大脑,保存着集群和数据的描述信息。

因为Mongodb3.4版本后需要配置服务器必须配置为副本集,所以需要给配置服务器配置副本集,如果你还清楚如何搭建副本集,你可以试着看看我的上一篇文章《Mongodb 副本集》

首先建立三个空的数据库目录,用于搭建配置服务器的副本集,并分别启动它们,在启动的时候需要加上我们副本集的名称和--configsvr来表示这是一个配置服务器,并分别指定不同的端口。

$ mkdir config0 config1 config2

$ mongod --dbpath config0 --replSet conServer --configsvr --port 27020

$ mongod --dbpath config1 --replSet conServer --configsvr --port 27021

$ mongod --dbpath config2 --replSet conServer --configsvr --port 27020

然后通过mongo随意进入一个副本集成员,并为配置服务器的副本集进行配置:

$ mongo --port 27020 --host localhost

> var conf = {
    _id: ‘conServer‘,
    version: 1,
    members: [
        {
            _id: 0,
            host: ‘localhost:27020‘
        },
        {
            _id: 1,
            host: ‘localhost:27021‘
        },
        {
            _id: 2,
            host: ‘localhost:27022‘
        }
    ]
};

> rs.initiate(conf);

至此我们的配置服务器配置完成。

搭建分片服务器

官方建议我们的分片服务区至少在3个或以上才能发挥出更好的性能,我们这里也创建三个分片服务器。

因为分片服务器没有强制要求必须是副本集,所以下面就创建了三个单机分片服务器,但是Mongodb接受分片服务器为副本集。

下面创建三个空数据库目录,然后启动它们,在启动的时候需要加上--shardsvr以表示这是一个分片服务器:

$ mkdir sh0 sh1 sh2

$ mongod --dbpath sh0 --shardsvr --port 27030

$ mongod --dbpath sh1 --shardsvr --port 27031

$ mongod --dbpath sh2 --shardsvr --port 27032

至此我们的分片服务器也搭建完成。

搭建路由服务器

mongodb提供了一个路由工具,它会随着我们下载包一起下载,名字为mongosmongos.exe,通过它配置路由功能。

启动路由我们需要加上参数--configdb,它的语法为:

--configdb 配置服务器副本集名称/配置服务器1地址端口,配置服务器1地址端口...

启动路由,并为路由指定一个端口,用于开放给客户端链接:

$ mongos --configdb conServer/localhost:27020,localhost:27021,localhost:27022 --port 27040

至此路由已经搭建完成。

配置分片

配置分片服务器

通过mongodb提供的mongo进入到路由服务器中进行配置,把我们开始创建的三个分片服务器通过sh.addShard()方法添加进行,这个方法接受一个字符串里面的格式为host:port

$ mongo --port 27040 --host localhost

> sh.addShard(‘localhost:27030‘);
> sh.addShard(‘localhost:27031‘);
> sh.addShard(‘localhost:27032‘);

如果你可以通过rs.status()方法中返回的shards字段看是否添加成功。

配置片键

到目前为止,分片服务器已经搭建完成,但是目前分片服务器无法正常工作,我们所有的操作都将在随机的一个主分片上操作,这是因为分片服务器不知道怎么进行分片,所以我们还需要配置片键来告诉分片服务器按照什么来分片。

分片是基于数据库集合中的文档的一个键进行分片的,比如选择username键,那么会根据这个键的顺序就行分片,而mongodb会自动平衡分片的数据。

Mongodb要求作为片键的键必须是索引过的,所以我们在建立片键之前需要对键进行索引,建立后片键就是集合中的最重要的索引。

在生产环境中建议先想好数据建构建立索引和片键后开始操作数据,这样会减轻分片服务器的负载。

首先我们在需要进行分片的数据库上开启分片功能,通过sh.enableSharding方法开启。

$ mongo --port 27040 --host localhost

> sh.enableSharding(‘test‘);

然后在开启分片的数据库中的test集合插入测试数据,注意此时我们还没有进行配置片键,所以所有的数据操作都在分片服务器随机分配的一个主分片上面进行的。

> for(var i = 0; i < 100; i++){
    db.test.insert({
        username: ‘user‘ + i,
        idNum: i
    })
}

这时候以username为片键,通过sh.shardCollection方法进行建立,它的语法为:

sh.shardCollection(namespace, key, unique, options)

首先给我们要建立的片键建立索引:

> db.test.ensureIndex({‘username‘: 1});

然后建立片键:

> sh.shardCollection(‘test.test‘, {username:1});

等待几分钟后,可以通过sh.status方法查看数据分片的情况了,可以从中很清楚的看见哪些数据在哪个分片服务器上面,并且通过explain方法来查看我们查询的过程中哪些分片服务器参与了查询。

参考

MongoDB权威指南(第2版)

Mongodb Docs

以上是关于Mongodb 分片的主要内容,如果未能解决你的问题,请参考以下文章

『MongoDB』MongoDB高可用部署架构——分片集群篇(Sharding)

mongoDB分片集群

MongoDB——MongoDB分片集群(Sharded Cluster)两种搭建方式

Docker——基于Docker搭建MongoDB分片集群

Mongodb集群架构之分片架构

MongoDB分片搭建