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、如何设计一个永远都不需要迁移的方案?

      

  • 相关阅读:
    linux 静态库和动态库(共享库)的制作与使用
    实现linux mkdir命令
    行间距和文本样式
    单位和字体
    html标签2
    css层叠样式表
    html标签
    html简介
    数据数组
    Redis的使用
  • 原文地址:https://www.cnblogs.com/c-xiaohai/p/8472970.html
Copyright © 2011-2022 走看看