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

2.分片的条件
1):服务器磁盘不够的时候
2):服务器出现写瓶颈的时候
3):想将大量数据放在内存中提高性能
3.分片中的角色,有三种:
1):配置服务器:存放分片信息,分片的数据与片的关系
2):mongos路由:是一个路由进程,把所有对mongodb的数据读写请求根据配置服务器的配置信息分配到不同的分片服务器上去。本身不存储数据与配置信息,但会缓存配置信息,
3):片:指一个分片,这个分片可以是一台服务器,也可以是多台服务器组成的一个集群。对应的多台服务器中只能有一台主服务器
4.分片是以什么来分的
1)以数据库来分,那就是把数据库里的多个集合分到不同的分片上,同一个集合的数据只能在同一分片上
2)以某个集合中的某个键来分,这个键称为片键,根据设置的片键把一个集合的数据分到不同的片上,这个分片键可以是多个键的组合键
5.实际的生产环境
在一个实际的生产环境中会同时存在多个配置服务器,多个mongos路由进程,多个分片,每一个分片会是一个副本集。
因为配置服务器与mongos路由进程占用的资源非常少,所以有些人会通过不同的端口,把他们配置到同一台服务器上,但是不要把多个配置服务器与多个mongos路由进程配置在同一台服务器,最好是一台服务器一个配置服务器,一个路由进程就够,如果是多个在同一台服务器,当这个服务器挂掉了,那你的整个分片的架构可能就跟着挂了,不能提供服务了,下面给出一个参考的架构图。

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):架构图如下:

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:端口"});
删除的分片上的数据会移到其他分片上,移完之后自动删除分片.
mongodb系列之--分片的原理与配置的更多相关文章
- 13.MongoDB系列之分片简介
1. 分片概念 分片是指跨机器拆分数据的过程,有时也会用术语分区.MongoDB既可以手工分片,也支持自动分片 2. 理解集群组件 分片的目标之一是由多个分片组成的集群对应用程序来说就像是一台服务器. ...
- 16.MongoDB系列之分片管理
1. 查看当前状态 1.1 查看配置信息 mongos> use config // 查看分片 mongos> db.shards.find() { "_id" : & ...
- MongoDB分片技术原理和高可用集群配置方案
一.Sharding分片技术 1.分片概述 当数据量比较大的时候,我们需要把数分片运行在不同的机器中,以降低CPU.内存和Io的压力,Sharding就是数据库分片技术. MongoDB分片技术类似M ...
- 14.MongoDB系列之配置分片
1. 启动服务器 1.1 启动配置服务器 配置服务器是集群的大脑,保存着关于每个服务器包含哪些数据的所有元数据,因此,必须首先创建配置服务器. 由于资源限制,在同一机器上启动三个进程 # mkdir ...
- mongodb系列之---副本集配置与说明
在配置副本集之前,我们先来了解一些关于副本集的知识. 1,副本集的原理 副本集的原理与主从很相似,唯一不同的是,在主节点出现故障的时候,主从配置的从服务器不会自动的变为主服务器,而是要通过手动修改配置 ...
- mongodb复制+分片集原理
----------------------------------------复制集---------------------------------------- 一.复制集概述: Mongodb ...
- MongoDB 分片的原理、搭建、应用 !
MongoDB 分片的原理.搭建.应用 一.概念: 分片(sharding)是指将数据库拆分,将其分散在不同的机器上的过程.将数据分散到不同的机器上,不需要功能强大的服务器就可以存储更多的数据和处 ...
- Mongodb 笔记07 分片、配置分片、选择片键、分片管理
分片 1. 分片(sharding)是指将数据拆分,将其分散存放在不同的机器上的过程.有时也用分区(partitioning)来表示这个概念.将数据分散到不同的机器上,不需要功能强大的大型计算机就可以 ...
- mongodb系列之--mongodb 主从配置与说明
一.为什么要配置mongodb的主从: 1.做主从,可以说是做数据的备份,有利于故障的恢复 2.做主从,可以做到读写分离,主节点负责写操作,从节点负责读操作,这样就把读写压力分开,保证系统的稳定性. ...
随机推荐
- Linux 下不经过BIOS重启(i386)
前段时间有个项目,要求在Linux下不经过BIOS重启,i386平台. 一.可行性分析 众所周知,BIOS中包含了CPU及其他各种设备的初始化代码,Linux系统运行之后是否能够将各种用到的设备返回到 ...
- Linux下C/C++程序调试基础(GCC,G++,GDB,CGDB,DDD)
在写程序的时候,经常会遇到一些问题,比如某些变量计算结果不是我们预期的那样,这时我们需要对程序进行调试.本文主要介绍调试C/C++在Linux操作系统下主要的调试工具. 在Linux下写程序,C/C+ ...
- Dynamics CRM 通过PowerShell启用AllowDeclarativeWorkflows即自定义XAML WorkFlows
CRM的工作流即workflow,不了解的人乍听之下以为是审批流,其实不是的,CRM本身是不带审批功能的,要实现审批必须要第三方的工作流引擎的配合,当然你也可以自己开发. 工作流刚开始出现的时候只有异 ...
- Dynamics CRM 插件Plugin中获取和更新时间字段值的准确转换
前面两篇介绍了后台代码通过组织服务获取更新时间字段.窗体javascript通过Odata获取更新时间字段,最后篇来实验下在插件中的获取和更新时间字段是否需要时制的转化,为何说是最后篇呢,因为在CRM ...
- jsp中文乱码 Servlet中文乱码 utf-8
JSP+Servlet项目中,项目统一使用utf-8编码.配置过滤器过滤所以请求并设置utf-8编码,jsp页面也都设置utf-8,但是还有一点很容易忽视的就是tomcat也要设置utf-8,默认情况 ...
- 05 Activity生命周期
生命周期:一个Activity从创建到销毁经过的全部方法 1.onCreate() 创建一个Activity的时候执行的方法 2.onStart()Activity可以被看见到时候无法交互(没有焦点) ...
- SQL性能优化应该考虑哪些?
1.调整数据结构的设计.这一部分在开发信息系统之前完成,程序员需要考虑是否使用ORACLE数据库的分区功能,对于经常访问的数据库表是否需要建立索引等. 2.调整应用程序结构设计.这一部分也是在开 ...
- Spring中Bean多种实现切换方案
一个公共工程中的Spring配置文件,可能会被多个工程引用.因为每个工程可能只需要公共工程中的一部分Bean,所以这些工程的Spring容器启动时,需要区分开哪些Bean要创建出来.另一种场景是:想通 ...
- C++为什么要设计友元函数和友元类
1. 首先要提一下java,比如java定义一个类1.class,会生成字节码.java有反射机制,可以找到类对象,直接修改类的私有属性.逐渐反射机制成为了一种标准,sun做成标准,JDK的API函数 ...
- UNIX环境高级编程——管道读写规则和pipe Capacity、PIPE_BUF
一.当没有数据可读时O_NONBLOCK disable:read调用阻塞,即进程暂停执行,一直等到有数据来到为止. O_NONBLOCK enable:read调用返回-1,errno值为EAGAI ...