分布式

作者: 小丸子的呆地 | 来源:发表于2021-11-01 14:16 被阅读0次

    CAP原理

    • P 分区容错性
    • A 数据一致性
    • C 可用性

    CAP主要描述,在网络正常时我的分布式服务同时满足这三个特性,在发生网络分区的时候需要从A和C中选择一个保证

    BASE理论

    • 基本可用 可用性包含正常返回和响应时间,在基本可用下允许部分接口响应时间超过正常返回时间
    • 软状态 允许中间态
    • 最终一致性 节点间数据的终将在某个时间节点上达成一致

    分布式、集群、SOA、微服务

    • 分布式 强调的是节点之间协同工作,可以是不同的实例(订单-钱包),也可以是相同的实例(zookeeper)
    • 集群 强调的是节点分区,独立完成服务

    集群和分布式没有并非是互斥的概念,一个分布式项目可以是一个集群比如zookeeper

    • SOA面向服务架构 早期的分布式架构,为了提升性能拆分业务系统中相关联的业务到不同节点,然后集群部署,拆分粒度较粗;早期的SOA依赖ESB服务总线转发服务,有性能瓶颈和安全隐患
    • 微服务 让服务彻底组件化,更细粒度的拆分业务(认证中心的例子),对各种中间件也有了清晰的定义,注册中心、配置中心、RPC、网关、消息队列、负载均衡、等,成为了一种生态;去中心化

    一致性模型

    强一致性、最终一致性、因果一致性、单调一致性、事务一致性

    一致性策略

    • NWR N备份数量、W写入同步数量、R读取备份数量,不同的配置产生不同的一致性,
    • WARO 写时同步所有的备份才算成功,能保证读的高可用,但是一旦有一个备份同步失败就会导致操作失败,服务不可用;kafka的ack.all,优化只写ISR列表
    • Quorum机制 R=N-W+1 可以保证一定可以读到最新数据
    • paxos 算法理念,用于确定某一个值的一致性;两阶段:发起提案,接收提案
    • raft leader-follower模型,follower只做高可用不处理任何请求;放射状选举
    • zab zk原子广播协议,消息传递和崩溃恢复;网状选举

    负载均衡策略

    • 轮询
    • 加权轮询
    • 随机
    • 加权随机
    • 哈希 一般是IP
    • 最小链接

    高并发限流策略

    • 滚动窗口计数 边界问题,cpu利用不均
    • 滑动窗口计数
    • 令牌桶 令牌桶模式的核心是固定“进口”速率,桶大小就是程序最大并发数量;双桶三色标记;RateLimiter;突然给我100个请求,我就100个一起处理
    • 漏桶 漏桶模式的核心是固定“出口”的速率。给我100个请求,我也是10个10个处理,只是有了100个的buffer

    漏桶算法关注的是请求被以一定速率转发,容易引起资源业务服务资源利用不充分;令牌算法关注的是单位时间内的最大请求数,一定程度上容忍短时间的高并发,但如果配置不当容易造成服务器阻塞甚至宕机。

    分布式事物

    • XA协议 有一个协调者和多个数据库;两阶段,都执行完了,再commit,失败了都rollback;三阶段,增加了预执行提前判断一下数据库的可用性
    • JTA java定义的符合xa协议的规范,由数据库供应商实现的
    • TCC try commit cancle;两阶段事务补偿机制,事物放在try块里执行,抛出异常了就执行cancle操作,没有异常就执行commit操作
    • saga 多阶段事物补偿机制,事物过程中,每个节点都提交本地事物,一旦发生失败,补偿前面所有节点
    • Seata 支持at、tcc、saga、xa

    AT模式 拦截用户sql,解析之后找到对应修改行,进行快照;如果回滚,就使用快照数据,如果提交,就删除快照即可

    分布式设计的目的

    • 可扩展
    • 高可用
    • 组件化可复用
    • 高可靠
    • 可管理

    缓存寻址策略

    • hash 将key经过hash后,与实例数量取模,算出应该请求哪个实例;实例之间互相独立,线性拓展实例,实现简单;增删实例之后整个需要rehash
    • 一致性hash 一般使用0~2^32 形成环形链表,对实例进行hash,算出实例节点,key进行hash之后,找到对应节点之后如果没有实例,就顺时针找,直到找到实例;增删节点只会影响附近两个实例;hash倾斜,使用虚拟节点,一个实例分配多个id进行hash
    • hash槽 使用固定数量的一个槽位,通常会使用上万槽位,每个实例负责一段槽位;key经过hash算法,落到对应槽位,进而找到对应实例;增删实例只需要移动对应槽位的数据;redis cluster使用的就是16000多个槽位

    分布式锁

    分布式锁设计需要解决问题:原子,可见,可重入,防止死锁,锁续期,阻塞

    • 数据库实现 插入一行记录,key列使用唯一索引,其他列存储重入次数、线程ID、过期时间;没有获得锁的线程,自旋sleep;独立线程定时扫描已过期未释放的行,防止死锁;频繁写库的性能
    • redis实现 利用setNx+setEx或者set(k,v,nx,px)方法的原子性,想某key写入一个线程ID,删除时先判断线程ID,lua脚本原子操作,防止错误删除;本地使用cnt记录重入次数;key设置过期时间防止死锁;redisson看门狗解决续期;集群问题,redLock解决

    redisson看门狗定时器,10s续期一次
    redlock 按顺序向集群每个节点请求一个锁,根据一定超时时间判断是否跳过,超过一半的节点加锁成功就返回

    • zk实现 首先创建一个永久的锁节点,在这个锁节点下创建有序临时节点,第一个节点获得锁,之后的节点各自监听前一个节点的事件;在节点内部维护一个数值用于可重入;链接断开临时节点会自动删除,防止死锁;临时节点删除后会通知到监听的节点,下一个节点获得锁;顺序节点解决惊群效应

    什么是RPC

    远程过程调用,能让程序员像调用本地方法一样调用其他服务的方法。在调用过程需要服务路由、负载均衡、熔断降级、序列化反序列化、通讯等功能。

    RPC执行原理

    接口层 写业务逻辑
    代理层 接口的代理实现
    路由层 需要获取服务的具体地址
    负载均衡 根据规则在多个地址之间选择合适的
    熔断降级 如果发生异常要进行对应的熔断降级策略
    协议层 选择对应的协议Http、tcp、dubbo
    链接层 建立链接进行通讯
    序列化与反序列化 将数据进行序列化

    消息队列的作用

    异步、解耦、削峰、冗余、扩展、可用、可靠

    缓存雪崩、缓存穿透、缓存击穿

    缓存雪崩 某些场景下缓存大面积失效、或还未加载;流量大量请求到数据库;缓存预热,缓存过期时间不固定
    缓存穿透 数据库没有的数据,不会缓存,被请求的时候流量还是会请求到数据库;对空缓存,布隆过滤器(对时空时不空的数据不太友好)
    缓存击穿 热key缓存失效或者被删除,导致大量流量请求到数据库;热key发现,永不过期,单独存储,缓存降级

    相关文章

      网友评论

          本文标题:分布式

          本文链接:https://www.haomeiwen.com/subject/poakgltx.html