分库分表

为什么要分库分表?

单表并发高,数据量大,无法承载
分库:将一个库的数据拆分到多个相同的库中,访问的时候访问一个库
分表:把一个表的数据放到多个表中,操作对应的某个表就行

如何对数据库进行垂直拆分和水平拆分

  • 垂直拆分
    把一个有很多字段的表拆分成多个表,或者是多个库上去。每个库表的结构不一样,每个库表包含部分字段。一般来说,将较少的访问频率很高的字段放到一个表中,然后较多访问频率低的字段放到另一个表中
    对一些字段特别多的表做一下拆分
  • 水平拆分
    把一个表的数据弄到多个库的多个表里去,但是每个库的结构都一样,只不过每个库表放的数据是不同的,所有库表的数据加起来就是全部数据。
    意义:将数据均匀放更多的库里,然后用多个库来抗更高的并发,还有就是用多个库的存储容量来进行扩容
    并发承载不了,或者是数据量太大,容量承载不了,于是进行拆分
  • 分库分表其他方式
    • 按range来分
      每个库一段连续的数据,这个一般是按比如时间范围来的,但是这种一般较少用,因为很容易产生热点问题,大量的流量都打在最新的数据上了
      优点:扩容的时候,就很容易,因为你只要预备好,给每个月都准备一个库就可以了,到了一个新的月份的时候,自然而然,就会写新的库了 缺点:大部分的请求,都是访问最新的数据。实际生产用range,要看场景,你的用户不是仅仅访问最新的数据,而是均匀的访问现在的数据以及历史的数据
    • hash分法
      优点:可以平均分配每个库的数据量和请求压力 缺点:扩容起来比较麻烦,会有一个数据迁移的这么一个过程

如何不停机迁移分库分表

不停机双写迁移
在线上系统里面,之前所有写库的地方,增删改操作,都除了对老库增删改,都加上对新库的增删改,这就是所谓双写,同时写俩库,老库和新库
系统部署之后,新库数据差太远,用之前说的导数工具,跑起来读老库数据写新库,写的时候要根据gmt_modified这类字段判断这条数据最后修改的时间,除非是读出来的数据在新库里没有,或者是比新库的数据新才会写
接着导完一轮之后,有可能数据还是存在不一致,那么就程序自动做一轮校验,比对新老库每个表的每条数据,接着如果有不一样的,就针对那些不一样的,从老库读数据再次写。反复循环,直到两个库每个表的数据都完全一致为止
接着当数据完全一致了,就ok了,基于仅仅使用分库分表的最新代码,重新部署一次,不就仅仅基于分库分表在操作了么,还没有几个小时的停机时间,很稳。所以现在基本玩儿数据迁移之类的,都是这么干了

有哪些分库分表中间件

  • cobar
    阿里b2b团队开源,proxy层,现在没啥人用,不支持读写分离,存储过程、跨库join和分页等操作
  • TDDL
    淘宝团队开发,client层,不支持join、多表查询等语法,目前用的不多,而且还依赖淘宝的diamond配置管理系统
  • atlas
    360开源,proxy层,社区最新的维护在5年前,目前没什么人用
  • sharding-jdbc
    当当开源,client层,SQL语法支持多,支持分库分表、读写分离、分布式id生成、柔性事务,社区活跃,目前还在更新维护,可选
    优点:无需部署,运维成本低,API直接调用,性能高 缺点:如果版本更新,各个系统都需要进行升级
  • mycat
    基于cobar改造,proxy层,支持的功能非常完善,目前非常火的,而且不断流行的数据库中间件,社区很活跃,相比sharding-jdbc年轻,缺少锤炼,可选
    优点:对于各个项目透明,如需升级,只需更新mycat本身,无需更新其他系统 缺点:需要部署,自己运维一套中间件,成本高

如何动态的扩容缩容分库分表

1、设定好几台数据库服务器,每台服务器上几个库,每个库多少个表,推荐是32库 * 32表,对于大部分公司来说,可能几年都够了
2、路由的规则,orderId 模 32 = 库,orderId / 32 模 32 = 表
3、扩容的时候,申请增加更多的数据库服务器,装好mysql,倍数扩容,4台服务器,扩到8台服务器,16台服务器
4、由dba负责将原先数据库服务器的库,迁移到新的数据库服务器上去,很多工具,库迁移,比较便捷
5、我们这边就是修改一下配置,调整迁移的库所在数据库服务器的地址
6、重新发布系统,上线,原先的路由规则变都不用变,直接可以基于2倍的数据库服务器的资源,继续进行线上系统的提供服务

分库分表的主键唯一ID如何生成

  • 数据库自增ID
    维护一个库中的一张表用来获取自增ID,用于其他分库分表的数据
    优点:方便简单 缺点:单库单表,并发高有性能瓶颈
    适合场景:对于并发不高的情况下,可以走单独的库和表生成自增主键ID
  • UUID
    优点:基于本地生成 缺点:长度太长,做主键性能差
    适合场景:如果你是要随机生成个什么文件名了,编号之类的,你可以用uuid,但是作为主键是不能用uuid的
    获取当前系统时间
    缺点:并发很高的时候,比如一秒并发几千,会有重复的情况,这个是肯定不合适的
    适合场景:将当前时间跟很多其他的业务字段拼接起来,作为一个id,如果业务上你觉得可以接受,那么也是可以的。 你可以将别的业务字段值跟当前时间拼接起来,组成一个全局唯一的编号,订单编号,时间戳 + 用户id + 业务含义编码
  • snowflake算法
    twitter开源的分布式id生成算法,就是把一个64位的long型的id,1个bit是不用的,用其中的41 bit作为毫秒数,用10 bit作为工作机器id,12 bit作为序列号
    优点:性能好,支持高并发
【多变量输入超前多步预测】基于CNN-BiLSTM的光伏功率预测研究(Matlab代码实现)内容概要:本文介绍了基于CNN-BiLSTM模型的多变量输入超前多步光伏功率预测方法,并提供了Matlab代码实现。该研究结合卷积神经网络(CNN)强大的特征提取能力与双向长短期记忆网络(BiLSTM)对时间序列前后依赖关系的捕捉能力,构建了一个高效的深度学习预测模型。模型输入包含多个影响光伏发电的气象与环境变量,能够实现对未来多个时间步长的光伏功率进行精确预测,适用于复杂多变的实际应用场景。文中详细阐述了数据预处理、模型结构设计、训练流程及实验验证过程,展示了该方法相较于传统模型在预测精度和稳定性方面的优势。; 适合人群:具备一定机器学习和深度学习基础,熟悉Matlab编程,从事新能源预测、电力系统分析或相关领域研究的研发人员与高校研究生。; 使用场景及目标:①应用于光伏电站功率预测系统,提升电网调度的准确性与稳定性;②为可再生能源并网管理、能量存储规划及电力市场交易提供可靠的数据支持;③作为深度学习在时间序列多步预测中的典型案例,用于科研复现与教学参考。; 阅读建议:建议读者结合提供的Matlab代码进行实践操作,重点关注数据归一化、CNN特征提取层设计、BiLSTM时序建模及多步预测策略的实现细节,同时可尝试引入更多外部变量或优化网络结构以进一步提升预测性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值