zoukankan      html  css  js  c++  java
  • Sharding-jdbc(一)分库分表理解

    1、什么是分库分表

      所谓的分库分表就是数据的分片(Sharding)。

    2、为什么需要分库分表

      因为随着公司的业务越来越大,对于现成单机单个应用瓶颈问题,对数据持久化硬盘如何进行扩容。

      可以从4个方面就行考虑:

      1、表的设计要符合业务需求

      2、sql语句的优化

      3、读写分离

      4、分库分表

    3、什么是读写分离

      将操作的sql语句到指定的库中操作,达到读写分开操作不同的数据库。

      数据库的角色:主库(master,就是写库),从库(slave,就是读库)。

      读写分离对insert、update、delete语句的操作走主库,select语句走从库,(所谓的crud操作)

      应用:对于读多写少业务对从库的压力比较大,对于写多读少业务对主库压力比较大。

      读写分离java开源框架分类

        客户端(应用层):TDDL、Sharding-jdbc

        这里讲解Sharding-jdbc

        

        特点

           优点:1、程序自动完成,数据源方便管理;2、不需要维护、因为没有中间件;3、理论支持任何数据库(sql标准)

           缺点:1、存在代码入侵性;2、加大开发成本;3、不能做到动态添加数据源,添加数据源还需要重启程序;4、程序开发完后,运维人员参与不了

        中间件(代理层 proxy):mysql proxy、mycat、altas(360开发的)

        

        特点

           优点:1、数据添加不会影响到程序;2、应用层不需管理数据库层方面,由代理层去管理;3、添加数据源不需要重启程序

           缺点:1、程序依赖的中间件,提高维护工作;2、容易出现高可用问题;3、中间件导致切换数据库变的困难;2、增加了proxy,程序性能下降

    4、什么是分库分表

      分库分表其实是基于读写分离上面提出的方案(也就是目前关系型数据库终极解决方案)。

      读写分离:当数据写很大的时候,(例如:双十一 天猫、京东下单时写的数据很大)master写的压力大的问题以及公司随着业务增大之后产生瓶颈问题,需要数据分片来解决。

      分库分表:目前数据库终极解决方案:解决高并发、数据分片。

      分库(表)类型:

        垂直

          将一个比较多字段的表拆分成多个小表,将不同字段放到不同的小表中,降低单表(单库)大小的目的来提高性能。

          通俗:大表拆小表,拆分是基于关系型数据库表的列(字段)来进行。

          特点:每个表(库)的结构都不一样

                每个表(库)的列数据至少有一列是一样的

                每个表(库)并集是整个数据库的全量数据

                每个表(库)数据量一样(不会变):例如(user-info字段 + user-basse字段 = user的全字段)

           水平

          某个字段按照一定规律进行拆分,将一个表的数据分到多个表(库)中。

          降低表的数据量,优化查询数据量的方式来提高性能。例如:(user1(数据) + user2 (数据) = user全部数据)

          特点:每个表(库)的结构一样

                每个表(库)数据量不一样。(要是一样只能说太恰好了,但是不可以存在一样的数据)

                每个表(库)的并集是整个数据库(表)全量数据。

    5、分库分表常见的算法:

      1、Hash(取模):通过表的一列字段进行hash取出code值来区分的。

      2、Range(范围):按年份、按时间、按某值等。

      3、List预定义:事先定于好。

    6、分库分表之后带来什么问题

      1、查询数据结果集合需要查询多个库,比较麻烦。

      2、sql语句需要修改,将之前没分库分表的语句需要重新修改,比较麻烦。

      3、分布式事务

      4、全局唯一性id,之前哪些只增的id都不管用,水平拆分后的表,多个表之间的id不能使用自增,需要一个唯一全局id。

    7、如何设计一个永远都不需要迁移的方案?

      

  • 相关阅读:
    巴洛克式和哥特式的区别
    推荐阅读书籍,是时候再行动起来了。
    AtCoder ABC 159F Knapsack for All Segments
    AtCoder ABC 159E Dividing Chocolate
    AtCoder ABC 158F Removing Robots
    AtCoder ABC 158E Divisible Substring
    AtCoder ABC 157F Yakiniku Optimization Problem
    AtCoder ABC 157E Simple String Queries
    AtCoder ABC 157D Friend Suggestions
    AtCoder ABC 156F Modularness
  • 原文地址:https://www.cnblogs.com/c-xiaohai/p/8472970.html
Copyright © 2011-2022 走看看