架构设计:需求分析和整理,概要设计和详细设计
业务划分:水平拆分,垂直拆分
主要体现在:高性能,高可用,可伸缩,可扩展,安全性等方面
非功能质量指标:可测试性,可监控性
应用服务器、数据库、缓存、消息队列
服务的入口,请求流量从这里进入系统,数据库,缓存和消息队列的访问流量取决于应用服务器的访问量。
对应用服务器的访问量进行评估至关重要,应用服务器主要关注每秒请求的峰值及对请求的响应时间等指标,通过这些指标可以评估我们的引用服务器资源数量。
根据应用层的访问量和访问峰值,计算出需要的数据库资源的吞吐量。。
根据应用层的访问量和访问峰值,通过评估热数据占比,计算缓存资源的大小并估算缓存资源的峰值
根据应用层的平均访问量和访问峰值,计算需要消息队列传递的数据量,计算出所需要的消息队列资源的数量,部署结构,高可用方案等
大量需求中识别出核心需求和特色需求,针对核心需求和特色需求设计系统,使用其他需求验证系统。
对比可选方案,选择倾向的方案,并给出选择这种方案的理由
标识所选方案的风险,提出此风险发生时的应对策略,例如上线失败时的回滚策略
根据所选方案时做的具体工作,并评估开发,测试等细化任务需要的时间,形成可实施的任务计划表,计划表一般从项目计划和人员分配两个角度来管理项目。
物流系统包含两个质量优先需求
两个需求模块需要分库分表,并且借用消息队列和缓存抗住读和写的流量,本方案主要针对这两个业务的容量和性能进行评估。
根据以上,
即:设计结果:4端口 x 32 库 x 4表, 4主8从
使用redis缓存活跃用户的常用地址。
设计结果:11台,主从
根据数据库的读操作吞吐量(5000/s)峰值和写操作吞吐量(2000/s)峰值计算,选择单台应用服务器即可,选择两台可避免单点、
设计结果:2台
综上,
设计结果:16端口 x 32库 x 8 表, 16主16从
考虑5倍冗余后峰值为5000/s,通过单台kafka和单台处理机即可处理,考虑到单点,至少使用两台kafka
峰值突增,增加kafka集群的节点来抗住写流量,处理机根据后端入库性能来决定。
设计结果:两台kafka, 两台处理机
根据数据库读操作吞吐量(2500/s)峰值和写操作吞吐量(11000/s)峰值计算,使用3台应用服务器即可
用于查询第三方接口的后台任务服务器,由于受到第三方接口5000/s吞吐量的限制,使用单台机器即可,为了避免单点使用两台处理机即可。
设计结果:2台
方案:
(1)用户常用地址
设计结果:1端口 x 128库 x 4表, 1主1从
(2)物流订单和物流记录
设计结果:1端口 x 512库 x 8表, 1主1从
倾向于采用最小资源方案
eg:典型的交易系统
交易系统:下单,下单查询,退款和退款查询4个接口
按历史数据来确定各个接口的比例,依次为60%,37%,1%,2%
在客户端机器发送大量请求到目标系统,
通过基准测试找到没有负载下各接口响应时间,,这里的响应时间将作为梯度加压的基础数据。
得到基准测试响应时间后,使用梯度加压,吞吐量梯度测试:100/s,200/s,300/s
与线上环境相同,尽量保持相近或相似
推荐一个测试脚本包含一个单独业务流程,便于统计性能结果以及在以后重用
根据指定压测方案,执行各个压测场景测试用例,并通过观察和监控系统资源,数据库,缓存和消息队列的使用情况,判断系统是否满足既定目标。
发布压测报告,瓶颈点和风险进行整改并优化系统,修复后提交新版本,请求压测团队进行回归测试
一款针对HTTP实现的服务进行性能压测的工具
只能测试简单的 RESTful 风格的接口,无法进行多个业务逻辑的串联测试
基于Java的性能压力测试工具,用于对Java开发的软件做压力测试
mysql自带的一款性能压测工具,通过模拟多个并发客户端访问mysql来执行压力测试,同时提供详细的数据性能报告。
单线程测试
mysqlslap -a -uroot -pyouarebest
100个线程测试
mysqlslap -a -c 100 -uroot -pyouarebest
mysqlslap -a -i 10 -uroot -pyouarebest
mysqlslap -a -c10 --number-of-queries=1000 --auto-generate-sql-load-type=read -uroot -pyouarebest
mysqlslap -a -c10 --number-of-queries=1000 --auto-generate-sql-load-type=write -uroot -pyouarebest
mysqlslap -a -c10 --number-of-queries=1000 --auto-generate-sql-load-type=mixed -uroot -pyouarebest
mysqlslap -a --concurrency=50,100 --number-of-queries 1000 --debug-info --engine=myisam,innodb --iterations=5 -uroot -pyouarebest
sysbench --test=cpu --cpu-max-prime=20000 run
sysbench --test=threads --num-threads=64 --thread-yields=100 --thread-locks=2 run
磁盘随机I/o性能测试:用sysbench工具可以测试顺序读,顺序写,随机读,随机写等磁盘I/O性能
内存性能测试
sysbench --test=memory --num-threads=512 --memory-block-size=256M --memory-total-size=32G run
sysbench --test=oltp --mysql-table-engine=myisam --oltp-table-size=1000 --mysql-user=root --mysql-host=localhost --mysql-password=youarebest --mysql-db=test run
可以用于测试磁盘顺序I/O的存取速度
dd if=/home/robert/test-file of=/dev/null bs=512 count=10240000
模拟成千上万的用户同时对目标系统实施高并发负载,并实时检测系统资源的使用情况及表现的性能指标等方式来发现和定位问题。
jdk自带分析内存堆和cpu使用情况的命令行工具。是一个jvm执行时动态加载的本地代理库,加载后运行在jvm进程中。通过jvm启动时配置不同的选项,可以让hprof监控不同的性能指标,包括堆、cpu使用情况,栈和线程等。hropf会生成二进制或者文本格式的输出文件,对二进制的输出可以借助命令行工具HAT进行分析,开发者通过分析输出文件来找到性能瓶颈。