mongodb系列~mongodb集群介绍与管理
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集群介绍与管理的更多相关文章
- Elasticsearch系列---生产集群的索引管理
概要 索引是我们使用Elasticsearch里最频繁的部分日常的操作都与索引有关,本篇从运维人员的视角,来玩一玩Elasticsearch的索引操作. 基本操作 在运维童鞋的视角里,索引的日常操作除 ...
- MongoDB之分片集群(Sharding)
MongoDB之分片集群(Sharding) 一.基本概念 分片(sharding)是一个通过多台机器分配数据的方法.MongoDB使用分片支持大数据集和高吞吐量的操作.大数据集和高吞吐量的数据库系统 ...
- 【七】MongoDB管理之分片集群介绍
分片是横跨多台主机存储数据记录的过程,它是MongoDB针对日益增长的数据需求而采用的解决方案.随着数据的快速增长,单台服务器已经无法满足读写高吞吐量的需求.分片通过水平扩展的方式解决了这个问题.通过 ...
- Mongodb主从复制/ 副本集/分片集群介绍
前面的文章介绍了Mongodb的安装使用,在 MongoDB 中,有两种数据冗余方式,一种 是 Master-Slave 模式(主从复制),一种是 Replica Sets 模式(副本集). Mong ...
- MongoDB之分片集群与复制集
分片集群 1.1.概念 分片集群是将数据存储在多台机器上的操作,主要由查询路由mongos.分片.配置服务器组成. ●查询路由根据配置服务器上的元数据将请求分发到相应的分片上,本身不存储集群的元数据, ...
- 搭建一个分布式MongoDB鉴权集群
今天休假在家,测试并搭建了一个replica set shard MongoDB鉴权集群.replica set shard 鉴权集群中文资料比较少,本文是个人笔记,同时也希望对后来者有所帮助.本文仅 ...
- (转)MongoDB分片实战 集群搭建
环境准备 Linux环境 主机 OS 备注 192.168.32.13 CentOS6.3 64位 普通PC 192.168.71.43 CentOS6.2 64位 服务器,NUMA CPU架构 Mo ...
- mongodb 3.4 集群搭建:分片+副本集
mongodb是最常用的nodql数据库,在数据库排名中已经上升到了前六.这篇文章介绍如何搭建高可用的mongodb(分片+副本)集群. 在搭建集群之前,需要首先了解几个概念:路由,分片.副本集.配置 ...
- MongoDB高可用集群搭建(主从、分片、路由、安全验证)
目录 一.环境准备 1.部署图 2.模块介绍 3.服务器准备 二.环境变量 1.准备三台集群 2.安装解压 3.配置环境变量 三.集群搭建 1.新建配置目录 2.修改配置文件 3.分发其他节点 4.批 ...
随机推荐
- Android Studio 每次运行都会再下载一遍,修改
Android Studio 每次运行都会再下载一遍 把 gradle 设置 use local gradle distribution
- (Prim算法)codeVs 1078 最小生成树
题目描述 Description 农民约翰被选为他们镇的镇长!他其中一个竞选承诺就是在镇上建立起互联网,并连接到所有的农场.当然,他需要你的帮助. 约翰已经给他的农场安排了一条高速的网络线路,他想把这 ...
- (DIjsktra算法) nyoj1401-一场说走就走的旅行
题目描述: 有一天,孩子回来对我说:“妈妈,听说马尔代夫很不错,放假了我想去玩.”马尔代夫?我也想去!没有人不向往一场说走就走的旅行!“其实我想去的地方很多,呼伦贝尔大草原.玉龙雪山.布达拉宫.艾菲尔 ...
- 环境变量(1):PATH的修改
1.查看当前PATH值:echo $PATH 2.只在当前会话生效操作 1)PATH=$PATH:/sbin 2)export PATH 3)echo $PATH --再看此时的PATH值!不过这个 ...
- BZOJ4653 尺取法 + 线段树
https://www.lydsy.com/JudgeOnline/problem.php?id=4653 首先很容易想到离散之后排序,用线段树或者树状数组去维护. 问题在于按照什么排序,如果按照左端 ...
- 网络编程基础【day10】:我是一个线程(四)
本节内容 1.第一回 初生牛犊 2.第二回 渐入佳境 3.第三回 虎口脱险 4.第四回 江湖再见 第一回 初生牛犊 我是一个线程,我一出生就被编了个号:0x3704,然后被领到一个昏暗的屋子里,在这里 ...
- springboot中通用mapper结合mybatis generator的使用
通用mapper就是指的是 tk.mybatis 包下的.这个是通用mapper就是说自动生成的dao层需要继承这个框架提供的mapper类.而我们之前用的org.mybatis这个最开始是普通的 ...
- centos6.5mini版安装及配置
1.安装选择界面,这个选第一个 2.镜像完整性检查,一般都是跳过SKIP 3.欢迎界面,进入安装了 4.语言选择,这个是没有中文的,用默认的英文就行 5.键盘布局,用默认的us 6.这里会给一个警告, ...
- Doker安装日志,留个记录而已
tianye@ubuntu:/usr/share$ wget -qO- https://get.docker.com/ | sh # Executing docker install script, ...
- Nullable<DateTime> DateTime? 格式转换问题 tostring()
解决方案: DateTime? dt2 = DateTime.Now; dt2.GetValueOrDefault().ToString("yyyy-MM-dd"); 控制器代码: ...