美文网首页
分布式应用系统架构设计与实践之基础组件(二)

分布式应用系统架构设计与实践之基础组件(二)

作者: 轻舞凋零 | 来源:发表于2022-06-15 23:19 被阅读0次

    3 常见的基础组件

    四个基础组件

    • 数据缓存:数据进行缓存,提高数据获取性能
    • 数据分发:数据中转和消息通知机制,实现服务的解耦以及异构系统整合
    • 数据存储:数据的存储,保障数据的稳定可靠
    • 服务远程调用: 新上线服务的发现以及故障服务的下线处理和流量转移

    3.1 数据缓存

    memcache内存缓存。最大1MB

    redis支持多种结构的缓存(string, list, set, sortset, hash)

    redis的高可用

    • 主从复制
      • 复制偏移量,复制缓冲区,服务ID
    • 哨兵监控
      • 当从不可用,从剩余的从中选择一台为主,并修改其他服务器的配置指向新主
      • 功能:监控,通知(故障时发送通知),自动故障转移

    redis集群实现

    • 数据分片的好处
      • 每个集群存储子集
      • 利用多台机器的内存总和
      • 利用多核
      • 更高的带宽
    • 客户端分片
      • 关键字分片(容易出现热点和数据倾斜)
      • 取模分片(不方便迁移)
      • 关键字哈希分片(有效处理迁移和倾斜)
    • 基于代理的分片
      • twemproxy
        • 优点 接入友好,故障自动检测,连接损耗降低
        • 缺点:处理性能有损,不利于监控维护,扩容工作量大
        • 扩容问题:可以是多级的twemproxy
      • codis
      • 组成: codis-proxy,codis-redis,codis-config,zookeeper
      • 功能
      • redis-cluster路由查询:redis集群(16348个槽)
        • 节点间通过gossip协议通信
        • 数据分片
        • 数据复制(每个节点都有主从节点,可以高可用的切换)
        • 客户端路由
        • 智能客户端
        • 故障发现及恢复
        • 缺点:带宽较高
    • 跨机房同步方案
      • 主从模式
        • 数据同步(两个机房都有伪装成从服务器,进行数据同步)
        • 数据同步服务高可用:注册中心(主从同步)
        • redis的高可用:通过主从模式及哨兵模式来实现
          • 开源实现阿里的redis-shake,xpipe
      • 代理模式
      • 在每个redis服务器端节点上封装一个代理层,实现数据代理转发及数据同步写入,保障机房内以及机房间的数据同步。
      • 优点:上层业务无感知
      • 缺点:每个节点都需要额外部署代理,运维难度增大。写入性能较大降低
      • 样例:Dynomite
    • 多活服务器模式(机房的redis都可以读写)
      • 业务层写入(简单,不可复用)
      • 监听变更事件(注意循环写入,数据的延迟)
      • 伪装从服务器写入命令(拉取,解析,回访,发送接收)
      • aof日志同步信息(日志同步,唯一标识,最终一致性)
        • apsaraDB for redis

    3.2 数据分发

    数据分发的主要功能

    • 提升性能:异步调用,将复杂的逻辑处理放到队列之后,可以提升数据接入层的处理性能--例如数据采集
    • 系统解耦:多服务之间通过数据总线解耦
    • 流量消峰:数据缓存功能。

    常用的消息队列:

    • rabitmq pull/push 主从,从备份,万,支持有序,支持事务
    • activemq pull/push zk+lever的db,从备份,万,支持有序,支持事务
    • rocketmq pull/push 多主多从,从备份,各类刷盘复制,10万,支持有序,支持事务
    • kafka pull leader选举+follower通过复制,从备份,各类刷盘复制机制,10万,支持有序,支持事务

    消息队列的属性

    • 协议
    • 是否支持批量
    • 消息推拉模式
    • 高可用
    • 数据可靠性
    • 秒级单机吞吐
    • 消息延时
    • 持久化
    • 有序性
    • 事务
    • 集群
    • 负载均衡

    3.2.1 kafka的分区机制及其副本

    分区机制

    • 主要功能:一个leader和多个Follower,
    • 分区策略
      • 轮询策略。消息id取余
      • 随机策略。随意挑一个分区
      • 自定义策略。
        • 按消息键保存策略
        • 按区域分区策略
      • 粘连分区策略-尽量将每个分区填满

    副本机制

    • 主副本,从副本。从副本是主副本的备份
      • 核心概念
        • 主副本
        • 从副本
        • 副本集合AR(如果落后太多,就会被剔除或者添加,阀值控制)
        • 同步副本集合ISR
        • 水位HW,用来区分哪些消息被提交确认了。(提交确认的水位值)
          • ISR中的副本都从主副本拉取了消息后,主副本才会递增HW,在主副本中存在,主要用来保证主副本切换时消息不丢失
        • LEO 标记每个分区的最后一条消息

    kafka的acks参数

    • 0 主副本写入返回
    • 1 无需等待主副本返回
    • -1 表示ISR都成功才返回

    3.2.1 kafka的高吞吐实现方案

    kafka高性能的原因

    • 顺序读写
      • 消息按照顺序追加到每个分区尾部,顺序写入
      • 顺序读磁盘比随机内存性能高
      • 顺序读磁盘比随机读磁盘高五个数量级
    • 磁盘处理方案
      • 基于时间
      • 基于文件大小
    • 零拷贝
      • 功能:避免内核态和用户态之间的拷贝次数
      • kafka的零拷贝:输入的文件句柄,消息偏移量,一个获取消息量
    • 页缓存
      • 利用操作系统的页缓存技术,利用内存提高I/O效率
      • 页缓存可以实现,内存映射文件,实现文件到物理文件的直接映射。
        • 避免用户态对象的内存额外占用
        • 避免用户态的内存垃圾回收
    • 日志存储级查询
      • kafka写入文件的最小单位是segment,一个分区有多个段
      • segment通过跳表查询到消息的偏移量
        • 索引文件里面按照消息偏移量查询它在日志里面对应的日志偏移量
    • 批量读写
    • 批量压缩
      • 压缩多条消息
      • 递归的消息集合。可以通过压缩格式传输和存储
      • 支持多种压缩格式gzip和snappy
    • Reactor网络模型
    • selector,accpetor,OP_WRITE,OP_READ,OP_CONNECT

    kafka的跨机房双活方案

    • Mirror-Maker(mm1,mm2)
    • MM1
      • 多机房单向同步
      • 多机房双向同步
      • M1的方案:建立相同的两个主题1和主题2,主题间相互同步
      • M1只能同步一个主题,同一主题双向同步,会有循环依赖问题
        -MM2
      • 协调器(coordinator),动态化配置,工作实例
      • 一个实例:生产者,消费者,连接器

    3.3 数据存储

    关系数据库,易于使用和理解,例如mysql

    键值对缓存数据库redis

    文档型数据库mongdob

    面向内容搜索的数据库elasticsearch

    面向可扩展的分布式数据存储的HBASE

    面向海量图关系存储的数据库Neo4j

    3.3.1 Mysql

    高可用方案:HMA,30秒内自动完成数据切换

    • 组成
      • 管理节点
      • 数据节点
    • 工作流程
      • 宕机探测,日志复制,选主,日志补偿
      • 缺点:无法分类故障,连接压力大时的响应问题,网络分区导致的脑裂

    3.3.2 HBASE

    核心概念

    • zk
    • master 管理regionServer的状态,为regionServer分配region
    • regionServer 外部访问的服务器,承载读取和写入操作
      • ILog,MemStore,HFile
    • Hlog。写日志记录,为保障数据的故障恢复,它发生在数据写入HFile之前
    • DataNode:HDFS的数据落盘节点

    保障整体性能

    • 分布式。master--多个regionServer,多个region
    • 内存写入。写入内存,阀值刷盘
    • 读高性能。行键索引。找到regionServer,regionServer查找memstore,没有查询缓存,到文件
    • 落盘的可靠性。wal机制
    • 分区的动态分区:总量和分区数呈正比

    适用的场景

    • 写密集而读较少的场景
    • 海量增长以及对可用性要求高的场景
    • 简单的关系查询场景。

    3.3.3 Mongodb

    集群方式

    • 主从
    • 副本集。故障自动转移,bully算法
    • 分片:路由服务,配置服务,分片存储

    多机房部署

    • 副本集模式。跨机房复制效率问题。MongoShake
    • 交叉部署模式。多几分分片交叉部署

    适用场景

    • 读写密集,地理位置查询,数据模型无法确认场景,海量数据存储,应用不需要事务以及复杂连表查询场景

    3.3.4 Neo4j

    集群模式

    • 主从集群方案。故障转移,法定成员数,选举规则,事务管理
    • 因果集群方案。核心服务器(raft协议,负责写),副本服务器(负责读)。

    应用场景

    • 社交网络
    • 推荐引擎
    • 网络运维
    • 风控服务

    3.3.5 内容搜索数据库 Elasticsearch

    es搜索引擎

    • 分配存储
      -主节点和副本集交叉部署

    如何实现高可用

    • 集群状态同步。主从同步和确认
    • 节点发现。主副节点加入,离开
    • 数据同步。主分片节点。客户端传入版本号。

    4 服务远程调用

    4.1 RPC架构及其原理

    RPC的五部分

    • 客户端函数调用
    • 客户端存根(服务端信息,服务序列化打包,)
    • 注册及发现
    • 服务器存根(接收客户端请求并解压,反序列化后调用服务端的接口函数)
    • 服务端函数

    常用的协议

    • http xml的soap, json的rest,二进制的hessian,grpc
    • tcp mina,netty,dubbo

    序列化,反序列化

    rpc框架

    • 标准的规范协议,序列化和反序列化
    • 网络协议透明
    • 数据格式透明
    • 跨语言调用特性

    4.2 Dubbo架构及其原理

    组成

    • 服务提供方
    • 服务调用方
    • 注册服务 zk,redis,multicast,simple
    • 监控
    • 容器
    • 协议:dubbo,http,mc,thrift,redis

    4.1 gRPC架构及其原理

    基于protocal buffers的远程调用服务

    相关文章

      网友评论

          本文标题:分布式应用系统架构设计与实践之基础组件(二)

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