`
jieke_ZJ
  • 浏览: 44811 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

分布式数据库架构--分库、分表、排序、分页、分组、实现

 
阅读更多

<!-- Baidu Button BEGIN -->

MySQL分库分表总结:

 

单库单表 :

 

单库单表是最常见的数据库设计,例如,有一张用户(user)表放在数据库db中,所有的用户都可以在db库中的user表中查到。 

 

单库多表 :

 

随着用户数量的增加,user表的数据量会越来越大,当数据量达到一定程度的时候对user表的查询会渐渐的变慢,从而影响整个DB的性能。如果使用

mysql, 还有一个更严重的问题是,当需要添加一列的时候,mysql会锁表,期间所有的读写操作只能等待。 可以通过某种方式将user进行水平的切分,产生两个表结构完全一样的user_0000,user_0001等表,user_0000 + user_0001 + …的数据刚好是一份完整的数据。 

 

多库多表 :

 

随着数据量增加也许单台DB的存储空间不够,随着查询量的增加单台数据库服务器已经没办法支撑。这个时候可以再对数据库进行水平区分。 

分库分表规则 :

         设计表的时候需要确定此表按照什么样的规则进行分库分表。例如,当有新用户时,程序得确定将此用户信息添加到哪个表中;同理,当登录的时候我们得通过用户的账号找到数据库中对应的记录,所有的这些都需要按照某一规则进行。 
路由 
         通过分库分表规则查找到对应的表和库的过程。如分库分表的规则是user_id mod 4的方式,当用户新注册了一个账号,账号id的123,我们可以通

过id mod 4的方式确定此账号应该保存到User_0003表中。当用户123登录的时候,我们通过123 mod 4后确定记录在User_0003中。 

 

分库分表产生的问题,及注意事项 

 

1.   分库分表维度的问题 

假如用户购买了商品,需要将交易记录保存取来,如果按照用户的纬度分表,则每个用户的交易记录都保存在同一表中,所以很快很方便的查找到某用

户的购买情况,但是某商品被购买的情况则很有可能分布在多张表中,查找起来比较麻烦。反之,按照商品维度分表,可以很方便的查找到此商品的购

买情况,但要查找到买人的交易记录比较麻烦。 

 

所以常见的解决方式有: 

     a.通过扫表的方式解决,此方法基本不可能,效率太低了。 

     b.记录两份数据,一份按照用户纬度分表,一份按照商品维度分表。 

     c.通过搜索引擎解决,但如果实时性要求很高,又得关系到实时搜索。 

2.   联合查询的问题 

联合查询基本不可能,因为关联的表有可能不在同一数据库中。 

3.   避免跨库事务 

避免在一个事务中修改db0中的表的时候同时修改db1中的表,一个是操作起来更复杂,效率也会有一定影响。 

4.   尽量把同一组数据放到同一DB服务器上 

例如将卖家a的商品和交易信息都放到db0中,当db1挂了的时候,卖家a相关的东西可以正常使用。也就是说避免数据库中的数据依赖另一数据库中的数据。 

一主多备 

在实际的应用中,绝大部分情况都是读远大于写。Mysql提供了读写分离的机制,所有的写操作都必须对应到Master,读操作可以在Master和Slave机器上进行,Slave与Master的结构完全一样,一个Master可以有多个Slave,甚至Slave下还可以挂Slave,通过此方式可以有效的提高DB集群的QPS.                                                       

所有的写操作都是先在Master上操作,然后同步更新到Slave上,所以从Master同步到Slave机器有一定的延迟,当系统很繁忙的时候,延迟问题会更加严重,Slave机器数量的增加也会使这个问题更加严重。 

此外,可以看出Master是集群的瓶颈,当写操作过多,会严重影响到Master的稳定性,如果Master挂掉,整个集群都将不能正常工作。 

所以,1. 当读压力很大的时候,可以考虑添加Slave机器的分式解决,但是当Slave机器达到一定的数量就得考虑分库了。 2. 当写压力很大的时候,就必须得进行分库操作。 

--------------------------------------------- 

MySQL使用为什么要分库分表 
可以用说用到MySQL的地方,只要数据量一大, 马上就会遇到一个问题,要分库分表. 
这里引用一个问题为什么要分库分表呢?MySQL处理不了大的表吗? 
其实是可以处理的大表的.我所经历的项目中单表物理上文件大小在80G多,单表记录数在5亿以上,而且这个表 
属于一个非常核用的表:朋友关系表. 

但这种方式可以说不是一个最佳方式. 因为面临文件系统如Ext3文件系统对大于大文件处理上也有许多问题. 
这个层面可以用xfs文件系统进行替换.但MySQL单表太大后有一个问题是不好解决: 表结构调整相关的操作基 
本不在可能.所以大项在使用中都会面监着分库分表的应用. 

从Innodb本身来讲数据文件的Btree上只有两个锁, 叶子节点锁和子节点锁,可以想而知道,当发生页拆分或是添加 
新叶时都会造成表里不能写入数据. 
所以分库分表还就是一个比较好的选择了. 

那么分库分表多少合适呢? 
经测试在单表1000万条记录一下,写入读取性能是比较好的. 这样在留点buffer,那么单表全是数据字型的保持在 
800万条记录以下, 有字符型的单表保持在500万以下. 

如果按 100库100表来规划,如用户业务: 
500万*100*100 = 50000000万 = 5000亿记录. 

心里有一个数了,按业务做规划还是比较容易的.

 

分布式数据库架构--排序、分页、分组、实现

最近研究分布式数据库架构,发现排序、分组及分页让着实人有点头疼。现把问题及解决思路整理如下。

一、 多分片(水平切分)返回结果合并(排序)

          1、Select + None Aggregate Function的有序记录合并排序 

           解决思路:对各分片返回的有序记录,进行排序去重合并。此处主要是编写排序去重合

          并算法。

          2、Select + None Aggregate Function的无序记录合并

           解决思路:对各分片返回的无序记录,进行去重合并。

           优点:实现比较简单。

           缺点:数据量越大,字段越多,去重处理就会越耗时。

          3、Select + Aggregate Function的记录合并(排序)

          Oracle常用聚合函数:Count、Max、Min、Avg、Sum。

          AF:Max、Min

          思路:通过算法对各分片返回结果再求max、min值。

          AF:Avg、Sum、Count

          思路:分片间无重复记录或字段时,通过算法对各分片返回结果再求avg、sum、count值。分片间有重复记录或字段时,先对各分片记录去重合并,再通过算法求avg、sum、count值。

          比如:

          select count(*) from user

          select count(deptno) from user;

          select count(distinct deptno) from user;

二、多分片(水平切分)返回结果分页

         解决思路:合并各分片返回结果,逻辑分页。

        优点:  实现简单。

        缺点:  数据量越大,缓存压力就越大。

                     分片数据量越大,查询也会越慢。

三、多分片(水平切分)查询有分组语法的合并

         1、Group By Having + None Aggregate Function时

         Select + None Aggregate Function

         比如:select job user group by job;

        思路:直接去重(排序)合并。

        Select + Aggregate Function

         比如:select max(sal),job user group by job;

         思路:同Select + Aggregate Function的记录合并(排序)。

         2、Group By Having + Aggregate Function时

         解决思路:去掉having AF条件查询各分片,然后把数据放到一张表里。再用group by having 聚合函数查询。

四、分布式数据库架构--排序分组分页参考解决方案

         解决方案1:Hadoop + Hive。

         思路:使用Hadoop HDFS来存储数据,通过Hdoop MapReduce完成数据计算,通过Hive HQL语言使用部分与RDBBS一样的表格查询特性和分布式存储计算特性。

         优点: 可以解决问题

                       具有并发处理能力

                       可以离线处理

         缺点:  实时性不能保证

                       网络延迟会增加

                       异常捕获难度增加

                       Web应用起来比较复杂

          解决方案2:总库集中查询。

          优点: 可以解决问题        

                       实现简单

          缺点: 总库数据不能太大

                        并发压力大

五、小结

         对 于分布式数据库架构来说,排序、分页、分组一直就是一个比较复杂的问题。避免此问题需要好好地设计分库、分表策略。同时根据特定的场景来解决问题。也可以 充分利用海量数据存储(Hadoop-HDFS|Hive|HBse)、搜索引擎(Lucene|Solr)及分布式计算(MapReduce)等技术来 解决问题。
别外,也可以用NoSQL技术替代关系性数据库来解决问题,比如MogonDB\redis。

分享到:
评论

相关推荐

    分布式数据库架构及企业实践基于Mycat中间件

    mysql数据库分布式中间件,功能强大支持分库分表。支持读写分离,主从切换,实现在线数据扩容、迁移等高级功能

    基于yml 配置方式 ,实现springBoot+sharding-jdbc+mybatis-plus 实现分库分表,读写分离,以及全局表,子表的配置

    1、基于yml 配置方式 ,实现springBoot+sharding-jdbc+mybatis-plus 实现分库分表,读写分离,以及全局表,子表的配置。 2、实现mybatis-plus 整合到springboot 详细使用请看 测试用例

    分布式数据库架构及企业实践

    Mycat是开源的Java分布式数据库中间件,它作为数据库的路由服务器,实现了数据库的读写分离、分库分表、数据切片等功能,支持SQL92标准,广泛应用于互联网行业。Mycat的核心功能包括负载均衡、故障切换、数据切分等...

    MySQL分布式数据库架构及企业实践-基于Mycat中间件

    ### MySQL分布式数据库架构及企业实践-基于Mycat中间件 #### 一、MySQL分布式数据库架构概述 在当今的大数据时代背景下,随着业务量的不断增长,传统的单体数据库架构已经无法满足高并发、大数据量处理的需求。...

    分布式数据库架构及企业实践.pdf

    分布式数据库架构及企业实践中,Mycat作为一款热门的开源数据库中间件,扮演着至关重要的角色。Mycat是一款基于MySQL协议的数据库中间件,它实现了数据库的分库分表功能,有效地解决了单个数据库在大数据量下性能...

    集成sharding-jdbc实现分库分表.zip

    在IT行业中,数据库扩展是解决高并发、大数据量问题的关键技术之一。Sharding-JDBC作为阿里巴巴开源的一款轻量级...在实际操作中,我们需要结合业务场景和数据库特性,合理地设计分片策略,以实现最佳的分库分表效果。

    sharding + mybatis-plus 分库分表

    总的来说,“Sharding + Mybatis-Plus 分库分表”是一种有效的解决大数据量场景下的数据库扩展策略,它通过Java的中间件技术,实现了数据库层面的水平扩展,结合Mybatis-Plus的便利性,降低了开发复杂度,提升了系统...

    基于分布式的数据库分库与分表策略研究.pdf

    因此,分布式数据库的应用应运而生,它通过分库与分表策略来存储数据,不仅可以有效解决存储问题,而且还能降低服务器成本,提高企业竞争力。 分库与分表策略是分布式数据库管理的重要方式。分库即将数据按照某种...

    Java+Springboot+mybatis+sharding jdbc 实现分库分表

    ShardingJDBC作为一个轻量级的Java库,能够在不修改现有数据库架构和业务代码的情况下,仅通过配置即可实现分库分表。它具备良好的兼容性,可以与任何Java应用无缝集成,包括但不限于Spring、MyBatis等。在本项目中...

    shardingSpringbootDemo-master-分库分表+读写分离.zip

    【标题】"shardingSpringbootDemo-master-分库分表+读写分离.zip" 提供的是一个基于Sharding-JDBC的Spring Boot应用示例,它实现了数据库的分库分表和读写分离功能。Sharding-JDBC是阿里巴巴开源的一个轻量级Java...

    Sharding-JDBC教程:Spring Boot整合Sharding-JDBC实现分库分表+读写分离.docx

    Sharding-JDBC教程:Spring Boot整合Sharding-JDBC实现分库分表+读写分离 Sharding-JDBC是阿里巴巴开源的关系型数据库中间件,提供了数据库分库分表、读写分离、数据库路由等功能。本教程将指导读者使用Sharding-...

    spring+mybatis+sharding-jdbc 1.3.1实现分库分表案例(可直接运行)

    在现代企业级应用中,随着数据量的增长,单表存储可能会遇到性能瓶颈,这时就需要引入分库分表策略来优化数据库架构。本案例基于Spring、MyBatis和Sharding-JDBC 1.3.1版本,提供了一个可以直接运行的分库分表实现,...

    分布式数据库架构及企业实践-基于Mycat中间件

    首先,Mycat的核心功能在于实现数据库的分库分表,通过水平扩展的方式解决单机数据库性能瓶颈。在大型系统中,数据量往往非常庞大,单个数据库难以承受高并发下的读写压力。Mycat通过对数据进行拆分,将负载分散到多...

    sharding-sphere-demo 分表分库

    **分表分库技术概述** ...通过这个示例,你可以学习到如何在实际项目中使用Sharding-Sphere进行数据库的分布式管理,理解分库分表的实现过程,以及Sharding-Sphere如何解决大数据场景下的性能问题。

    springmvc分库分表实际例子

    本示例“springmvc分库分表实际例子”提供了一个基于SpringMVC实现的实战项目,旨在帮助开发者了解如何在实际应用中进行数据库的分库分表操作。下面我们将详细探讨相关知识点。 1. **SpringMVC**:SpringMVC是...

    4-Sharding-JDBC分库分表.pdf

    通过理解Sharding-JDBC的分库分表机制,我们可以更好地设计和优化数据库架构,处理大规模数据带来的挑战。它不仅可以提高数据存储的扩展性,还能提升查询效率和维护性能。在实际应用中,针对不同的业务场景选择合适...

    腾讯云分布式数据库解决方案

    分库与分表是数据库架构优化的两种常见策略。垂直切分(分库)是按照业务功能对数据库进行划分,例如电商平台将会员、商品、交易、物流等不同功能的数据存储在不同的数据库实例中。而水平切分(分表)则是将单一...

    金融场景分布式数据库强一致保证-钱煜明

    数据节点(数据库集群)通过分库分表技术实现数据存储和能力水平扩展;全局事务管理器(GTM)负责分布式事务的管理;管理节点(OMM与MDS)则涉及元数据管理和监控管理等。 这些组件共同作用,支撑起金融级分布式...

    银行分布式数据库改造方案实践与探索 -王辉1

    这包括对计算节点、数据节点、管理节点和服务模块的全面监控和维护,以及对分布式数据库架构的动态调整,如在线扩容和缩容。 在架构体系上,分布式数据库通常由计算节点、数据节点和管理节点构成。计算节点负责SQL...

    kgtom#daily-life#《企业IT架构转型之道---数据库分库分表》1

    一、拆分背景 二、解决方案 三、注意事项

Global site tag (gtag.js) - Google Analytics