架构设计(容量分析)
架构设计(容量分析)
容量分析
性能标准(不同机器数值会有差异)
# mysql 单端口读:5000/s 单端口写:3000/s 单表容量:5000万 # redis 单端口读写:4万/s 单端口内存容量:32g # kafka 单端口读:3万/s 单端口写:5000/s # 应用服务器 处理请求的峰值:5000/s
场景1:用户下单地址读写,使用缓存存储常用地址
用户量2亿,每天增长5万 促销日订单量1400万,且50%的订单集中在2个小时内 假设新增的用户全部增加一条地址,并且高峰期20%的用户在下单时添加地址 当前2亿用户,每天增长5万,平均每个用户5个地址,按照30年计算 按照峰值的5倍冗余设计,常用地址容量按照30倍计算 # 数据库mysql计算 读吞吐量:(1400万*0.5)/(2*60*60)=1000/s,5倍冗余:5000/s,需要1个端口 写吞吐量:(1400万*0.2+5万)/(2*60*60)=400/s,5倍冗余:2000/s,需要1个端口 数据容量:(2亿+5万*365*30)*5=35亿,5倍冗余:175亿,需要350张表 读写混合部署:2主2从 读写分离部署:1主1从 表的数量:2的指数对齐,需要512张表(考虑到端口拓展时不用拆分数据库,尽可能使用更多的库) 设计结果:1端口*32库*16表、1主1从 # 缓存Redis计算 当天下单用户全部为活跃用户,缓存24小时, 每个用户5调地址,每条地址数据大小1kb 读写:redis可以处理读5000/s、写2000/s 数据容量:1400万*5*1kb=70g,5倍冗余350g,360g/32g=11,需要11台redis服务器 设计结果:11主11从 # 应用服务器计算 单台服务器可以处理读5000/s、写2000/s 为防止单点故障,使用2台应用服务器
场景2:通过消息队列异步产生物流订单,并提供查询服务
用户下单3天后到货,三天内50%的用户每天查询一次物流订单、物流记录 用户下单产生一次物流订单,促销日订单量1400万,50%的下单集中在2个小时 按照促销日每天产生1400万订单,订单3天到货,每个订单产生8个物流记录,8条记录在3天内均匀产生 当前又2亿条订单数据,每天新增400万订单,按照3年订单量存储数据 三方物流记录查询接口吞吐量峰值:5000/s # 数据库计算 读吞吐量:(1400万*3*0.5)/(24*60*60)=250/s,5倍冗余1250/s,1个端口 写吞吐量:(1400万*0.5)/(2*60*60)=1000/s, (1400万*3*8)/(3*24*60*60)=1200/s, 5倍冗余(1000/s+1200/s)*5=11000/s,需要4个端口 数据容量:物流订单数据2亿+400万*365*3=46亿,5倍冗余;230亿,需要460张表 物流记录数据是订单的8倍,需要460*8=3580张表 混合读写:5主5从 读写分离:4主4从 考虑到端口拓展师不拆分数据库,尽可能设置更多的库 设计结果:物流订单表 4端口*16库*8表、 物流记录表 4端口*16库*64表 4主4从 # 消息队列计算 物流订单通过kafka发送,5倍冗余峰值为5000/s,单台kafka可以满足需求 设计结果:考虑到单点问题,至少使用2台kafka机器 # 定时任务轮询物流记录时间间隔 每天产生1400万订单,平均3天到货 1400万*3/5000=2h,定时任务每隔2小时查询一次 # 应用服务器计算 读吞吐量:1250、写吞吐量:11000/s,3台应用服务器可以处理 定时任务轮询三方记录服务器:单台服务器就可处理,考虑单点故障,使用2台服务器
性能分析
性能指标
响应时间:请求得到响应花费的时间 并发数:服务器可以同时处理的请求数,与cpu数有关 tps=1/响应时间 * 并发数
压测观察指标
# 性能查看命令:free、top、iostat、netstat等 系统:cpu、内存、磁盘io、网络带宽等 # 可用ab测试、jmeter进行压测,获取压测数据 服务:接口吞吐量、响应时间、超时情况 数据库:慢查询、sql是否发生死锁、索引优化、吞吐量 缓存:缓存占用大小、缓存读写吞吐量、响应时间、超时时间 消息队列:消息队列吞吐量、响应时间、超时情况等
下一篇:
jwt 单点退出问题解决方案之一