架构设计(容量分析)


架构设计(容量分析)

          

                  

                                

容量分析

             

性能标准(不同机器数值会有差异)

# 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是否发生死锁、索引优化、吞吐量
缓存:缓存占用大小、缓存读写吞吐量、响应时间、超时时间
消息队列:消息队列吞吐量、响应时间、超时情况等