Mongo

ACID
- Atomic 原子性
- Consistent 一致性
- Isolated 隔离性
- Durable 持久性


CAP
- 一致性
- 可用性
- 容错性

在任何时间点,一个分布式系统都只能满足上面三个保障中的两个


BASE
- 基本可用
- 软状态
- 最终一致性

NRW : 描述最终一致性模型在NoSQL 数据库中的实现
- N 数据库已经保留的数据副本数量
- R 是在返回一个读取请求的输出之前,一个应用程序需要涉及的副本数量
- W 是在一个写造作被标记位成功完成之前需要对其进行写入的数据副本数量

  • 写操作

N=W,
返回给客户端并且将写操作标记为成功之前,
写操作将更新所有的数据副本.

W=1 、R=N,
写操作仅更新任意一个副本,并且将写操作标记为成功,
写操作快速完成,降低了读性能

N>W>1
需要成功更新多个节点
并非所有节点都需要同时更新

读操作
N<W+R
总是确保一个读操作检索最新的值


NoSQL优点

  • 高扩展性
  • 可维护性和管理运营:处理自动修复、分布式数据以及较简单的数据模型
  • 低成本
  • 灵活数据模型

基于文档形式存储数据:MongoDB


mongo 将数据存储为Binary JSON 、BSON

具有一种主从复制方式
主机接受写请求

提升写的性能可以使用分片
分片在mongo中是自动化的,

是一个面向文档的DBMS,数据被存储为文档

实现Mongo的语言是C++

动态模式
相同集合中的文档可以具有相同或不同的字段集或结构


  • BSON

是JSON数据模型的一种扩展形式

  • _id

唯一表示每一行

  • 固定集合

  • 多态模式

集合具有不同类型或模式的文档的一种模式


Mongo 部署

主从复制
一个主节点,需要在mongo启动的时候进行指定
主节点,只会输出数据到从节点上
容易发生单点故障

副本集
具有自动故障恢复功能的主从集群
高可用
写操作在主节点,可分布式读取数据

  • 仲裁节点:
    副本集中的一个mongo实例,并不保存数据,只负责选举投票
    当票数一致时,出来进行判决

  • 主节点
    负责接收客户端的请求写入数据等操作

  • 从节点
    负责从主节点复制数据
    提供数据读取服务

还依赖与oplog 操作日志、心跳heartbeat

  • oplog
    从节点只要监控主节点的写入操作,
    并且模仿主节点的写入操作就能完成一样的数据新增和更新
    oplog 是一个固定集合,位于每个复制节点的local数据库,
    记录复制的操作,只记录改变了数据的操作
    每个文档代表主节点上执行的一个操作
    默认大小是空余磁盘空间的5%

  • 心跳机制
    心跳检测有助于发现故障进行自动选举和故障转移

同步步骤

从节点
1、查看自己oplog里最后一条的时间戳
2、查询主节点oplog里所有大于此时间戳的文档
3、添加操作日志到自己的oplog里

主节点:
存放复制状态,到local中,local不会标题从节点复制
记录从节点交互连接、记录同步等参数

选举机制

选举过程可以由任意的非主节点发起
选举过程中整个集群服务是制度的,不能执行写入操作

非仲裁节点都有一个优先级配置,
优先级越大的,优先成为主节点

Bully算法,
集群中的每个成员都可以声明它是主节点并通知其他节点
别的节点可以选择接收或者参与竞争
拥有多数节点投票的从节点才能成为新的主节点

优先级低的可能短暂的成为主节点,运行一段时间会继续发起选举

分片sharding

将数据进行拆分,分散的保存在不同的机器上的过程
主要是通过数据分流、块的拆分、块的迁移

数据分流存放策略:

  • 哈希分片
  • 区间分片
  • 标签分片

分片之前需要设置一个shard key
可以是集合文档中的某个字段或几个字段组成的一个复合的shard key

分片集群数据库服务是不允许插入没有shard key的文档的

1、区间分片

对统一类型的shard key 获取最大值和最小值,
然后根据已有的shard key 、服务器数量进行数据分配

2、哈希分片
仍然是基于区间分片,
只是将提供的shard key 散列成一个非常大的长整型作为最终的shard key
mongo 会自动将shard key 进行散列计算之后再进行区间划分
支持单个字段作为 shard key
好处是保证数据在各个节点分布基本均匀,损失了查询性能

3、标签分片

手工设置数据保存在那个分片节点服务器上

chunkSize 和块拆分

数据分流后在shard 中是以chunk的形式存在的
每个块的范围都是由片键起始值和终止值来标识的

数据集合分片后会创建一个初始块
初始块包含大量数据则会被切割多个较小的块,这就是块拆分
chunkSize是设置块的大小的参数
块的拆分是逻辑操作,不会影响分片中文档的物理位置

数据迁移

数据的迁移是以chunk为单位的,
位于一个分片中一段连续的片键的的范围
块是逻辑上的,并不是物理上的,
块不表示磁盘上连续的文档,每个单独的块都表示一段联系范围的数据,

分片集群是通过在分片中移动块来实现均衡的,称之为迁移,是真实的物理操作

迁移是由平衡器的软件进程来进行管理的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值