LinkedIn通过迁移至HTTP/2显著提升Espresso数据库的可扩展性和性能
LinkedIn通过将其Espresso数据库从HTTP/1.1迁移到HTTP/2,显著提升了系统的可扩展性和性能。这一迁移减少了连接数、延迟和垃圾回收时间。为了实现这些改进,团队优化了Netty的默认HTTP/2栈,使其更符合需求。
Espresso数据库的背景
Espresso是LinkedIn构建在MySQL之上的文档平台,用于存储和服务大部分数据。随着LinkedIn平台的有机增长,数据量不断增加,迫使公司不断扩展Espresso集群的规模,并引入优化措施,如为Espresso引入集中式缓存层,以及采用Protocol Buffers进行服务间通信。
Espresso的架构
Espresso的事务栈由两个主要组件组成:路由器和存储节点。路由器负责将请求定向到正确的存储节点,存储节点则负责与MySQL集群交互并适当调整数据格式。这些组件之间的通信使用HTTP协议,具体使用Netty框架。随着时间推移,团队观察到Espresso集群的可扩展性逐渐下降。
HTTP/1.1的挑战
在HTTP/1.1下,路由器与存储节点之间存在数百万个并发连接,导致可扩展性和性能问题。增加100个路由器节点会导致存储节点内存使用增加,延迟增加15%,垃圾回收时间增加。此外,由于大量HTTP/1.1连接的连接池,获取连接的时间可能长达数毫秒。在网络事件(如交换机升级)期间,重新建立数千个连接可能导致错误。
HTTP/2的迁移与优化
团队决定迁移到HTTP/2,但发现默认性能不理想(吞吐量比HTTP/1.1低45%,延迟高60%)。因此,工程师们必须解决HTTP/2栈中的瓶颈。他们发现两个主要改进领域:获取和处理连接,以及请求的编码/解码。通过优化Netty的内部实现,团队创建了重用现有通道的处理器实现,并引入了自定义的EventLoopGroup实现以更均匀地平衡连接。此外,团队还优化了SSL处理,并使用原生JNI基础的SSL引擎,减少了DNS查找延迟。最后,团队创建了自定义编解码器,将HTTP/2请求封装为HTTP/1.1请求,并禁用了HPACK头压缩。
迁移后的成果
经过这些优化,迁移到HTTP/2带来了显著的改进:TCP连接数减少了88%,延迟减少了65-75%,垃圾回收时间减少了75-81%,获取连接的等待时间从11ms降低到0.02ms(提高了99%)。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。