zoukankan      html  css  js  c++  java
  • 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,十几亿数据参与计算。执行时间接近两个小时

  • 相关阅读:
    软件工程实验三 面向对象分析与设计
    软件工程实验二 结构化分析与设计
    软件工程实验一 软件开发文档与工具安装与使用
    ATM管理系统
    举例分析流程图与活动图的区别与联系
    自动生成四则运算
    Java入门基础知识点总结(详细篇)
    数据库树状结构数据查询
    java中Date日期类型的大小比较
    文件转byte[ ]
  • 原文地址:https://www.cnblogs.com/Sunnynanbing/p/14707310.html
Copyright © 2011-2022 走看看