面试官:“谈谈分库分表吧?”

关注偶,领取更多学习资料哦。

1.什么是分库分表

从字面上简单理解,就是将原本存储在一个库的数据分块存储在多个库上,将原本存储在一个表的数据分块存储在多个表里面。

数据的切分根据其切分规则的类型,可以分为如下两种切分模式。

  • 垂直(纵向)切分:把单一的表拆分成多个表,并分散到不同的数据库(主机)上。
    比如一个订单表里面有用户信息,商品信息,收货地址信息,促销信息,这样表的字段太多,显得特别臃肿,所以我们将他们各自分隔出来,形成多张表存储数据。

这样操作的优点:

    拆分后业务清晰,拆分规则明确。

    系统之间进行整合或扩展很容易。

    按照成本、应用的等级、应用的类型等将表放到不同的机器上,便于管理。

    便于实现动静分离、冷热分离的数据库表的设计模式。

    数据维护简单。

缺点:

    业务表多样,SQL语句复杂。
  • 水平(横向)切分:根据表中数据的逻辑关系,将同一个表中的数据按照某种条件拆分到多台数据库(主机)上。与垂直切分对比,水平切分不是将表进行分类,而是将其按照某个字段的某种规则分散到多个库中,在每个表中包含一部分数据,所有表加起来就是全量的数据。

    比如有一个用户表,单张表的记录条数达到1亿条,这样在进行查询,插入,更新操作的时候,速度将非常慢,那我们可以将这些数据分配到100个表里面,每个表的数据量就下来了,导致单表的容量不会太大,从而保证了单表的查询等处理能力。

    我们通常将数据分配的原则称为分片规则,常见的分片规则有对用户的id取模。

    注意:一定要好好决定分片规则,尽量选择不会变动的字段,如果选择区域,性别,年龄等字段,当用户修改这些信息的时候又要讲数据移动到其他数据库,这里面的逻辑也很头疼。

    这样操作水平的优点如下:

      单库单表的数据保持在一定的量级,有助于性能的提高。
    
      切分的表的结构相同,应用层改造较少,只需要增加路由规则即可。
    
      提高了系统的稳定性和负载能力。

    缺点如下:

      切分后,数据是分散的,很难利用数据库的Join操作,跨库Join性能较差。
    
      拆分规则难以抽象。
    
      分片事务的一致性难以解决。
    
      数据扩容的难度和维护量极大。

2.为什么要用分库分表

数据库负载增大时的处理:随着我们的应用的用户量越来越大,访问量也随之提升,当他们提升到一定的量级之后,应用也就越来越慢。当然我们可以通过增大前端应用负载的方式来提升速度,但是直到有一天我们发现无论如何增大前端应用负载都不能提升速度,我们就逐步找到原因,是数据库的问题。因为数据库是存在性能瓶颈的,这是无法避免的。

3.市面上常用中间件

MyCat:是一个中间件的第三方应用,使用mycat时不需要改代码。
我们在使用的时候,如果有多个库,我们在代码里面就只要写mycat对外的一个逻辑库信息就行,而数据库层面的配置,比如总共有多少个库,每个库里面的表,每个表的分片规则,这些都是在mycat里面配置,不需要修改代码信息。
具体的逻辑图如下:

Sharding JDBC:是一个jar包,使用sharding-jdbc时需要修改代码。
我们在使用的时候,需要引入sharding jdbc的jar包,在配置文件里面写明总共有多少个库,每个库里面的表,每个表的分片规则等信息。

具体的逻辑图如下:

如何选择中间件?

sharding-jdbc和mycat使用不同的理念,sharding-jdbc目前是基于jdbc驱动,无需额外的proxy,因此也无需关注proxy本身的高可用。Mycat 是基于 Proxy,它复写了 MySQL 协议,将 Mycat Server 伪装成一个 MySQL 数据库,而 Sharding-JDBC 是基于 JDBC 接口的扩展,是以 jar 包的形式提供轻量级服务的。

其实MyCAT很适合中小企业使用的。可以非常容易的实现数据库的读写分离和分库分表,反而对于大企业来说,都会自己开发适合自己的数据库中间层应用,比如sharding jdbc原来就是当当网内部的数据库中间件,后来开源出来的。

原文地址:https://www.cnblogs.com/chenchen0618/p/11624480.html

时间: 2024-10-06 02:51:39

面试官:“谈谈分库分表吧?”的相关文章

面试官:分库分表之后,id 主键如何处理?

面试题 分库分表之后,id 主键如何处理? 面试官心理分析 其实这是分库分表之后你必然要面对的一个问题,就是 id 咋生成?因为要是分成多个表之后,每个表都是从 1 开始累加,那肯定不对啊,需要一个全局唯一的 id 来支持.所以这都是你实际生产环境中必须考虑的问题. 面试题剖析 数据库自增 id 这个就是说你的系统里每次得到一个 id,都是往一个库的一个表里插入一条没什么业务含义的数据,然后获取一个数据库自增的一个 id.拿到这个 id 之后再往对应的分库分表里去写入. 这个方案的好处就是方便简

分库分表后如何部署上线?

