分库分表,做到永不迁移数据和避免热点的方法

简介: 分库分表,做到永不迁移数据和避免热点的方法: 基础: 1、数据拆分方式:垂直拆分,水平拆分。 2、垂直拆分:原来就一个数据库,数据量一大了,就拆分为多个数据库。 3、水平拆分:原来是t_order表,拆分成t_order_1、t_order_2、t_order_3、t_order_4。
分库分表,做到永不迁移数据和避免热点的方法:
    基础:
      1、数据拆分方式:垂直拆分,水平拆分。
      2、垂直拆分:原来就一个数据库,数据量一大了,就拆分为多个数据库。
      3、水平拆分:原来是t_order表,拆分成t_order_1、t_order_2、t_order_3、t_order_4。
      4、Mysql单表存储推荐是百万级,尽量别到千万级。
    分库分表方案:
      1、常用的方案:hash取模、range范围方案,分库分表方案最主要的就是路由算法,把路由的key按照指定的算法进行路由存放。        
      2、hash取模方案(无热点问题,扩容困难)
          (一)、首先预估一下总数据量m,设定每张表的最大数据量n,m/n=z 是表个数。
          (二)、hash方案就是对指定的路由key(如:id)对z进行取模,"t_order_"+id%z 是表名字。
          (三)、优缺点:优点是数据均匀的分布在每张表中,不会有热点问题;缺点是数据的迁移或者扩容会很麻烦。
      3、range范围方案(不需要迁移数据,有热点问题)
          (一)、range方案是以范围进行数据拆分:id=50在0~1000的在t_order_0表、id=1050在1000~2000的t_order_1表等。
          (二)、优缺点:优点是扩容方便,不需要数据迁移;缺点是id在0-1000时,t_order_0会很忙,t_order_1,t_order_2...t_order_n...都没有数据的访问,一段时间只有一个热点表。
      4、range和hash组合方案
          (一)、设计是比较简单的,就三张表,把group,db,table之间建立好关联关系。
          group表字段:group_id,group_name,start_id,end_id
          db表字段:db_id,db_name,group_id,hash_value
          group和db的关系表字段:table_id,table_name,db_id,start_id,end_id
          
  分库分表就会带来各种join组合条件的分页查询问题,怎样解决分页查询问题,很有挑战性。   
  
  1.事务问题:
    (1)、分布式事务 (2)、通过应用程序与数据库共同控制实现事务
          方案一:使用分布式事务
              优点:交由数据库管理,简单有效
              缺点:性能代价高,特别是shard(分片)越来越多时
          方案二:由应用程序和数据库共同控制
               原理:将一个跨多个数据库的分布式事务分拆成多个仅处
                     于单个数据库上面的小事务,并通过应用程序来总控
                     各个小事务。
               优点:性能上有优势
               缺点:需要应用程序在事务控制上做灵活设计。如果使用  
                     了spring的事务管理,改动起来会面临一定的困难。
  2.跨节点Join的问题
       只要是进行切分,跨节点Join的问题是不可避免的。但是良好的设计和切分却可以减少此类情况的发生。解决这一问题的普遍做法是分两次查询实现。在第一次查询的结果集中找出关联数据的id,根据这些id发起第二次请求得到关联数据。

  3.跨节点的count,order by,group by以及聚合函数问题

      这些是一类问题,因为它们都需要基于全部数据集合进行计算。多数的代理都不会自动处理合并工作。

  解决方案:与解决跨节点join问题的类似,分别在各个节点上得到结果后在应用程序端进行合并。和join不同的是每个结点的查询可以并行执行,因此很多时候它的速度要比单一大表快很多。但如果结果集很大,对应用程序内存的消耗是一个问题。

    
相关文章
|
移动开发 安全 PHP
微信分享和微信H5跳转到APP开放标签wx-open-launch-app使用及样式设置
微信分享和微信H5跳转到APP开放标签wx-open-launch-app使用及样式设置
2676 0
|
7月前
|
存储 运维 分布式计算
诗悦游戏基于DLF与EMR StarRocks降本38%
诗悦网络(2014年成立)是千人规模的研运一体手游公司,代表作有《长安幻想》《永夜降临》等。为支撑PB级开放世界新游《望月》,其原半托管StarRocks数据平台面临高成本、难运维、稳定性差等痛点。阿里云以Serverless StarRocks+DLF Paimon数据湖方案实现存算分离、多租户隔离与全托管运维,总成本降38%,查询性能提升40%+,RPO=0,全面赋能实时/近实时/离线场景。
512 3
|
5月前
|
NoSQL 算法 Java
【分布式】分布式核心组件——分布式锁:Redis/ZooKeeper/etcd 实现方案(附全方位对比表)、优缺点、Redlock、时钟回拨问题
本文系统解析分布式锁原理与实践,涵盖Redis/ZooKeeper/etcd三大方案、Redlock算法、时钟回拨等核心议题,兼具深度、广度与落地性,助你构建高可用、强一致的分布式并发控制能力。
|
5月前
|
人工智能 安全 网络安全
Harness驾驭工程是AI平权的必经之路?
OpenClaw 将 AI 主权从模型厂商转移到了用户手中,但调教 AI 并不是一个简单的事情,甚至让人烦躁。这一背景加速了 Harness 驾驭工程的市场共识。
|
人工智能 物联网 UED
Soundwave:语音对齐黑科技!开源模型秒解翻译问答,听懂情绪波动
Soundwave 是香港中文大学(深圳)开源的语音理解大模型,专注于语音与文本的智能对齐和理解,支持语音翻译、语音问答、情绪识别等功能,广泛应用于智能语音助手、语言学习等领域。
1380 13
Soundwave:语音对齐黑科技!开源模型秒解翻译问答,听懂情绪波动
|
SQL Java 流计算
Flink SQL UDF(用户自定义函数)需要打包成JAR文件并上传到Flink集群中
【1月更文挑战第1天】【1月更文挑战第2篇】Flink SQL UDF(用户自定义函数)需要打包成JAR文件并上传到Flink集群中
793 0
|
存储 NoSQL 安全
红包系统架构设计
红包系统架构设计
2739 0
红包系统架构设计
|
SQL 监控 Java
IDEA插件-Mybatis Log Free日志替换
MyBatis Log Free 是一个免费的用于在 IntelliJ IDEA 中显示 MyBatis 日志的插件。它可以帮助您更方便地查看和分析 MyBatis 的 SQL 执行情况,以及定位潜在的性能问题,提高开发效率。
2329 0
IDEA插件-Mybatis Log Free日志替换
|
机器学习/深度学习 人工智能 语音技术
情感识别与表达:FunAudioLLM的情感智能技术
【8月更文第28天】随着人工智能的发展,语音交互系统越来越普遍。其中,情感智能技术成为提高用户体验的关键因素之一。本文将探讨 FunAudioLLM 如何利用情感识别和表达技术来增强语音交互的真实感,并提供具体的代码示例。
1720 0