问题一:数据库存储的数据量不大,但并非的读写操作都很大,超过数据库服务器的处理能力。
基于阿里云RD版测试结果(Mysql处理性能)
CPU 内存 连接数 TPS QPS
4 16 4000 685 12337
8 16 4000 982 20879
8 32 8000 1308 23555
16 64 16000 2040 41530
单台机器扩展不能达到我们的要求,怎么办?
解决方案:常用做法——加缓存(如:Redis),减少数据库压力
衍生问题:
1、缓存会有过期命不中,还是忽悠大量的读和全部的写操作将请求数据库,如果数据库支持不起怎么办?
:常用做法——读写分离(Mysql主从复制), 由多台数据库提供读写服务
2、读写分离则需要操作不同的库,对Dao层的代码有影响吗?如何隔离这种变化?
:增加数据访问模块——(数据库中间件),减少代码侵入
问题二:应用的业务模块很多,总的数据量很大,并发读写操作均超出单个数据库服务器的处理能力?
解决方案:数据量很大,并发压力很大,可以分库+读写分离
1、对于读压力,我们可以集群多个从库。
2、对于写压力,多个主库间数据库同步,又难保数据一致性? 数据量大单库存不来怎么办?
:分库 ——如何分库? 按照业务模块分成多个数据库(用户库、商品库...)
衍生问题:
1、对于多个数据库之间谁负责负载均衡操作?
2、可能要操作多个库,对Dao层的代码有影响吗?
a、如果要跨库关联查询怎么办?
b、如果某业务数据库的读写压力大,我们可以怎么办?
:增加数据访问模块——(数据库中间件),减少代码侵入
问题三:如果单个表的数据量很大,超出了单表上线, 如电商网站的商品表、订单表等?
解决方案:超过1000万考虑分区表、分表
衍生问题:
1、如何分?
:根据一定规则将数据分到多个表中存储, 可以有怎样的分表规则?
2、分表的情况下对Dao层的代码有影响吗?
如何决定数据存储在哪里?
如何查询多个表?
如何做到对Dao层透明?
:增加数据访问模块——(数据库中间件),减少代码侵入
总结:为什么要用数据库中间件
在高并发,海量数据的情况下:
1、数据库存储数据量不大,但并非的读写操作都很大,超过数据库服务器的处理能力。
2、应用的业务模块很多,总的数据量很大,并发读写操作均超出单个数据库服务器的处理能力。
3、如果单个表的数据量很大,超出了单表存储上线,如电商网站,商品表、订单表等。
为解决数据存储,访问性能问题,我们需要数据库中间件,它让我们可以再应用程序中快速应用读写分离、分库、分表!