分布式系统架构学习总结
分布式缓存
什么是缓存?
存储在计算机上的一个原始数据复制集,以便于访问
缓存是介于数据访问者和数据源之间的一种高速存储,当数据需要多次读取时用于加快读取速度。
缓存的关键指标
缓存命中率
影响命中率的指标
缓存键集合大小
可用内存空间
缓存对象生存空间
通读缓存
给客户端返回并在缓存未命中时请求实际数据客户端连的是通读缓存而非原始服务器
旁路缓存
应用会先询问缓存数据是否存在,如果存在使用缓存的数据,如果不存在,会连接数据源获取数据并更新缓存
分布式缓存模型
一致性 Hash
基于虚拟节点的一致性 Hash
合理使用缓存
频繁修改的数据
没有热点的访问
数据不一致与脏读
缓存雪崩:缓存服务器崩溃导致数据源压力增大而崩溃
缓存预热:提前加载缓存数据
缓存穿透:客户端持续请求不存在的数据,请求先穿过缓存到达数据源,导致服务崩溃,解决办法把不存在的 key 在缓存中设置为 nul
消息队列
同步调用和异步调用
同步调用
异步调用
消息队列构建异步调用架构
点对点模型
发布订阅模型
消息队列的好处
实现异步处理,提升处理性能
更好的伸缩性
削峰填谷
失败隔离和自我修复
解耦
事件驱动架构 EDA
MQ 产品比较
Rabbitmq 的主要特点是性能好,社区活跃,但是 Rabbitmq 用 Erlang 开发,对不熟悉 Erlang 的同学而言不便于二次开发和维护。
Activemq 影响比较广泛,可以跨平台,使用 Java 开发,对 Java 比较友好。
Rocketmq 是阿里推出的一个开源产品,也是使用 Java 开发,性能比较好,可靠性也比较高。
Kafka, Linkedin 出品的,Scala 开发,专门针对分布式场景进行了优化,因此分布式的伸缩性会比较好。
负载均衡
负载均衡架构
HTP 重定向负戴均衡
接收到用户的请求之后通过 301 重定向的方式把不同的真正的应用服务器地址返回给客户端,客户端再去请求应用服务器
DNS 负戴均衡
在 dns 解析阶段返回不同的应用服务器地址给客户端,从而让应用去请求不同的应用服务器
反向代理负载均衡
反向代理服务器接收来自客户端的请求转发至后端真正的应用服务器,并把应用服务器的响应返回给客户端
IP 负载均衡
负载均衡服务器通过 NAT 把用户请求的目标地址修改为应用服务器的 ip 地址之后把请求转发给不同的原因服务器,并在接收到应用服务器的响应包之后修改目标地址为客户端的 ip 把响应发送给客户端
数据链路层负载均衡
负载均衡服务器把请求的 MAC 地址修改为应用服务器的 MAC 地址,把请求的包转发到应用服务器,应用服务器处理完请求之后直接把响应发送给请求的源 IP 地址和端口
负载均衡算法
轮询:所有请求被依次分发到每个应用服务器上,适合于所有服务器硬件都相同的场
加权轮询:根据应用服务器硬件性能的情况,在轮询的基础上,按照配置的权重将请求分发到每个服务器,高性能的服务器分配更多请求
随机:请求被随机分配到各个应用服务器,在许多场合下,这种方案都很简单实用因为好的随机数本身就很均衡。如果应用服务器硬件配置不同,也可以很容易的使用加权随机算法。
最少连接:记录每个应用服务器正在处理的连接数(请求数),将新到的请求分发到最少连接的服务器上,应该说,这是最符合负载均衡定义的算法。
源地址散列:根据请求来源的 P 地址进行 Hash 计算,得到应用服务器,该算法可以保证同一个来源的请求总在同一个服务器上处理,实现会话粘滞
SESSION 管理
SESSION 复制
SESSION 绑定
利用 COOKIE 记录 SESSION
SESSION 服务器(推荐)
分布式数据库
MySQL 复制
主从复制
一主多从复制
分推负载
专机专用
便于冷备
高可用
主主复制
注意事项
主主复制的两个数据库不能并发写入。
复制只是增加了数据的读并发处理能力,没有增加写并发能力和存備能力。
更新表结构会导致巨大的同步延迟。
版权声明: 本文为 InfoQ 作者【qihuajun】的原创文章。
原文链接:【http://xie.infoq.cn/article/2d87ccf26ad819833d52443c4】。文章转载请联系作者。
评论