mongodb 集群维护
1 简介
   谈谈mongodb的集群架构
2 常用的维护命令
   1 查看状态 sh.status()
        1 version
        2 shards: 分片集群shard成员
        3 balancer: 平衡器的相关状态:运行状态 尝试次数
          平衡器 sh.setBalancerState(true) 开启
          sh.stopBalancer() 关闭
          sh.getBalancerState() 查看状态
    4 database: 注意几个值
        1 partitioned:false代表没有采用分片
        2 primary s1 代表在s1片上 如果有分片 会列出分片信息 比如 shard key 和chunks
   2 config服务库
      db.collection.status()查看分片信息
3 如何开启分片
   1 库开启分片功能
      use admin && db.runCommand( { enablesharding : "test" } )
   2 集合片键加索引
     use test && db.vast.ensureIndex( { id: 1 } )
3创建片键
   use admin && db.runCommand( { shardcollection : "test.vast1",key : {id: 1,name:1} } )
 4 数据插入测试
  for(i=0;20000<i<40000;i++){ db.vast1.insert({"id":i,"name":"clsn","age":70,"date":new Date()}); }
  db.vast.stats()
 5 相关总结:
   1 片键必须是集合文档中的单索引或者是混合索引
   2 片键添加方法sh.shardCollection( namespace, key ) namespace 参数是 database.collection
   3 片键一经定义后是无法修改的,定义后有且只有一个,索引本身有唯一性
   4 方法 db启动分片->分片加索引->collection启动分片
 4  谈分片
  1 理想分片:
  目标:将插入数据均匀分布到各个分片上;保证CRUD操作能够利用局部性;有足够的粒度进行块拆分。
  影响:增加可用的RAM,增加可用磁盘空间,减轻单台服务器的负载,处理单个mongod无法承受的吞吐量
  分片场景
  1 业务上线时已指定好合理的分片字段,后期不用再更改
     需要制定合理的分片规则
   2 业务上线制定不合理的分片字段,后期需要重新制定分片规则
     需要mongodump出数据,再制定分片,mongorestore导入
   3 业务上线时并没有指定任何分片字段,后期需要制定分片规则
    需要指定合理的分片规则,然后执行分片命令,这里需要的时间比较长,建议后台执行
   可能出现的问题
    1 数据分配不均匀,常见于片键的选择不合理 可以通过sh.status() shard的数量对比来判断是否分配不均匀
    2 在move chunk过程中,查询的数据不准确
 2 分片分类
  范围分片
   eg:id,date等带有明显顺序的
   优势 如果使用升序片键,那么数据物理上会是连续的,有利于基于范围的查询
   缺点 1 降低写入性能,空间块利用率不高 2 需要大量的move chunk,因为降低了数据均衡处理能力
   启用命令
   db.runCommand( { shardcollection : "test.vast1",key : {date:1} } )
   Hash 分片
   eg:是用户名 邮件地址 udid(唯一设备标识符) md5散列值 或者是数据集中其他一些没有规律的键
   优势 能非常好的平均分配到各个shard上
   缺点 1 查询性能不高,需要与磁盘更多的IO交互
   启用命令
   db.runCommand( { shardcollection : "test.vast2",key : {date:"hashed"} } )
   联合分片
   随机值+范围值组成的联合索引
   推荐
   注意:
   1 采用hash分片的策略chunk总数远远小于升序分片的个数
   2 无论采用什么分片策略都要考虑业务本身,业务快是唯一的条件
