2021-01-14 TiDB-3-1业务场景评估--
2021-01-14 TiDB-3-1业务场景评估--
解决方案:
#############################################################
方案一
1、tidb:
1)16C * 32G 2个
这两个节点作为写入节点
2)32C * 64G 2个
这两个节点作为查询节点,尤其是报表相关的 sql
2、tikv:16C * 32G * 1.5T 10个 (无脑计算 2022 年年中数据容量,仅供参考,和数据本身的以及 RocksDB 的压缩率有关)
3、PD:官网配置
方案二
1、tidb:16C * 64G 3个
2、tikv:16C * 64G * 2T 7个 (无脑计算 2022 年年中数据容量,仅供参考,和数据本身的以及 RocksDB 的压缩率有关)
3、PD:8C * 32GB 3个
4、tiflash:48C *192G* 8T 可多盘 2个
5、monitor:16C * 64G 1个
注意如果是使用 tiflash ,实时报表查询的 qps 建议在 10 以下
上面两个方案,建议按照真实的业务逻辑和数据量来跑一遍,尤其是报表数据查询,以及夜间跑批,来看下两个方案的性能,结合测试结果和服务器配置根据需求来选取最终的部署方案 ~
#############################################################
需要使用tiflash的表:
order_d、order_m、order_contact 、order_shipno 、performance_d、performance_m、order_status、locate_d、ib_putaway_indicate、ib_putaway_r、ib_receipt_task_d、、ib_receiving_r_d、stock_lotattr、stock
#########################################################
2021-01-14 TiDB-3-1业务场景评估
#########################################################
TiDB-3-1业务场景评估
(1)当前业务的痛点 & 考虑 TiDB 的原因 Jwms报表应用数据量大,并且在快速增长。
目前是两个节点,每个节点分了四个库,有些大表单库分了十几张表,
研发人员维护、运维成本比较高,并且由于数据量的增长,导致一个分库磁盘使用率报警,后续面临扩容,成本也比较高。
目前单节点mysql四组库,都是一主两从,一组在商城机房,32C128G x3,三组RDS,16C64G x4,总计288C
每个节点申请一套tidb集群,总计两套。
TiDB分布式数据库,tikv方便扩容,研发人员维护运维成本也比较低。高度兼容Mysql,应用迁移成本也比较低。
(2)数据容量
1)当前的数据容量
云仓1:3.8T+1.4T+1.1T+1.3T = 7.6T
云仓3: 3.9T+1.2T+800G+1.4T = 7.3T
2)未来 3~5年的增长量
每年增长5-6T。
(3)单表数据量
单表数据量最大17亿,单节点大于1亿的表数量20+。
(4)请求类型:
1)写入:批量写入或单条写入,如果是批量写入那么 batch size 是怎样的
整体对写入的 duration 耗时是怎样的?
根据日志查看500条批量插入,整体耗时在3秒左右。
batch size最大为500,大部分请求的size都很小,极小部分会达到500,影响不是很大,如果有必要也可以对最大500的size进行拆分插入。
目前写入大部分依赖蜂巢写入数据。
还有一小部分消费MQ写入,最大batch size 500
2)查询:等值查询或范围查询或者其他业务特点
等值、范围、聚合、多表Join,子表、分页查询都有。
A、能否标注下,当前环境中,会进行这些的表的表结构信息。
都是自增ID
B、方便标注或者给出下:
a)范围查询单次会扫描多大的数据量,以及最终想客户端返回的数据量
这个根据客户需要,页面有时间范围的查询按钮,时间跨度的限制最长1年,一般不建议客户这么查。
数据量最大五六千万
b)聚合查询,同 a),另外是多表
join 聚合查询还是单表查询
聚合查询数据量最大五六千万;
多表 join 有聚合查询也有单表查询。
c)多表 join 这些表的数据量请分别标注下
上亿的那20多张表大多数都会参与多表join。
3)读写比:
读/写:1/50
4)是否有大数据平台全量抽取数据?
大数据平台离线全量抽取数据。
5)是否有定期的业务跑批?
每天晚上有跑批任务。
目前的跑批是在通过什么方式来发送任务到数据库的?
A、大事务insert into select的方式,目前已做了分页操作,并且已将tidb集群最大事务调到了10G
B、等值delete方式,pagesize=1000的方式分页删除,总量最大可到几百万。
c、还会有常规的查询Job表数据,然后进行insert update等操作(单条+批量)。
d、大数据平台向数据库直接插入数据。
(5)原架构:
原架构是怎样的,如果是分库分表,那么使用的中间件是什么?
分四个库,都是一主两从,一组在商城机房,三组是公有云RDS。
有十几张大表在单库里又分了十几张表。
分库分表中间件使用sharding-jdbc
(6)qps & tps(总量)
qps:高峰:16000 平峰: 2000
tps:高峰:1200 平峰:400
(7)RTO & RPO
RTO:故障恢复时间的目标
RPO:容忍数据丢失的量 不允许丢失
(8)其他
系统级别:0 级系统
SQL语句整理及说明:
##############################
SQL1:
SELECT
SUM(orderQty) orderQty
FROM
(SELECT
COUNT(id) AS orderQty
FROM
order_m
WHERE is_delete = 0
AND order_status IN (90)
AND update_time >= '2021-01-13 00:00:00'
AND update_time <= '2021-01-13 01:17:04'
AND tenant_id = 'CP20000002970'
AND warehouse_no = '800003324'
UNION
ALL
SELECT
COUNT(id) AS orderQty
FROM
b2b_order_m
WHERE is_delete = 0
AND order_status IN (90)
AND update_time >= '2021-01-13 00:00:00'
AND update_time <= '2021-01-13 01:17:04'
AND tenant_id = 'CP20000002970'
AND warehouse_no = '800003324') a
order_m表总量过两亿,b2b_order_m量小可以忽略,加上条件后,order_m表最大几十万参与计算(极少数或者大促时),一般也就几万数据。
但是该sql执行频繁,一天执行过万次
######################################
SQL2:
SELECT
COUNT(1) COUNT
FROM
(SELECT
m.order_no,
m.order_type,
m.bill_type,
m.order_status,
m.delivery_time,
m.create_time,
m.create_user,
m.update_user,
m.update_time,
m.carrier_name,
m.shop,
m.owner_name,
m.seller_order_no,
m.order_price,
m.receivable,
m.cod_flag,
m.total_sku_sort,
m.total_sku_qty,
m.seller_notes,
m.notes,
m.owner_no,
m.plan_delivery_time,
m.paysure_date,
m.wave_seq,
m.total_weight,
m.hander_flag,
m.hander_user,
m.hander_time,
c.phone,
c.contact,
c.customer_address1,
c.driver_name,
c.community_no,
c.province,
c.city,
c.county,
c.building,
c.floor,
c.community,
c.distribution_road,
c.work_bench,
c.customer_name,
s.waybill_no,
c.driver_tel,
c.driver_car_no,
SUM(s.weight) AS actualTotalWeight,
COUNT(s.package_no) AS packagenum,
GROUP_CONCAT(s.waybill_no) AS waybillnos,
m.channels_order_no,
m.batch_no
FROM
order_m m
INNER JOIN order_contact c
ON m.order_no = c.order_no
AND m.tenant_id = c.tenant_id
AND m.warehouse_no = c.warehouse_no
AND c.is_delete = 0
LEFT JOIN order_shipno s
ON m.order_no = s.order_no
AND m.tenant_id = s.tenant_id
AND m.warehouse_no = s.warehouse_no
AND s.is_delete = 0
WHERE m.is_delete = 0
AND m.delivery_time >= '2021-01-01 00:00:00'
AND m.delivery_time <= '2021-01-13 23:00:00'
AND m.tenant_id = 'CP20000000512'
AND m.warehouse_no = '800000583'
GROUP BY m.order_no,
m.tenant_id,
m.warehouse_no
ORDER BY m.create_time DESC) t
三张表都过2亿,加上条件后,单表最大几十万参与计算(极少数或者大促时),一般也就几万数据。
该sql执行比较频繁,每天执行3000次左右
#########################################
SQL3:
SELECT
m.order_no,
m.order_type,
m.bill_type,
m.order_status,
m.delivery_time,
m.create_time,
m.create_user,
m.update_user,
m.update_time,
m.carrier_name,
m.shop,
m.owner_name,
m.seller_order_no,
m.order_price,
m.receivable,
m.cod_flag,
m.total_sku_sort,
m.total_sku_qty,
m.seller_notes,
m.notes,
m.owner_no,
m.plan_delivery_time,
m.paysure_date,
m.wave_seq,
m.total_weight,
m.hander_flag,
m.hander_user,
m.hander_time,
c.phone,
c.contact,
c.customer_address1,
c.driver_name,
c.community_no,
c.province,
c.city,
c.county,
c.building,
c.floor,
c.community,
c.distribution_road,
c.work_bench,
c.customer_name,
s.waybill_no,
c.driver_tel,
c.driver_car_no,
SUM(s.weight) AS actualTotalWeight,
COUNT(s.package_no) AS packagenum,
GROUP_CONCAT(s.waybill_no) AS waybillnos,
m.channels_order_no,
m.batch_no
FROM
order_m m
INNER JOIN order_contact c
ON m.order_no = c.order_no
AND m.tenant_id = c.tenant_id
AND m.warehouse_no = c.warehouse_no
AND c.is_delete = 0
LEFT JOIN order_shipno s
ON m.order_no = s.order_no
AND m.tenant_id = s.tenant_id
AND m.warehouse_no = s.warehouse_no
AND s.is_delete = 0
WHERE m.is_delete = 0
AND m.delivery_time >= '2021-01-06 00:00:00'
AND m.delivery_time <= '2021-01-13 23:59:59'
AND m.tenant_id = 'CP20000002722'
AND m.warehouse_no = '800002665'
GROUP BY m.order_no,
m.tenant_id,
m.warehouse_no
ORDER BY m.create_time DESC
LIMIT 10
该sql参与的三张表都过两亿,单表最大几十万参与计算(极少数或者大促时),一般也就几万数据。
该sql执行比较频繁,每天执行2500次左右
###############################
SQL4:
select id,
node,
bill_type,
putaway_type,
employee_id,
'' ,
'' ,
sku_no,
'' ,
tenant_id,
warehouse_no,
create_time,
update_time,
create_user,
update_user,
ts,
is_delete,
md5_value
from `performance_d` where (create_time >= '2021-01-12' and create_time < '2021-01-13' ) or (update_time>='2021-01-12' and update_time < '2021-01-13' ) or (ts>='2021-01-12' and ts < '2021-01-13' )
该表数据过亿,条件过滤后还是过亿数据参与计算,数据执行时间3分钟左右
##############################
SQL5:
SELECT
os.order_status orderStatus,
COUNT(1) AS 'productNumber',
os.create_time AS 'createTime'
FROM
order_status os
WHERE os.is_delete = 0
AND os.order_status IN (10, 40, 50, 60, 70, 90, 404)
AND os.create_time >= '2021-01-14 07:00:00'
AND os.create_time <= '2021-01-14 23:59:59'
AND os.tenant_id = 'CP20000003113'
AND os.warehouse_no = '800003886'
GROUP BY os.order_status,
HOUR(os.create_time)
该表是报表库最大表,数据十几亿,按条件过滤后百万级别数据参与计算,执行时间1分钟左右
########################
SQL6:
select 'my15755sa.mysql.jddb.com','jcloud_report','order_status',id,batch_no,order_no,order_status,order_source,previous_status,reason,is_backtrac,tenant_id,org_no,distribute_no,warehouse_no,create_time,update_time,create_user,update_user,ts,is_delete,version from order_status where create_time >= '2021-01-10 00:00:00' or update_time >= '2021-01-10 00:00:00' or ts >= '2021-01-10 00:00:00'
这是大数据离线抽数的sql,该表是报表库最大表,数据十几亿,查询条件使用or,十几亿数据参与计算。执行时间接近两个小时
posted on 2021-04-27 07:17 Sunnynanbing 阅读(155) 评论(0) 编辑 收藏 举报