最近在做一个博客网站的项目,遇到了性能瓶颈,想和大家分享一下我的优化思路。刚开始搭建的时候,就是最基础的三件套:Nginx做反向代理、一个应用服务、再加个MySQL数据库,这样就能跑起来了。但实际运行起来才发现,当每天有3000多篇文章的时候,系统就开始慢得不行了,这时候不得不考虑架构升级了。
一、传统架构的优化
遇到性能问题,我第一个想到的就是加服务器做负载均衡,同时引入Redis做缓存。事实证明,这确实是必经之路!
我用的架构模式是:Nginx做负载均衡,客户端和Web容器之间做无状态请求响应,Nginx和Web容器之间用IP模式保持session。这样如果Web容器压力大,直接加服务器就行。但实际跑起来才发现,真正的瓶颈不在Web层,而是在数据库那边。所以下一步我就开始考虑读写分离,一般用一主两从的配置,这样能有效分担数据库压力。
做数据库主从分离的时候,需要注意查询和更新的代码改造。我用Service层的注解拦截来减少代码改动,这样改动量小很多。主库负责写入并复制到从库,每个Web容器对应一个从库来分担查询压力。
但即使这样,读的压力还是很大。这时候我就引入了Redis做查询缓存,性能提升很明显。
Redis的好处有两个:一是可以做Session共享池,实现分布式环境下Web容器的Session解耦,这样Nginx就不用非得用IP hash了,避免访问倾斜的问题;二是配合MyBatis这类数据访问框架,做读操作的二级缓存,最大化提升数据库读性能。
做到这一步,读的问题基本就能水平扩展了。但真正头疼的是写的问题,因为读都遇到瓶颈了,写肯定也跑不掉,真是祸不单行啊。
MySQL的写入优化比读取优化难多了,往往要动数据结构。比如分库分表,就是典型的”动数据”操作,需要按数据增长范围分表,存到不同的MySQL数据库里,用路由表来做注册和发现。写入时先查路由表确定数据库地址。说实话,不到万不得已,我建议别用这种模式,因为会把问题搞得很复杂!至少读写分离要重新规划,跨表聚合都得在上层应用里实现。
所以写入优化的第一步,我建议先做MySQL分区,比如RANGE分区、LIST分区、HASH分区、复合分区。关键是要根据业务来规划,比如文章写入有明显的日期特征,用基于日期的Range分区就不错。但热门文章互动频繁,这时候可以给文章和互动打上热度标签,用热度标签做LIST分区的切分项,通过复合分区把热门互动数据迁移到热度分区上。
二、混合架构的优化方案
如果做了上面这些,单库压力还是很大,那就不能再只用关系型数据库了,得考虑引入NoSQL来支撑写入。
这里分享一个黑科技:把MySQL主库的InnoDB引擎换成MyRocks引擎。不过这个需要做严格的业务兼容性测试,不能直接上。
MyRocks其实就是RocksDB,写入性能比传统数据库强几十倍(前提是最好用SSD)。我之前写过一篇文章分析过,从底层数据结构来看,K-V存储的写入能力确实强悍。虽然范围查找不如传统RDBMS,但读写分离能弥补这一点。不过这个黑科技最大的不确定性在于读写复制的稳定性,必须反复测试!
说到这里,我就在想,像百度、知乎这些大厂,每天面对亿级甚至几十亿级的数据写入,他们是怎么做的?
单库MySQL肯定撑不住,单机I/O都扛不住,他们肯定是用分布式NoSQL+关系型数据库集群的混合方案。用K-V存储应对频繁的插入更新,但业务完整性关系最终还是要落到关系型数据库集群,复杂的关系还是得用关系表来维护。
我推测,像百度、知乎这些大厂,对于实时性要求高的业务(比如文章编辑),应该是在分布式大数据平台上做KV存储和访问,先做临时处理,不急着更新关系表。等正式提交后,再通过延时队列来维护关系表的事务完整性。
我在架构里引入了Hadoop大数据平台,主要是想用HBase的K-V读写性能。尤其是文章草稿编辑这种准实时操作,如果万人在线都在MySQL上操作,数据库肯定得崩!所以我把文章做成文档的K-V关系存在HBase的稀疏表里,更新就是内容版本的一次迭代。HBase不用考虑复杂关系,只关注文章内容编辑。
作者写完提交后,进入审核状态。审核过程用消息系统做事件化处理,对敏感词、涉黄等问题做实时流式处理,通过订阅管道推送到关系型数据库集群,形成完整的数据事务关系。这样就把高并发写入问题转化成了队列推送的大吞吐计算问题。之后文章查询针对关系型数据库集群,做缓存和分布式查询,就容易多了!
三、最后
就写这么多吧。实际上大厂的分布式数据计算肯定比我推测的复杂得多,我只是从技术合理性角度给大家一个思路。做高并发、海量数据的网站,应该遵循渐进式优化,用最小成本逐步深化,避免一开始就过度设计。总之,分库分表这种模式除非万不得已,一定要慎用!因为一旦用了就很难回头,系统运维会被数据维护的复杂性拖垮。
本文标题: 博客站的架构渐进式演进
发布时间: 2018年09月24日 00:00
最后更新: 2025年12月30日 08:54
原始链接: https://haoxiang.eu.org/f8e301a9/
版权声明: 本文著作权归作者所有,均采用CC BY-NC-SA 4.0许可协议,转载请注明出处!