5  谈谈move chunk
   触发条件
   1 写入数据时,会先创建一个min,max的chunk,随着数据量不断增加,超过分裂阈值,就会触发chunk分裂
    2 当各个分片的chunk分布不均衡,会触发移动过程
   决定机制
   Balancer在工作时,会根据shardtag,集合的chunk数量,shard间的chunk数量差值来决定是否需要迁移
  迁移过程
   1 原分片开始启动moveChunk命令,在移动的过程中,所有的操作还会指向原来的分片
   2 目标分片开始创建所需要的索引,在3.0以后,moveChunk需要在移动之前,目标分片中存在所有的索引,可以理解为先在目标分片中创建这个索引。
   3 目标分片开始向原分片请求数据,并复制数据
   4 当数据全部写入到目标分片中,目标分片连接并更新config数据库对应的块信息
   5 最后,原分片将这部分块删除。
   6 迁移完成标记sh.status()的balance
    "state" : 0, #0:非活动状态,1:正在获取,但还没有执行,2:正在均衡,迁移,有锁
    Migration Results for the last 24 hours
    success 数值不断增长,代表正在进行move chunk
   手动触发迁移
   希望分隔一个已经存在数据的集合,这个集合所有的数据都在一个分片中
   手动触发命令
   Sh.moveChunk({“test.vfast1”,{id},”shard_2”})
   参数1为namespace 参数2为片键名称 参数3为shard实例名
  日志
  moving chunk 可以在route.log中观测到
  类似于 [Balancer] moving chunk ns
