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协议通信
- 数据分片
- 数据复制(每个节点都有主从节点,可以高可用的切换)
- 客户端路由
- 智能客户端
- 故障发现及恢复
- 缺点:带宽较高
- twemproxy
- 跨机房同步方案
- 主从模式
- 数据同步(两个机房都有伪装成从服务器,进行数据同步)
- 数据同步服务高可用:注册中心(主从同步)
- 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的远程调用服务
网友评论