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

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

作者: 轻舞凋零 | 来源:发表于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