分布式和异步的技术选型
分布式缓存
定义
存储在计算机上的一个原始数据复制集,以便于访问
作用
介于数据访问者和数据源之间的一种高速存储,当数据需要多次读取的时候,用于加快读取速度。
区别
缓存 - 为了解决数据多次读取的问题
缓冲 - 为了解决数据读写问题,主要用于硬盘和网络
常见的缓存
CPU缓存
操作系统缓存
数据库缓存
JVM编译缓存
CDN缓存
代理和反向代理缓存
前端缓存
应用程序缓存
分布式对象缓存
本质
缓存的本质就是一个Hash表,是一个数组类型的数据,存储在连续的内存空间的数据集。
缓存关键指标
缓存命中率:能多少次重用于同一个缓存响应业务请求。
影响缓存命中率的关键指标:
缓存键集合大小。键数据量越少,缓存效率越高
缓存可使用内存空间。内存空间越大,缓存命中率就越高
缓存对象生存时间。缓存对象存活时间越长,缓存被重用的概率就越高
缓存分类
通读缓存
客户端连接的是通读缓存而不是实际响应的数据,通读缓存给客户端返回缓存数据,并在未命中的时候返回返回实际数据。
通读缓存包括:
代理缓存
反向代理缓存
CDN缓存
旁路缓存
旁路缓存是一个独立的键值对存储,客户端会先确认缓存对象是否存在,如果不存在或者过期则直接连接主数据源来组装数据,并将返回的数据存在缓存中以便下一次使用
旁路缓存包括:
浏览器缓存
本地缓存
分布式对象缓存(redis、Memcached等)
提升性能的原因
缓存数据通常存储在内存中,比存储在磁盘的数据又更快的访问速度。
缓存存储的是结果数据,无需再次计算,降低CPU资源消耗
降低了数据库、磁盘和网络的I/O压力
合理使用缓存
频繁修改的数据。读写比在2:1以上的数据使用缓存才有意义,否则会增加系统负担
没有热点的访问。缓存使用内存作为存储介质,内存资料宝贵,因此内存应该存储热点数据,应当遵循二八定律,将高频访问的数据存储在缓存中
更新数据时候通知缓存失效或者删除缓存。
应对缓存雪崩,避免大量请求直接访问数据库
采用缓存预热策略,在应用启动时或者访问低峰时期预加载缓存数据
避免缓存穿透,将不存在的数据进行一个较短时间的缓存
消息队列与异步架构
同步 vs 异步
同步
请求必须等待服务处理完成才能获得响应,如果服务处理特别耗时,那么请求将处于长时间等待的状态。
异步
无回调的异步流程
有回调的异步流程
消息队列
消息队列是一种典型的异步模型,将数据交给生产者发布消息后服务就处理完了,这个时候就能得到响应并将系统资源交给下一个任务了。
模型
典型的消息队列有三种角色:消息生产者、消息队列和消息消费者
模式
点对点模式:多个生产者生产同一消息供多个消费者消费
发布订阅模式:多个生产者发布不同Topic的消息,将不同Topic的消息发送到不同的消息队列中,消费者根据Topic寻找消息队列进行消费
好处
异步处理,提升性能
更好的伸缩性
削峰填谷
失败隔离和自我修复
解耦
负载均衡架构
分类
HTTP重定向负载均衡
HTTP重定向服务器是一台普通的应用服务器,其唯一个功能就是根据用户的HTTP请求计算出一台真实的服务器地址,并将该服务器地址写入HTTP重定向响应中(重定向响应状态码为302)返回给用户浏览器。用户浏览器在获取到响应之后,根据返回的信息,重新发送一个请求到真实的服务器上。
优点
实现简单
缺点
浏览器需要两次请求服务器才能完成一次访问,性能较差。
DNS负载均衡
DNS负载均衡是最常见的一种负载均衡方式,一般用于地理级别的负载均衡。DNS进行域名解析时每次域名解析请求都会根据对应的负载均衡算法计算出一个不同的IP地址并返回,这样A记录中配置多个服务器就可以构成一个集群,并可以实现负载均衡。
优点:
将负载均衡的工作交给DNS,省去了网站管理维护负载均衡服务器的麻烦。
技术实现比较灵活、方便,简单易行,成本低,使用于大多数TCP/IP应用。
对于部署在服务器上的应用来说不需要进行任何的代码修改即可实现不同机器上的应用访问。
服务器可以位于互联网的任意位置。
同时许多DNS还支持基于地理位置的域名解析,即会将域名解析成距离用户地理最近的一个服务器地址,这样就可以加速用户访问,改善性能。
缺点:
目前的DNS是多级解析的,每一级DNS都可能缓存A记录,当某台服务器下线之后,即使修改了A记录,要使其生效也需要较长的时间,这段时间,DNS任然会将域名解析到已下线的服务器上,最终导致用户访问失败。
不能够按服务器的处理能力来分配负载。DNS负载均衡采用的是简单的轮询算法,不能区分服务器之间的差异,不能反映服务器当前运行状态,所以其的负载均衡效果并不是太好。
可能会造成额外的网络问题。为了使本DNS服务器和其他DNS服务器及时交互,保证DNS数据及时更新,使地址能随机分配,一般都要将DNS的刷新时间设置的较小,但太小将会使DNS流量大增造成额外的网络问题
反向代理负载均衡
反向代理服务器管理了一组服务器,根据对应的负载均衡算法将不同的请求转发到不同的服务器上。
优点
反向代理负载均衡可以将优化的负载均衡策略和代理服务器的高速缓存技术结合在一起,提升静态网页的访问速度,提供有益的性能;
由于网络外部用户不能直接访问真实的服务器,具备额外的安全性
缺点
反向代理是处于OSI参考模型第七层应用的,所以就必须为每一种应用服务专门开发一个反向代理服务器,这样就限制了反向代理负载均衡技术的应用范围,现在一般都用于对web服务器的负载均衡
针对每一次代理,代理服务器就必须打开两个连接,一个对外,一个对内,因此在并发连接请求数量非常大的时候,代理服务器的负载也就非常大了,在最后代理服务器本身会成为服务的瓶颈。
IP负载均衡
IP负载均衡工作在传输层,它可以修改发送来的IP数据包,将数据包的目标地址修改为实际服务器地址。
优点
IP负载均衡在内核进程完成数据分发,处理性能很好
缺点
最大响应数据吞吐量将受到负载均衡服务器网卡带宽的限制
数据链路层负载均衡
数据链路层负载均衡通过修改通信协议数据包的mac地址进行负载均衡
算法
###### 轮询法
将请求按顺序轮流地分配到后端服务器上,它均衡地对待后端的每一台服务器,而不关心服务器实际的连接数和当前的系统负载。
###### 随机法
通过随机算法,根据服务器的列表大小值来随机选取其中的一台服务器进行访问。随着调用次数增多,其实际效果越来越接近于平均分配调用量到每一台服务器,也就是轮询的结果。
###### 源地址哈希法
通过哈希函数计算客户端的IP地址得到的一个数值,用该数值对服务器列表的大小进行取模运算,得到的结果便是客服端要访问服务器的序号。采用源地址哈希法进行负载均衡,同一IP地址的客户端,当后端服务器列表不变时,它每次都会映射到同一台后端服务器进行访问。
###### 加权轮询法
不同的服务器的配置和当前负载并不相同,因此它们的抗压能力也不相同。给配置高、负载低的机器配置更高的权重,让其处理更多的请;而配置低、负载高的机器,给其分配较低的权重,降低其系统负载,加权轮询能很好地处理这一问题,并将请求顺序且按照权重分配到后端。
###### 加权随机法
与加权轮询法一样,加权随机法也根据后端机器的配置,系统的负载分配不同的权重。不同的是,它是按照权重随机请求后端服务器,而非顺序。
###### 最小连接数法
最小连接数算法比较灵活和智能,由于后端服务器的配置不尽相同,对于请求的处理有快有慢,它是根据后端服务器当前的连接情况,动态地选取其中当前
分布式数据库
主备复制
客户端正常时候连接主机进行读写操作,主机的数据同步到备机上,当主机异常之后通过人工操作将客户端访问切到备机上直到主机恢复。
优点
对备机无感知,切换的时候只是地址变换了
主备之间只需要进行数据复制,无状态判断、主备倒置等复杂的操作
缺点
硬件成本浪费,无故障时备机并未对外提供读写服务
故障时需人工干预,无法自动切换。
现在互联网应用中已经很少使用这种架构模式了。
主从复制
主从架构是指客户端连接主机和从机,但是写操作只与主机交互,主从直接进行数据复制。
与主备架构相比
主从架构在主机故障之时,读操作相关业务不收影响
从机发挥了硬件性能提供了读操作服务
比主备架构复制,外部有了主从感知。
主备/主从倒置
互联式
从机根据状态判断是否要升级为主机
中介式
中介式是指主从(备)机都将状态上报给中介主机,最后由中介主机决定是否进行置换
模拟式
从(备)机模拟向主机进行读写操作,通过读写操作来判断主机状态
主主复制
主主架构就是两台机器都是主机,客户端可以任选一台主机进行读写操作。
这些复制架构本质上并没有增加并发能力和存储能力,而且容易出现数据不一致,数据复制过程中会出现延迟的问题。
版权声明: 本文为 InfoQ 作者【拈香(曾德政)】的原创文章。
原文链接:【http://xie.infoq.cn/article/92ad2daaaae934c826cc69635】。文章转载请联系作者。
评论