1.分片的原理概述

  分片就是把数据分成块,再把块存储到不同的服务器上,mongodb的分片是自动分片的,当用户发送读写数据请求的时候,先经过mongos这个路由层,mongos路由层去配置服务器请求分片的信息,再来判断这个请求应该去那一台服务器上读写数据。

mongodb 分片 性能 mongo 分片原理_数据

 

2.分片的条件

1):服务器磁盘不够的时候

2):服务器出现写瓶颈的时候

3):想将大量数据放在内存中提高性能

 

3.分片中的角色,有三种:

1):配置服务器:存放分片信息,分片的数据与片的关系

2):mongos路由:是一个路由进程,把所有对mongodb的数据读写请求根据配置服务器的配置信息分配到不同的分片服务器上去。本身不存储数据与配置信息,但会缓存配置信息,

3):片:指一个分片,这个分片可以是一台服务器,也可以是多台服务器组成的一个集群。对应的多台服务器中只能有一台主服务器

 

4.分片是以什么来分的

1)以数据库来分,那就是把数据库里的多个集合分到不同的分片上,同一个集合的数据只能在同一分片上

2)以某个集合中的某个键来分,这个键称为片键,根据设置的片键把一个集合的数据分到不同的片上,这个分片键可以是多个键的组合键

 

5.实际的生产环境

在一个实际的生产环境中会同时存在多个配置服务器,多个mongos路由进程,多个分片,每一个分片会是一个副本集。

因为配置服务器与mongos路由进程占用的资源非常少,所以有些人会通过不同的端口,把他们配置到同一台服务器上,但是不要把多个配置服务器与多个mongos路由进程配置在同一台服务器,最好是一台服务器一个配置服务器,一个路由进程就够,如果是多个在同一台服务器,当这个服务器挂掉了,那你的整个分片的架构可能就跟着挂了,不能提供服务了,下面给出一个参考的架构图。

mongodb 分片 性能 mongo 分片原理_服务器_02

6.搭建分片服务器架构的流程

1):创建配置服务器的数据与日志目录,并配置和启动配置服务器,主要参数:mongod --configsvr ..............

2):创建mongos的日志目录,因为mongos本身不存储数据,所以不用数据目录。接着配置和启动mongos路由进程,启动的时候是以mongos,来启动的。主要参数:mongos --configdb 配置服务器的ip:端口 ............

3) :  创建分片副本集的数据与日志目录,配置和启动副本集,主要参数:mongod --shardsvr --replSet 副本集名 .........

4):对分片副本集进行初始化,设置仲裁节点,把初始化信息写在config变量中,接着用rs.initiate(config)进行初始化

5):登录mongos,把副本集增加到切片中,必须在admin数据中运行命令:db.runCommand({"addshard":"副本集名称/ip:port,ip:port......","name":"分片名"})

6):打开数据库和集合的分片功能db.runCommand({"enableSharding":"数据库"}),db.runCommand({"shardcollection":"数据库.集合名","key":{"键名":1}})

 

7.分片架构规划

1)规划:如果按以上的架构图来搭建没有这么多服务器,所以我们以三台服务器为例分别是:192.168.1.1,192.168.1.2,192.168.1.3

配置服务器的端口是:20000,mongos路由的端口是:20004,副本集1的端口是:20001,副本集2的端口是:20002,副本集3的端口是:20003

2):架构图如下:

mongodb 分片 性能 mongo 分片原理_副本集_03

 

8.开始搭建分片

创建一个总目录shard,之后创建的目录都在这个文件夹中,假设现在正在mongodb的安装目录下,目录名为mongodb,在根目录下。

1):配置与启动配置服务器

  mkdir ./shard/config //配置服务器的目录

     mkdir ./shard/config/data  //配置服务器的数据目录

     mkdir ./shard/config/log  //配置服务器的日志目录

    //配置和启动配置服务器

    mongod --configsvr --dbpath="/mongodb/shard/config/data" --logpath="/mongodb/shard/config/log/config.log" --port 2000 --fork --logappend

   把以上的步骤分别在三台服务器中执行一遍

 

2):配置和启动mongos路由进程

  mkdir ./shard/mongos   //配置服务器的目录

      mkdir ./shard/mongos/log  //配置服务器的日志目录

       配置和启动mongos

   mongos --configdb 192.168.1.1:20000,192.168.1.2:20000,192.168.1.3:20000 --logpath="/mongodb/shard/mongos/log/mongos.log" --port 2004 --fork --logappend

  把以上的步骤分别在三台服务器中执行一遍

 

3):创建与启动第一副本集,并加入到分片中

  mkdir ./shard/replset/rs1/data

  mkdir ./shard/replset/rs1/log

     echo  -n 'shard'  | md5sum >> ./auth.txt(配置通信凭证文件)

    配置和启动副本集

    mongod --shardsrv --replset rs1 --keyFile  ./auth.txt  --dbpath=./shard/replset/rs1/data  --logpath=./shard/replset/rs1/log/rs1.log --fork --port 20001 --logappend

   分别在三台服务器中执行以上命令

  登录其中的一台并配置副本集:mongo 192.168.1.1:2001

 var config = {"_id":rs1,member:[{_id:1,host:192.168.1.1:20001},{_id:1,host:192.168.1.2:20001},{_id:1,host:192.168.1.3:20001,'arbiteOnly':true}]}

rs.initiate(config);

  登录其中一台mongos路由并把副本集加到分块中:

 mongo 192.168.1.1:20004

 db.runCommand({"addshard":"rs1/192.168.1.1:20001,192.168.1.2:20001,192.168.1.3:20001"}); //增加副本集到分片中

 db.runCommand({"enbaleSharding":test(数据库名)});//启动数据库分片

 db.runCommand({"shardCollection":test.user(集合名),key:{name(分块键):1}});//按数据库中的某个集合的某个健分片

 

4)重复第3个步骤创建rs2,rs3,但要修改相对应的地方,比如端口,和文件夹名称,副本集名称

 

5.查看分片的状态:db.printShardingStatus();

db.runCommand({"listShards":1});

 

6.删除分片:

db.runCommand({"removeshard":"ip:端口"});

删除的分片上的数据会移到其他分片上,移完之后自动删除分片.