6  集群自动扩容
 1  无论何种分片方式都可以实现shard的自动扩容
 2 采用db.runCommand({addshard)即可
 3 等待move chunk完成
7  相关错误汇总
  1 MongoDB chunk too big to move
    1 sh.stopBalancer() //关闭平衡器
    2 use config && db.chunks.find({jumbo:true}) //查找大块
    3 sh.splitAt("db.collection", {shardkye:"拆分的临界值"})//进行手动拆分
    4 sh.moveChunk("db.collection", {shardkey:"shardkey所在的块"}, "需要移动的目标分片ID");//进行手动迁移
    5 sh.startBalancer()//打开平衡器
    总结 2.4.6版本以上,在这个版本里修复了SERVER-9365的问题,能平均地拆分数据块。值得注意的是,由于有的数据块包含有非常多的文档,将会花一定的时间将这些大数据块拆分成可以迁移的小数据块。在这个过程中,您可能还会看到”chunk too big to move”的错误。
8 管理难度
   1单副本集(易)
   2集群简单分片(中)
   3集群复杂分片(难)
补充一点 能简单就简单,不要硬上集群,哪怕上了集群,要简单分片,否则管理难度会成倍增大
9 备份补充
 mongo --eval "sh.stopBalancer()" 
 mongodump -o $TAR_FILE_PATH 
 mongo --eval "sh.setBalancerState(true)"

mongodb系列~mongodb集群介绍与管理的更多相关文章

  1. Elasticsearch系列---生产集群的索引管理

    概要 索引是我们使用Elasticsearch里最频繁的部分日常的操作都与索引有关,本篇从运维人员的视角,来玩一玩Elasticsearch的索引操作. 基本操作 在运维童鞋的视角里,索引的日常操作除 ...

  2. MongoDB之分片集群(Sharding)

    MongoDB之分片集群(Sharding) 一.基本概念 分片(sharding)是一个通过多台机器分配数据的方法.MongoDB使用分片支持大数据集和高吞吐量的操作.大数据集和高吞吐量的数据库系统 ...

  3. 【七】MongoDB管理之分片集群介绍

    分片是横跨多台主机存储数据记录的过程,它是MongoDB针对日益增长的数据需求而采用的解决方案.随着数据的快速增长,单台服务器已经无法满足读写高吞吐量的需求.分片通过水平扩展的方式解决了这个问题.通过 ...

  4. Mongodb主从复制/ 副本集/分片集群介绍

    前面的文章介绍了Mongodb的安装使用,在 MongoDB 中,有两种数据冗余方式,一种 是 Master-Slave 模式(主从复制),一种是 Replica Sets 模式(副本集). Mong ...

  5. MongoDB之分片集群与复制集

    分片集群 1.1.概念 分片集群是将数据存储在多台机器上的操作,主要由查询路由mongos.分片.配置服务器组成. ●查询路由根据配置服务器上的元数据将请求分发到相应的分片上,本身不存储集群的元数据, ...

  6. 搭建一个分布式MongoDB鉴权集群

    今天休假在家,测试并搭建了一个replica set shard MongoDB鉴权集群.replica set shard 鉴权集群中文资料比较少,本文是个人笔记,同时也希望对后来者有所帮助.本文仅 ...

  7. (转)MongoDB分片实战 集群搭建

    环境准备 Linux环境 主机 OS 备注 192.168.32.13 CentOS6.3 64位 普通PC 192.168.71.43 CentOS6.2 64位 服务器,NUMA CPU架构 Mo ...

  8. mongodb 3.4 集群搭建:分片+副本集

    mongodb是最常用的nodql数据库,在数据库排名中已经上升到了前六.这篇文章介绍如何搭建高可用的mongodb(分片+副本)集群. 在搭建集群之前,需要首先了解几个概念:路由,分片.副本集.配置 ...

  9. MongoDB高可用集群搭建(主从、分片、路由、安全验证)

    目录 一.环境准备 1.部署图 2.模块介绍 3.服务器准备 二.环境变量 1.准备三台集群 2.安装解压 3.配置环境变量 三.集群搭建 1.新建配置目录 2.修改配置文件 3.分发其他节点 4.批 ...

随机推荐

  1. Android Studio 每次运行都会再下载一遍,修改

    Android Studio 每次运行都会再下载一遍 把 gradle 设置 use local gradle distribution

  2. (Prim算法)codeVs 1078 最小生成树

    题目描述 Description 农民约翰被选为他们镇的镇长!他其中一个竞选承诺就是在镇上建立起互联网,并连接到所有的农场.当然,他需要你的帮助. 约翰已经给他的农场安排了一条高速的网络线路,他想把这 ...

  3. (DIjsktra算法) nyoj1401-一场说走就走的旅行

    题目描述: 有一天,孩子回来对我说:“妈妈,听说马尔代夫很不错,放假了我想去玩.”马尔代夫?我也想去!没有人不向往一场说走就走的旅行!“其实我想去的地方很多,呼伦贝尔大草原.玉龙雪山.布达拉宫.艾菲尔 ...

  4. 环境变量(1):PATH的修改

    1.查看当前PATH值:echo $PATH 2.只在当前会话生效操作 1)PATH=$PATH:/sbin 2)export PATH 3)echo $PATH  --再看此时的PATH值!不过这个 ...

  5. BZOJ4653 尺取法 + 线段树

    https://www.lydsy.com/JudgeOnline/problem.php?id=4653 首先很容易想到离散之后排序,用线段树或者树状数组去维护. 问题在于按照什么排序,如果按照左端 ...

  6. 网络编程基础【day10】:我是一个线程(四)

    本节内容 1.第一回 初生牛犊 2.第二回 渐入佳境 3.第三回 虎口脱险 4.第四回 江湖再见 第一回 初生牛犊 我是一个线程,我一出生就被编了个号:0x3704,然后被领到一个昏暗的屋子里,在这里 ...

  7. springboot中通用mapper结合mybatis generator的使用

    通用mapper就是指的是  tk.mybatis  包下的.这个是通用mapper就是说自动生成的dao层需要继承这个框架提供的mapper类.而我们之前用的org.mybatis这个最开始是普通的 ...

  8. centos6.5mini版安装及配置

    1.安装选择界面,这个选第一个 2.镜像完整性检查,一般都是跳过SKIP 3.欢迎界面,进入安装了 4.语言选择,这个是没有中文的,用默认的英文就行 5.键盘布局,用默认的us 6.这里会给一个警告, ...

  9. Doker安装日志,留个记录而已

    tianye@ubuntu:/usr/share$ wget -qO- https://get.docker.com/ | sh # Executing docker install script, ...

  10. Nullable<DateTime> DateTime? 格式转换问题 tostring()

    解决方案: DateTime? dt2 = DateTime.Now; dt2.GetValueOrDefault().ToString("yyyy-MM-dd"); 控制器代码: ...