引言 我们先来讲一个段子 面试官:"有并发的经验没?" 应聘者:"有一点." 面试官:"那你们为了处理并发,做了哪些优化?" 应聘者:"前后端分离啊,限流啊,分库分表啊.." 面试官:"谈谈分库分表吧?" 应聘者:"bala.bala.bala.." 面试官心理活动:这个仁兄讲的怎么这么像网上的博客抄的,容我再问问. 面试官:"你们分库分表后,如何部署上线的?" 应聘

分库分表(1) --- 理论

分库分表---理论 当一张表的数据达到几千万时,查询一次所花的时间会变长.业界公认MySQL单表容量在 1千万 以下是最佳状态,因为这时它的BTREE索引树高在3~5之间. 数据切分可以分为:垂直切分和水平切分. 一.垂直切分 垂直切分又可以分为: 垂直分库和垂直分表. 1.垂直分库 概念 就是根据业务耦合性,将关联度低的不同表存储在不同的数据库.做法与大系统拆分为多个小系统类似,按业务分类进行独立划分.与"微服务治理"的做法相似, 每个微服务使用单独的一个数据库. 如图: 说明 一开

面试官:如何做到不停机分库分表迁移?

需求说明 类似订单表,用户表这种未来规模上亿甚至上十亿百亿的海量数据表,在项目初期为了快速上线,一般只是单表设计,不需要考虑分库分表.随着业务的发展,单表容量超过千万甚至达到亿级别以上,这时候就需要考虑分库分表这个问题了,而不停机分库分表迁移,这应该是分库分表最基本的需求,毕竟互联网项目不可能挂个广告牌"今晚10:00~次日10:00系统停机维护",这得多low呀,以后跳槽面试,你跟面试官说这个迁移方案,面试官怎么想呀? 借鉴codis 笔者正好曾经碰到过这个问题,并借鉴了codis一

大数据技术之_29_MySQL 高級面试重点串讲_02_Mysql 简介+Linux 版的安装+逻辑架构介绍+性能优化+性能分析+查询截取分析+分区分库分表简介+锁机制+主从复制

第1章 Mysql 简介1.1 概述1.2 高级 MySQL第2章 Mysql Linux 版的安装2.1 下载地址2.2 检查当前系统是否安装过 mysql2.3 修改 Mysql 配置文件位置2.4 修改字符集和数据存储路径2.5 MySQL 的安装位置说明2.6 Mysql 配置文件说明2.7 Mysql 的数据存放目录第3章 Mysql 逻辑架构介绍3.1 总体概览3.2 查询说明第4章 Mysql 性能优化4.1 影响 mysql 的性能因素4.2 查询与索引优化分析4.2.1 性能下

数据库分库分表中间件 Sharding-JDBC 源码分析 —— 分布式主键

关注**微信公众号:[芋道源码]**有福利: RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表 RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址 您对于源码的疑问每条留言都将得到认真回复.甚至不知道如何读源码也可以请教噢. 新的源码解析文章实时收到通知.每周更新一篇左右. 认真的源码交流微信群. 本文主要基于 Sharding-JDBC 1.5.0 正式版 1. 概述 2.KeyGenerator 2.1 D

分库分表、主从、读写分离

每天学习一点点 编程PDF电子书.视频教程免费下载: http://www.shitanlife.com/code 1. 漫谈 在进入正题之前,我想先随意谈谈对架构的拓展周期的想法(仅个人观点).首先,我认为初期规划不该太复杂或者庞大,无论项目的中长期可能会发展地如何如何,前期都应该以灵活为优先,像分库分表等操作不应该在开始的时候就考虑进去.其次,我认为需求变更是非常正常的,这点在我等开发的圈子里吐槽的最多,其中自然有 "领导们" 在业务方面欠缺整体考虑的因素,但我们也不该局限在一个观

DBA 小记 — 分库分表、主从、读写分离

前言 我在上篇博客 "Spring Boot 的实践与思考" 中比对不同规范的 ORM 框架应用场景的时候提到过主从与读写分离,本篇随笔将针对此和分库分表进行更深入地探讨. 1. 漫谈 在进入正题之前,我想先随意谈谈对架构的拓展周期的想法(仅个人观点).首先,我认为初期规划不该太复杂或者庞大,无论项目的中长期可能会发展地如何如何,前期都应该以灵活为优先,像分库分表等操作不应该在开始的时候就考虑进去.其次,我认为需求变更是非常正常的,这点在我等开发的圈子里吐槽的最多,其中自然有 &quo

为什么要分库分表?用过哪些分库分表中间件?不同的分库分表中间件都有什么优点和缺点?

为什么要分库分表(设计高并发系统的时候,数据库层面该如何设计)?用过哪些分库分表中间件?不同的分库分表中间件都有什么优点和缺点?如何对数据库如何进行垂直拆分或水平拆分的? 其实这块肯定是扯到高并发了,因为分库分表一定是为了支撑高并发.数据量大两个问题的.而且现在说实话,尤其是互联网类的公司面试,基本上都会来这么一下,分库分表如此普遍的技术问题,不问实在是不行,而如果你不知道那也实在是说不过去! 为什么要分库分表?(设计高并发系统的时候,数据库层面该如何设计?) 说白了,分库分表是两回事儿,大家可