分布式技术及海量数据处理

CAP理论

  • 一致性(Consistency): 写操作之后的读操作,必须返回该值。
    • 强一致性
      对于关系型数据库,要求更新的数据立即能被后续操作看到,CAP理论的一致性指这个
    • 弱一致性
      如果能容忍后续的部分或者全部访问不到,则是弱一致性。
    • 最终一致性
      如果经过一段时间后要求能访问到更新后的数据,则是最终一致性
  • 可用性(Availability): 只要收到用户的请求,服务器就必须在合理的时间内给出正确的回应,不能不响应或者响应错误
  • 分区容错性(Partition Tolerance): 分布式系统出现网络分区(出现多个联通分支)的时候,仍然能够对外提供服务

主从数据库
在出现分区的情况下,系统在C和A之间只能二选一

分布式一致性框架

  1. zookeeper:强一致性
  2. etcd

BASE理论

  • 基本可用(Basically Available):分布式系统在出现故障的时候,允许损失部分可用性,即保证核心可用。
  • 软状态(Soft State):允许系统存在中间状态,而该中间状态不会影响系统整体可用性,例如订单状态处于支付中
  • 最终一致性(Eventually Consistency):系统中的所有数据副本经过一定时间后,最终能够达到一致的状态。

分布式事务一致性算法

  • 事务管理器负责协调各个节点事务的提交和回滚

2PC(二阶段提交)

过程

在这里插入图片描述

  • 准备阶段:各个分布式节点执行自身的本地事务,写undo日志和redo日志,但是不提交事务
  • 提交阶段:决定每个节点执行的事务是否需要提交,一个失败则回滚

缺点

  • 同步阻塞:在准备阶段和提交阶段所有资源是被锁住的,其他第三方节点不可访问
  • 单点故障:事务管理器发生故障将会导致所有参与者一直阻塞
  • 数据不一致:协调者发出commit请求后,未能正确到达参与者,只有部分参与者可以commit成功
  • 不确定性:当协事务管理器发送 commit 之后,并且此时只有一个参与者收到了 commit,那么当该参与者与事务管理器同时宕机之后,重新选举的事务管理器无法确定该条消息是否提交成功。

3PC(三阶段提交)

  • 超时机制:解决单点故障,一段时间得不到相应则事务失败
  • 在准备阶段增加一个CanCommit阶段减少同步阻塞问题

过程

  • CanCommit
    • 协调者向所有参与者发送消息,询问参与者是否可以执行事务提交
    • 参与者向协调者返回是否可以执行事务
  • PreCommit
    • 发送预提交请求:协调者向各参与者发送preCommit请求,并进入prepared阶段
    • 事务预提交:参与者接收到preCommit请求后,会执行事务操作,并将Undo和Redo信息记录到事务日记中
    • 各参与者向协调者反馈事务执行的响应:如果各参与者都成功执行了事务操作,那么反馈给协调者Ack响应,同时等待最终指令,提交commit或者终止abort
  • doCommit
    • 发送提交请求:假设协调者正常工作,接收到了所有参与者的ack响应,那么它将从预提交阶段进入提交状态,并向所有参与者发送doCommit请求
    • 事务提交:参与者收到doCommit请求后,正式提交事务,并在完成事务提交后释放占用的资源
    • 反馈事务提交结果:参与者完成事务提交后,向协调者发送ACK信息
    • 完成事务:协调者接收到所有参与者ack信息,完成事务

优点

  • 降低了参与者阻塞范围,Cancomit,如果不能
  • 在单点故障之后继续达成一致

分布式锁

Mysql分布式锁

  • 添加数据,利用主键的唯一性

Redis分布式锁

常规实现

if (setnx(key, 1) == 1){ // 如果key不存在,返回1
    expire(key, 30) // 设置key的过期时间
    try {
        //TODO 业务逻辑
    } finally {
        del(key)
    }
}

存在的问题

setnx和expire非原子性
  • 使用lua脚本
超时解锁导致并发
  • 为获取锁的线程增加守护线程,为将要过期但未释放的锁增加有效时间。
无法等待锁释放
  • 超时释放锁

一致性hash算法

key%N,key是数据的key,N是机器节点数,如果有一个机器加入或退出这个集群,则所有的数据映射都无效了

特点

  1. 平衡性

哈希的结果能够尽可能分布到所有的节点中去

  1. 单调性

新增或者删减节点时,不影响系统正常运行

  1. 分散性

数据应该分散地存放在分布式集群中的各个节点(节点自己可以有备份),不必每个节点都存储所有的数据。

原理

  • 采用hash环实现
    在这里插入图片描述
  • 增加节点
    在这里插入图片描述
  • 删除节点
    在这里插入图片描述

不平衡问题

虚拟节点

将1台物理服务器映射为多个虚拟服务器,放置到hash环上

海量数据处理

  1. hash:1.统计数量,2.分治映射
  2. 布隆过滤器:可以快速判断一定不存在
  3. bit-map:快速判断某数字存在与否
  4. Trie树:含有大量前缀的字符串统计数量
  5. 堆:查询topk
  6. 分治-归并整理结果:文件差分,每个文件有序,每次取每个文件中的最小值放入大数据文件内
  7. 桶排序:大数据求中位数

中位数

遍历一遍按第一位分两个文件,统计个数,0放入file-0,1放入file-1,确定中位数在哪个文件中
遍历一遍按第二位分两个文件,统计个数,0放入file-0,1放入file-1,确定中位数在哪个文件中

分布式常见问题

  1. 分布式ID
    使用时间戳+MAC地址
  2. 计数器算法
    使用redis的原子自增和过期策略
  3. 滑动窗口算法
  4. 漏桶算法
    • 定时去漏桶取数据,从而限制流量
    • 不能短时间内处理大量请求
  5. 令牌桶算法
    • 以一定的速率向桶中放入令牌
    • 可以短时间内处理大量请求
  6. 微服务设计原则
    • 单一职责
    • 服务自治
    • 轻量通信
    • 粒度进化
  7. 分布式session
    • session同步,多台服务器间同步session
    • session都加入到同一个redis集群中
    • nginx根据访问IP进行定位
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值