分片(sharding是MongoDB将大型集合分割到不同服务器(或者说集群)上所采用的方法,主要为应对高吞吐量与大数据量的应用场景提供了方法。

和既有的分库分表、分区方案相比,MongoDB的最大区别在于它几乎能自动完成所有事情,只要告诉MongoDB要分配数据,它就能自动维护数据在不同服务器之间的均衡。

一. 分片的集群组件

1.Mongos 【路由】  

作为请求的访问入口,所有的请求都由mongos来路由、分发、合并,这些动作对客户端driver透明,用户连接mongos就像连接mongod一样使用。Mongos会根据请求类型及shard key将请求路由到对应的Shard。

2.Config Server  【配置服务器】

存储Sharding Cluster 的所有元数据,所有的元数据都存储在config数据库;

*保存每个分片上的chunk的信息 * 保存chunk上的片键范围。

3. Shard  【分片】 

存储应用数据记录。

二. 分片优势

1.对集群进行抽象,让集群“不可见”,分片对应用系统是透明的。

Mongos是专有路由进程,其会将客户端发来的请求准确无误的路由到集群中的一个或者一组服务器上,同时会把接收到的响应拼装起来发回到客户端。

2.保证集群总是可读写

将MongoDB的分片和复制集功能结合使用,在确保数据分片到多台服务器的同时,也确保了每分数据都有相应的备份,可以确保有服务器坏掉时,其他的从库可以立即接替坏掉的部分继续工作。提高了集群的可用性和可靠性。

3.使集群易于扩展

当系统需要更多的空间和资源的时候,MongoDB使我们可以按需方便的扩充系统容量。

三. 分片部署注意事项(常见错误)

1.配置可复制集作为分片节点与配置单独使用的可复制集基本一样。但启动参数中需指定—shardsvr参数。

否则,在启动数据库分片时报错:{"code" : 193,"ok" : 0, "errmsg" : "Cannot accept sharding commands if not started with --shardsvr“}。

2.创建配置服务器集群时,不能设置见证节点。

否则,报错 "errmsg" : "Arbiters are not allowed in replica set configurations being used for config servers"。

3.配置Mongos 实例时,请不要配置dbpath参数。

否则,设置dbpath参数,服务无法正常启动,报错:Error parsing INI config file: unrecognised option 'dbpath'。

4.配置Mongos 实例时,需设置Keyfile。

否则,不设置Keyfile,Service无法正常启动, 报错:2018-05-10T15:30:26.791+0800 W SHARDING [mongosMain] Error initializing sharding state, sleeping for 2 seconds and trying again :: caused by :: Unauthorized: Error loading clusterID :: caused by :: not authorized on config to execute command { find: “version”, readConcern: { level: “majority”, afterOpTime: { ts: Timestamp 1525937413000|2, t: 1 } }, maxTimeMS: 30000 

5.分片集合设置。

分片不会默认生成,需要先在数据库中启动分片(sh.enableSharding(“DBName”)),然后再设置集合分片(sh.shardCollection(“Collection”{片键}))

四. 分片管理的注意事项(常用命令)

1.检查shards 配置及状态

db.runCommand({listshards:1})

2. 检查数据库主片的地址以及是否分区

db.getSiblingDB("config").databases.find()

3. 检查数据块的数量

db.chunks.count()  --需切换到配置数据库(config

4. 查看分片的详细信息,包括数据库信息和范围信息

sh.status()

5. 索引是优化查询性能的重要手段。当在分片集合上声明索引时,每个分片都会为自己的集合部分定义单独的索引。分片集合只允许在_id字段和分片键上建立唯一索引。

6. 分割和迁移 MongoDB底层依赖2个机制来保持集群的平衡:分割和迁移。

分割是把一个大的数据块分割为2个更小的数据块的过程。迁移就是在分片之间移动数据块的过程。当某些分片服务器包含的数据块数据量大大超过其他分片服务器时就会触发迁移的过程,这个触发器叫做迁移回合(migration round)

6.1 迁移触发条件

6.2 查看Balancer 进程是否开启 sh.getBalancerState()

     6.3 停Balancer 进程 sh.stopBalancer()开启Balancer 进程

6.4. 默认情况下 Balancer 进程一直在运行,为了降低Balancer进程对系统的运行,可以为Balancer进程设置运行时间窗口,让Balancer进程在指定的时间窗口操作。

6.4.1 例如设置Balancer进程在23:00到6:00时间窗口内执行。db.settings.update({ _id : "balancer" }, { $set : { activeWindow : { start : "23:00", stop : "6:00" } } }, true )  ;

           

6.4.2 删除Balancer进程运行时间窗口

6.5. 查看块的范围

6.5.1 如果集合数据量较小,可以直接通过sh.status()查看

6.5.2 如果集合数据量较大,sh.status()无法反应此集合的分块信息。此时,可通过执行以下命令查看printShardingStatus(db.getSisterDB("config"),1);

6.5.3 也可将命令切换到config数据库下,执行db.chunks.find()查看。可以输入制定参数,例如,查看分片repsms2,集合cloud-docs.PushMessageRecord的块情况(cloud-docs为数据库名称)

db.chunks.find({"shard" : "repsms2","ns" : "cloud-docs.PushMessageRecord"}).pretty()

五. 备注

分片集群管理的数据量比较大,并且分片的架构相对比较复杂。所以,一定在业务需求需要上分片时,再上分片,且不可准求“炫”的技术而上分片。另外,上线后,相关的监控一定要部署,逐渐完善。

本文版权归作者所有,未经作者同意不得转载,谢谢配合!!!

MongoDB分片 在部署和维护管理 中常见事项的总结的更多相关文章

  1. OpenStack安装部署管理中常见问题解决方法

    一.网络问题-network 更多网络原理机制可以参考<OpenStack云平台的网络模式及其工作机制>. 1.1.控制节点与网络控制器区别 OpenStack平台中有两种类型的物理节点, ...

  2. 009.MongoDB分片群集部署

    一 前期准备 1.1 组件说明 MongoDB分片群集包含以下组件: shard:每个分片是分片数据的子集.从MongoDB 3.6开始,必须将分片部署为副本集. mongos:mongos充当查询路 ...

  3. MongoDB 分片管理

    在MongoDB(版本 3.2.9)中,分片集群(sharded cluster)是一种水平扩展数据库系统性能的方法,能够将数据集分布式存储在不同的分片(shard)上,每个分片只保存数据集的一部分, ...

  4. MongoDB 分片管理(不定时更新)

    背景: 通过上一篇的 MongoDB 分片的原理.搭建.应用 大致了解了MongoDB分片的安装和一些基本的使用情况,现在来说明下如何管理和优化MongoDB分片的使用. 知识点: 1) 分片的配置和 ...

  5. Kubernetes——基于容器技术的分布式架构领先方案,它的目标是管理跨多个主机的容器,提供基本的部署,维护以及运用伸缩

    1.Kubernetes介绍 1.1 简介 Kubernetes是什么?首先,它是一个全新的基于容器技术的分布式架构领先方案.其次,它是一个开放的开发平台.最后,它是一个完备的分布式系统支撑平台.Ku ...

  6. CentOS7+Docker+MangoDB下部署简单的MongoDB分片集群

    简单的在Docker上快速部署MongoDB分片集群 前言 文中使用的环境如下 OS:CentOS Linux release 7.5.1804 (Core) Docker:Docker versio ...

  7. mongodb分片部署

    Mongodb 分片部署 配置mongodb集群,比如 在3个server上配置 3 shard的Mongodb集群: 架构: 1.每片数据需要3个mongod server,2个为主从数据节点:1个 ...

  8. MongoDB分片群集的部署(用心描述,详细易懂)!!

    概念: MongoDB分片是使用多个服务器存储数据的方法,以支持巨大的数据存储和对数据进行存储 优势: 1.减少了每个分片需啊哟处理的请求数,群集可以提高自己的存储容量和吞吐量 2.减少了每个分片存储 ...

  9. mongodb 集群部署--分片服务器搭建

    部署分片服务器 1.分片 为了突破单点数据库服务器的I/O能力限制,对数据库存储进行水平扩展,严格地说,每一个服务器或者实例或者复制集就是一个分片. 2.优势 提供类似现行增·长架构 提高数据可用性 ...

随机推荐

  1. [Swift]LeetCode479. 最大回文数乘积 | Largest Palindrome Product

    Find the largest palindrome made from the product of two n-digit numbers. Since the result could be ...

  2. Python档案袋(文件系列操作 )

    文件读写基础 简单的读文件: # r 表示只能读 #打开文件,得到文件光标对象,文件不存在则报错 f=open("ww.txt","r",encoding=&q ...

  3. Java并发编程-volatile可见性的介绍

    要学习好Java的多线程,就一定得对volatile关键字的作用机制了熟于胸.最近博主看了大量关于volatile的相关博客,对其有了一点初步的理解和认识,下面通过自己的话叙述整理一遍. 有什么用? ...

  4. partition分区

    1.按id拆分 mysql -uroot mysql>use test; mysql>create table topic ( tid ) not ),partition t1 value ...

  5. Cassandra事务与关系型数据库事务有何区别

    Cassandra不会使用回滚和锁机制来实现关系型数据的ACID事务,相比较于提供原子性,隔离性和持久化,Cassandra提供最终(可调节的)一致性,让用户决定为每个事务提供强一致性或者最终一致性. ...

  6. 关于pycharm安装出现的interpreter field is empty,无法创建项目存储位置

    关于pycharm安装出现的interpreter field is empty(解释器为空) 关于pycharm安装出现的interpreter field is empty,无法创建项目存储的位置 ...

  7. CSRF攻击原理及防御

    一.CSRF攻击原理 CSRF是什么呢?CSRF全名是Cross-site request forgery,是一种对网站的恶意利用,CSRF比XSS更具危险性.想要深入理解CSRF的攻击特性我们有必要 ...

  8. JS判断客户端是否是iOS或者Android手机移动端(转载)

    前言: 上午有一个移动端的项目负责人问我,在ios系统上样式出现问题,因为内核原因,我改来改去,在ios弄好了,但在安卓有问题了,突然想到了一种办法,既然ios是一种机型,安卓是一种机型,可以检测用户 ...

  9. 详解intellij idea搭建SSM框架(spring+maven+mybatis+mysql+junit)(上)

    SSM(Spring+SpringMVC+MyBatis)框架集由Spring.SpringMVC.MyBatis三个开源框架整合而成,常作为数据源较简单的web项目的框架. 其中spring是一个轻 ...

  10. hibernate易混淆点

    萌新小笔记: 用过hibernate的小伙伴肯定经常看到这几个东西吧!但是初学者常常会把这几个搞不清楚:dataSource,session,sessionFactory(dataSource),hi ...