数据库的写入量高,是一个很常见的技术瓶颈,场景如央视春晚发红包,千万级别的写入qps。而解决方案有很多,笔者分享一些目前业界最成熟有效的措施:
一、分表
将数据分摊到多个表上,流量也将分摊到多个表上,可以提高数据库读写的吞吐量。
如将一个表从1个,分解为256个。
二、缓存
我们可以将数据库中的热点数据,写入缓存中,将读请求的流量优先走缓存,这样可以分摊数据库的读压力。
如使用Redis来存储热点数据,而使用Canal将MySQL中的热点数据同步到Redis中。
三、异步
我们知道,MySQL数据库日志系统,有一个持久化日志redolog,原理是数据库为了减少磁盘IO的次数,将要写入数据库的数据先在内存中暂存,后续再批量写入磁盘中,这边是异步的一种案例。
我们的系统设计,也可以参考这个模式,将要写入数据库中的操作通过发送mq暂存到Kafka中,再通过消费mq的方式,将数据写入数据库,从而避免流量过大,一下子将数据库打死了。
四、分库
经过压测得知,一个16核32G内存500G硬盘的MySQL,它的写入极限是5600/s,这是硬件上的极限,从软件层面已无法提升。
如使用MyCat就是构建数据库集群,以增加更多的数据库实例,从硬件层面上解决问题。
五、其他
以上是互联网大厂最常用的优化方案,只要你肯花心思,总有优化的空间。