暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

数据库“容量”评估法则之一

topdba 2019-10-23
2649

业务需求与指标的对应关系

需求

指标

数据总量

假设1年内数据量大约500G数据量。

每秒请求量

每秒有2000次请求。

响应时间

查询和操作请求要求ms级响应

读写比

读写比是5:1

重要程度

核心系统P1级故障。

冷热数据

一般请求热点数据为最近15内的

记录长度

每条记录长度大约为1KB


计算方式之一(还有计算方式之二,请期待哦😯)

Step1:
1.从业务方得知服务运行一年的数据量已知 500G
2.计算每秒产生的数据为500*1024*1024/(365*24*60*60) = 16KB/s

Step2:
1.从业务方得知大约每秒2000次请求,读写比是4:1
2.计算读请求2000/5*4 = 1600/s;每秒写请求数2000/5*1 = 400/s

Step3:
1.假设每条记录长度大约为1KB >>>每行记录计算方式可自行查看。此处假设为“被平均”值
2.根据Step1得出的结果,每秒insert的写入量大约为16/s;
3.根据Step2得到的每秒insert 400/s,可知 384/s 为update或delete操作。
4.由于MySQL数据读写操作按照页来处理,(默认)页大小为16KB,假设每次操作的页都不相同。
5.那么每秒写操作数据量为:16KB*400/s = 6.25M/s,每秒读操作数据量为:16KB*1600/s = 25M/s。

Step4:
1.假设热点请求数据为最近15天内的数据
2.热数据量为:(500/365)*15 = 20GB

Step5:
1.操作需ms级返回,并且读压力更大,那么需要尽可能的将热数据加载到内存。
2.按照内存命中率接近100%计算的话,那么Innodb buffer大约为20GB,而其他内存需求大概为1~2GB,因此内存超配大约为22GB。

step6:
1.按照超配原则,写带宽(wBPS)限制为10MB/s;读带宽(rBPS)限制为30MB/s。


示意图:


脚本化评估输出:


福利😊:

[root@dba-virtual-host-220122 local]# cat capacity_caculate.sh
#!/bin/bash
read -p "当前一年数据量 {单位:GB}:" DBSIZE
#echo "${DBSIZE}GB"
DPS=$[DBSIZE*1024*1024/(365*24*60*60)]
#echo "每秒产生的数据:${DPS}KB/s"
read -p "当前并发量:" CV
read -p "数据读写比 {例如:10:1}:" RW_RATIO
read -p "热点请求数据查询范围{单位:天}:" HOT_DATA_EXPIRE
READ_RATIO=`echo $RW_RATIO |awk -F ':' '{print $1}'`
WRITE_RATIO=`echo $RW_RATIO |awk -F ':' '{print $2}'`
ALL_RATIO=$[READ_RATIO+WRITE_RATIO]
READ_REQUEST=$[CV/ALL_RATIO*READ_RATIO]
WRITE_REQUEST=$[CV/ALL_RATIO*WRITE_RATIO]
ROW_SIZE=1
INSERT_TRANSACTION=$[DPS/ROW_SIZE]
UPDATE_OR_DELETE_TRANSACTION=$[WRITE_REQUEST-INSERT_TRANSACTION]
WRITE_SIZE=$[16*WRITE_REQUEST/1024]
READ_SIZE=$[16*READ_REQUEST/1024]
ALL_IO_FLOW=$[WRITE_SIZE+READ_SIZE+5]
HOTDATA_SIZE=$[DBSIZE/365*HOT_DATA_EXPIRE]
ALL_MEM=$[HOTDATA_SIZE+2]
echo "-----------------------结论如下-----------------------------"
echo "每秒读请求:${READ_REQUEST}/s"
echo "每秒写请求:${WRITE_REQUEST}/s"
echo "每秒insert事务:${INSERT_TRANSACTION}"
echo "每秒update/delete事务:${UPDATE_OR_DELETE_TRANSACTION}"
echo "每秒写带宽${WRITE_SIZE}M/s"
echo "每秒读IO带宽${READ_SIZE}M/s"
echo "总带宽不得低于${ALL_IO_FLOW}M/s"
echo "热点数据量:${HOTDATA_SIZE}GB"
echo "总内存需${ALL_MEM}GB"


本文分享自微信公众号 - topdba,如有侵权,请联系 service001@enmotech.com 删除。
最后修改时间:2019-12-18 15:19:36
文章转载自topdba,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论