MongoDB学习笔记(六、MongoDB复制集与分片)
目录:
- MongoDB部署模型
- MongoDB可复制集
- MongoDB读写分离
- 分片架构部署
- 最佳实践
MongoDB部署模型:
单机 -> 可复制集 -> 分片集群

MongoDB可复制集:
可复制集是多台MongoDB节点之间分布和维护数据的方法;它可以将数据从一个节点复制到其它节点,并在修改时进行数据同步。
在3.0之前的版本这叫做主从复制,3.0+推荐使用这个可复制集。
1、为什么要使用复制集,有什么好处?
- 它可以尽可能的避免数据丢失,保障数据的安全性,提高系统安全性。(最少3个节点,最大50个)
- 它具有自动化灾备机制,在主节点宕机后会选举出一个新的主节点,提高系统的健壮性。(7个选举节点上限)
- 读写分离,提高系统性能。
2、可复制集的搭建:
a、安装3个及以上的MongoDB
b、配置mongodb.conf
replication:
// 集群名称
replSetName: name
// oplog大小
oplogSizeMB: 50
c、在primary节点上运行可复制集的初始命令
// 复制集初始化
rs.initiate({
'_id':'name',
'version':1,
'members':[{'_id':0, host:'ip:port'}]
}) // 添加子节点
rs.add('ip:port')
rs.add('ip2:port')
d、运行rs.status()或rs.isMaster()命令查看复制集状态。
3、可复制集架构及原理:
a、oplog:保存操作记录及时间戳。
b、数据同步:主从保持长轮询
- 从节点查看本机oplog最新的时间戳
- 查看主节点oplog中晚于此时间戳的文档
- 加载这些文档,并根据log执行写操作
c、心跳机制:每2秒进行一次心跳检测,发现故障后会进行选举和故障转移。
d、选举制度:当主节点故障后,其余节点根据优先级和bully算法选举出新的主节点,在此之间集群服务是只读的。
MongoDB读写分离:
对于MongoDB来说,主节点一般用于写数据,从节点用于读数据,且主节点也并不是固定的(当主节点宕机后会选举出一个新的主节点),所以在生产环境时客户端不能直连主节点。
所以我们需要配置集群节点:
<mongo:mongo-client replica-set="ip1:port1,ip2:port2,ip3:port3">
<mongo:client-options read-preference="SECONDARY_PREFERRED"/>
</mongo:mongo-client>
通过read-preference参数控制读写分离方式,其类型有以下几种:
- PRIMARY(默认):读操作都在主节点,若主节点不可用则报错。
- PRIMARY_PREFERRED:首选主节点,若主节点不可用则转移到其它从节点。
- SECONDARY:读从节点,不可用则报错。
- SECONDARY_PREFERRED(推荐):首选从节点,若是特殊情况则在主节点读(但主节点架构)。
- NEAREST:最邻近主节点。
分片架构部署:
为何要使用分片架构:
- 数据海量增长,需要更大的读写吞吐量
- 单台服务器的内存、CPU始终有瓶颈
分片架构的三个主要角色:
1、分片:分片架构中唯一存储数据的角色,它可以是单台服务器也可以是一个可复制集(生成环境推荐使用可复制集),每个分区上只存储部分数据。
2、路由:由于分片只存储部分数据,所以需要一个工具(工具为mongos)来讲请求处理到对应的分片中,而路由就充当这一角色。
3、配置服务器:存储集群的元数据(数据库、集合、分片的位置范围等日志信息),配置服务器最低3台。
分片架构的搭建:
1、分片服务器的配置(分片的三台服务器都需要执行)
./mongod --port 27010 --dbpath /usr/local/mongodb/data/db/27010 --logpath /usr/local/mongodb/logs/mongodb0.log --fork -- shardsvr
2、config服务器集群配置
./mongod --port 27011 /usr/local/mongodb/data/db/27011 --logpath /usr/local/mongodb/logs/mongodb1.log --fork --logappend --configsvr --replSet=cfrs1
rs.initiate({
'_id':'cfrs1',
'version':1,
'members':[{
'_id':0
'host':'主节点ip:主节点port'
}]
})
rs.add("从节点1ip:从节点1port")
rs.add("从节点2ip:从节点2port")
3、启动mongos路由
./mongos --configdb cfrs1/host1,host2,host3 --port 27016 --logpath /usr/local/mongodb/logs/mongodb6.log --fork --logappend
4、配置sharding
连接mongos,增加sharding
use admin
sh.addShard("host1")
sh.addShard("host2")
sh.addShard("host3")
// 设置db启动分片
sh.enableSharding('dbName')
// 配置collection分片键
sh.shardCollection(
'dbName.collectionName',
{'分片键字段名':1}
)
分片键选择的一些建议:
1、不推荐点:
- 不要使用自增长的字段作为分片键,避免热点问题。
- 不能使用粗粒度的分片键,避免数据块无法分割。
- 不能使用完全随机的分片键值,这样会造成查询性能低下。
2、推荐点:
- 使用与常用查询相关的字段作为分片键,且包含唯一字段(如业务主键,id等)。
- 索引对于分区同样重要,每个分片集合上要有同样的索引,分片键默认成为索引。
- 分片集合只允许在id和分片键上创建唯一索引。
最佳实践:
1、尽量选取稳定新版本64位的MongoDB。
2、数据模式设计;提倡单文档设计,将关联关系作为内嵌文档或者内嵌数组;当关联数据量较大时,考虑通过表关联实现,dbref或者自定义实现关联。
3、避免使用skip跳过大量数据
- 通过查询条件尽量缩小数据范围。
- 利用上一次的结果作为条件来查询下一页的结果。
4、避免单独使用不适用索引的查询符($ne、$nin、$where等)。
5、根据业务场景选择合适的写入策略,在数据安全和性能之间找到平衡点。
6、建立索引很重要。
7、生产环境中建议打开profile,便于优化系统性能。
8、生产环境中建议打开auth模式,保障系统安全。
9、不要将MongoDB和其他服务部署在同一台机器上(虽然MongoDB 占用的最大内存是可以配置的)。
10、单机一定要开启journal日志,数据量不太大的业务场景中,推荐多机器使用副本集,并开启读写分离。
11、分片键的注意事项。
MongoDB学习笔记(六、MongoDB复制集与分片)的更多相关文章
- MongoDB学习笔记(六) MongoDB索引用法和效率分析
MongoDB中的索引其实类似于关系型数据库,都是为了提高查询和排序的效率的,并且实现原理也基本一致.由于集合中的键(字段)可以是普通数据类型,也可以是子文档.MongoDB可以在各种类型的键上创建索 ...
- MongoDB学习笔记(六)--复制集+sharding分片 && 总结
复制集+sharding分片 背景 主机 IP 服务及端口 Server A ...
- Mongodb学习笔记一(Mongodb环境配置)
Mongodb学习 说明: MongoDB由databases组成,database由collections组成,collection由documents组成,document由fileds组成.Mo ...
- MongoDB学习笔记——Replica Set副本集
副本集 可以将MongoDB中的副本集看作一组服务器集群由一个主节点和多个副本节点等组成,相对于之前讲到的主从复制提供了故障自动转移的功能 副本集实现数据同步的方式依赖于local数据库中的oplog ...
- MongoDB学习笔记(一) MongoDB介绍及安装(摘)
MongoDB是一个高性能,开源,无模式的文档型数据库,是当前NoSql数据库中比较热门的一种.它在许多场景下可用于替代传统的关系型数据库或键/值存储方式.Mongo使用C++开发.Mongo的官方网 ...
- MongoDb 学习笔记(一) --- MongoDb 数据库介绍、安装、使用
1.数据库和文件的主要区别 . 数据库有数据库表.行和列的概念,让我们存储操作数据更方便 . 数据库提供了非常方便的接口,可以让 nodejs.php java .net 很方便的实现增加修改删除功能 ...
- MongoDB学习笔记一(MongoDB介绍 + 基本指令 + 查询语句)
什么是MongoDB MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统. 在高负载的情况下,添加更多的节点,可以保证服务器性能. MongoDB 旨在为WEB应用提供可扩 ...
- Mongodb学习笔记二(Mongodb基本命令)
第二章 基本命令 一.Mongodb命令 说明:Mongodb命令是区分大小写的,使用的命名规则是驼峰命名法. 对于database和collection无需主动创建,在插入数据时,如果databas ...
- MongoDB学习笔记八:复制
[主从复制]最基本的复制方式就是建立一个主节点和一个或多个从节点,每个从节点要知道主节点的地址.运行mongod --master启动主服务器.运行mongod --slave --source ma ...
- MongoDB学习笔记六:进阶指南
[数据库命令]『命令的工作原理』MongoDB中的命令其实是作为一种特殊类型的查询来实现的,这些查询针对$cmd集合来执行.runCommand仅仅是接受命令文档,执行等价查询,因此,> db. ...
随机推荐
- BX谷 2019年最新所有人都能学会的数据分析课视频教程
第一章 数据分析师职业概览 1-1 数据分析师的职业概览免费试学 数据分析师的"钱"景如何 什么人适合学数据分析 数据分析师的临界知识 数据分析师的主要职责 第二章 数据分析和数据 ...
- zabbix4.0.1 安装部署
zabbix安装部署 目录 一.环境准备... 3 1.1.版本:... 3 1.2.部署环境... 3 二.安装部署... 3 2.1.zabbix安装... 3 2.1.1.下载zabbix的rp ...
- 【新手必学】Python爬虫之多线程实战
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:清风化煞_ 正文 新手注意:如果你学习遇到问题找不到人解答,可以点 ...
- flex布局中flex-grow与flex-shrink的计算方式
CSS 中的 Flex(弹性布局) 可以很灵活的控制网页的布局,其中决定 Flex 布局内项目宽度/高度的是三个属性: flex-basis, flex-grow, flex-shrink. flex ...
- 玩转摄像头之 基于SDRAM缓冲 USB2.0视频采集系统 MT9T001、MT9P031 演示 展示
玩转摄像头之 基于SDRAM缓冲 USB视频采集系统 MT9T001.MT9P031 最新设计的系统: 核心板(FPGA+SDRAM)+底板(68013+DVP)+sensor 先看图 核心板 正 ...
- JS中的防抖和节流
JS-防抖和节流 在进行窗口的resize.scroll,输入框内容校验等操作时,如果事件处理函数调用的频率无限制,会加重浏览器的负担,导致用户体验非常糟糕.此时我们可以采用debounce(防抖)和 ...
- 延迟队列DelayQueue take() 源码分析
延迟队列DelayQueue take() 源码分析 在工作中使用了延迟队列,对其内部的实现很好奇,于是就研究了一下其运行原理,在这里就介绍一下take()方法的源码 1 take()源码 如下所示 ...
- Elasticsearch 监控指标解析
1.集群监控 集群监控主要包括两个方面的内容,分别是集群健康情况和集群的运行状态. 集群健康状态可以通过以下api获取: http://ip:9200/_cluster/health?pretty 关 ...
- javascript树形汇总金额
在开发企业应用的时候总会遇到树形汇总金额的场景,即将树形的列表中的叶子节点(没有子节点)的金额汇总到父节点上. 这种需求一般是在前端进行处理,即使用JavaScript处理,因为叶子节点的金额可能是不 ...
- Android 项目优化(七):阿里巴巴Android开发手册整理总结
本来之前觉得Android项目优化系列的文章基本整理完毕了,但是近期看了一下<阿里Android开发手册>有了很多收获,想再整理一篇,下面就开始吧. 先在这里列一下之前整理的文章及链接: ...