中间件技术及双十一实践·软负载篇
软负载是分布式系统中极为普遍的技术之一。在分布式环境中,为了保证高可用性,通常同一个应用或同一个服务的提供方都会部署多份,以达到对等服务。而软负载就像一个引路人,帮助服务的消费者在这些对等的服务中合理地选择一个来执行相关的业务逻辑。
1.1、ConfigServerConfigServer主要提供非持久配置的发布和订阅。07/08年间在淘宝内部开发使用的时候,由于ZooKeeper还没有开源,不然可能会基于ZooKeeper来进行改造。主要使用场景是为分布式服务框架提供软负载功能所必须的服务地址列表。
结合淘宝业务场景的发展,与ZooKeeper相比主要有以下一些特点:
面对双11巨大的网站请求,对ConfigServer的数据推送环节考验尤其巨大,如何稳定、高效且正确的完成数据推送任务,成为双11前夕困扰ConfigServer团队最大的问题。在平时的正常运行中,ConfigServer管理的配置数据和订阅者数量已经达到一定量级,服务端的一次重启可能会引起大量的数据推送。举例来说:交易的某个服务有2000台,每个服务发布者信息200B,订阅者5000个,那么这个交易服务可用地址列表有变动,会产生2GB(2000*200B*5000)的数据推送。交易的应用有很多个服务,如果应用发布或者重启,会瞬间产生巨大的流量将ConfigServer服务端的网卡压满。当网卡压满后:保持长连接的心跳检测包会超时,导致与客户端的连接会持续在一个不稳定的状态,集群间数据同步也会受影响。
针对这个问题, ConfigServer在推送数据上做了两个方面的优化:
Diamond主要提供持久配置的发布和订阅服务,最大特点是结构简单,稳定可靠。Diamond的主要使用场景是用来进行动态数据库切换与扩容,进行一些业务系统运行时开关配置的推送。Diamond产品专注于高可用性,基于此在架构、容灾机制、数据获取模型上有一些与同类产品的不同之处。
Diamond结构非常简单,也属于是无单点的架构模型,
发布或者更新配置数据时,步骤如下:
写入MySql数据库 写本地磁盘 通知集群其他机器去数据库dump更新的数据订阅方获取配置数据时,直接读取服务端本地磁盘文件,尽量减少对数据库压力。
这种架构用短暂的延时换取最大的性能和一致性,一些配置不能接受延时的情况下,通过API可以获取数据库中的最新配置。
容灾机制
Diamond作为一个分布式环境下的持久配置系统,有一套完备的容灾机制,数据存储在:数据库、服务端磁盘、客户端缓存目录以及可以手工干预的容灾目录。客户端通过API获取配置数据按照固定的顺序去不同的数据源获取数据:容灾目录- 服务端磁盘- 客户端缓存。因此,面对如下情况,Diamond均能很好的应对:
数据库主库不可用,可以切换到备库,Diamond继续提供服务 数据库主备库全部不可用,Diamond通过本地缓存可以继续提供读服务 数据库主备库全部不可用,Diamond服务端全部不可用,Diamond客户端使用缓存目录继续运行,支持离线启动 数据库主备库全部不可用,Diamond服务端全部不可用,Diamond客户端缓存数据被删,可以通过拷贝备份的缓存目录到容灾目录下继续使用综上所述,只有在同时碰到如下四个条件的情况下,客户端应用才无法启动: 数据库主备库全部不可用、Diamond服务端全部不可用、Diamond客户端缓存被清空、客户端没有备份的缓存文件。
1.4、Diamond双11准备与优化长轮询改造
客户端采用推拉结合的策略在长连接和短连接之间取得一个平衡,让服务端不用太关注连接的管理,又可以获得长连接的及时性。
客户端发起一个对比请求到服务端,请求中包含客户端订阅的数据的指纹 服务端检查客户端的指纹是否与最新数据匹配 如果匹配,服务端持有连接 如果30秒内没有相关数据变化,服务端持有连接30秒后释放 如果30秒内有相关数据变化,服务端立即返回变化数据的IDDiamond通过这种多重容灾机制以及推拉结合的方式,让客户端逻辑尽量简单,而且高效稳定,使其成为名副其实的“钻石”。
软负载系统引导着分布式请求的来龙去脉,管理着分布式离散数据的聚合与分发,成为了合理且最大化使用分布式系统资源的保证。在2013年的双11购物狂欢节中,面对巨大的消费者请求,ConfigServer集群共10台机器,支撑近60,000长连接,发布配置总量700,000条,订阅配置总量3,000,000条,数据推送峰值600MB/S。Diamond集群共48台,90,000条非聚合配置,380,000条聚合配置,TPS高峰期间达到18000,数据变更15000次,客户端感知最大延时小于2秒。双十一当天部分数据库做了切换,用户完全没有感知。
相关文章
- 查询系统负载信息 Linux 命令详解
- 【GOTC 预告】王思宇:从 OpenKruise 看云原生应用负载发展趋势
- 再论基于云存储的互联网直播:大幅度降低流量成本,自动负载均衡,无限带宽,多点备份,可靠下载
- 开源jms服务ActiveMQ的负载均衡+高可用部署方案探索
- Atitit springcloud的艺术 attilax总结 目录 1.1. 服务治理:Spring Cloud Eureka 39 注册中心1 1.2. 第4章 客户端负载均衡:Spring
- spring cloud --- Ribbon 客户端负载均衡 + RestTemplate ---心得【无熔断器】
- nginx+tomcat负载均衡策略
- 使用LVS实现负载均衡原理及安装配置详解
- LVS负载均衡在Ubuntu环境下部署详解
- 【转】浅谈Nginx负载均衡与F5的区别
- Nginx 反向代理与负载均衡详解