分库分布的几件小事(一)数据库如何拆分

1.为什么要分库分表

①分库分表说白了,就是因为数据量太大了,如果你的单表数据量都到了千万级别,那么你的数据库就无法承受高并发的要求,数据库操作性能就会出现极大的下降。

②数据库并发量太大了,一般而言,一个数据库最多支撑并发到2000,这时候一定要进行扩容,不然性能会出现严重下降。而且一个健康的单库并发值你最好保持在每秒1000左右,不要太大。那么你可以将一个库的数据拆分到多个库中,访问的时候就访问一个库好了。

2.有哪些分库分布中间件

比较常见的中间件有cobar、TDDL、atlas、sharding-jdbc、mycat。

cobar :阿里b2b团队开发和开源的,属于proxy层方案。已经好几年没有进行更新了,基本没啥人用。而且不支持读写分离、存储过程、跨库join和分页等操作。

TDDL :淘宝团队开发的,属于client层方案,不支持join,但是支持读写分离。目前使用的也不多,因为还依赖淘宝的diamond配置管理系统。

atlas :360开源的,属于proxy层方案,以前有一些公司在用,但是已经好几年没有更新了,所以现在用的也不多。

sharding-jdbc :当当开源的,属于client层方案。SQL语法支持多,没有太多的限制,从2.0版本开始支持分库分表、读写分离、分布式id生成、柔性事务(最大努力送达型事务、TCC事务)。而且现在使用较多。

myCat :基于cobar改造,属于proxy层方案,支持的功能完善,而且目前应该是非常火的而且不断流行的数据库中间件,社区很活跃,也有一些公司开始在用了。

3.分布式中间件类型

proxy类型
proxy类型的中间件就是一个客户端,需要直接部署一个中间件,去进行分库分表。服务端将sql发送到中间件客户端去进行不同表库的操作。如果中间件客户端不可用将直接导致无法进行分库分表,而且要走网络耗时。

client
client不需要单独部署中间件客户端,运维成本低,中间件就是一个jar包,直接在项目中导入、配置就可以完成分库分表,而且不需要代理层的二次转发,性能高点,但是遇到升级等操作需要重新发布版本,各个系统都需要耦合sharding-jbdc的依赖。

4.垂直拆分与水平拆分

垂直拆分
垂直拆分的意思,就是把一个有很多字段的表给拆分成多个表,或者是多个库上去。每个库表的结构都不一样,每个库表都包含部分字段。一般来说,会将较少的访问频率很高的字段放到一个表里去,然后将较多的访问频率很低的字段放到另外一个表里去。因为数据库是有缓存的,你访问频率高的行字段越少,就可以在缓存里缓存更多的行,性能就越好。这个一般在表层面做的较多一些。
这个其实挺常见的,不一定我说,大家很多同学可能自己都做过,把一个大表拆开,订单表、订单支付表、订单商品表。

水平拆分
水平拆分的意思,就是把一个表的数据给弄到多个库的多个表里去,但是每个库的表结构都一样,只不过每个库表放的数据是不同的,所有库表的数据加起来就是全部数据。水平拆分的意义,就是将数据均匀放更多的库里,然后用多个库来抗更高的并发,还有就是用多个库的存储容量来进行扩容。

表的拆分
还有表层面的拆分,就是分表,将一个表变成N个表,就是让每个表的数据量控制在一定范围内,保证SQL的性能。否则单表数据量越大,SQL性能就越差。一般是200万行左右,不要太多,但是也得看具体你怎么操作,也可能是500万,或者是100万。你的SQL越复杂,就最好让单表行数越少。

一般来说,垂直拆分,你可以在表层面来做,对一些字段特别多的表做一下拆分;水平拆分,是并发承载不了,或者是数据量太大,容量承载不了,你给拆了,按什么字段来拆,你自己想好;分表,你考虑一下,你如果哪怕是拆到每个库里去,并发和容量都ok了,但是每个库的表还是太大了,那么你就分表,将这个表分开,保证每个表的数据量并不是很大。

5.两种分库分表方式

range方式
就是每个库一段连续的数据,这个一般是按比如时间范围来的,但是这种一般较少用,因为很容易产生热点问题,大量的流量都打在最新的数据上了。

range来分,好处在于说,后面扩容的时候,就很容易,因为你只要预备好,给每个月都准备一个库就可以了,到了一个新的月份的时候,自然而然,就会写新的库了;缺点,但是大部分的请求,都是访问最新的数据。实际生产用range,要看场景,你的用户不是仅仅访问最新的数据,而是均匀的访问现在的数据以及历史的数据

hash方式
按照某个字段hash一下均匀分散,这个较为常用。

hash分法,好处在于说,可以平均分配没给库的数据量和请求压力;坏处在于说扩容起来比较麻烦,会有一个数据迁移的这么一个过程

原文地址:https://www.cnblogs.com/jack1995/p/10924453.html

时间: 2024-10-12 20:10:42

分库分布的几件小事(一)数据库如何拆分的相关文章

分库分布的几件小事(三)可以动态扩容缩容的分库分表方案

1.扩容与缩容 这个是你必须面对的一个事儿,就是你已经弄好分库分表方案了,然后一堆库和表都建好了,基于分库分表中间件的代码开发啥的都好了,测试都ok了,数据能均匀分布到各个库和各个表里去,而且接着你还通过双写的方案咔嚓一下上了系统,已经直接基于分库分表方案在搞了. 那么现在问题来了,你现在这些库和表又支撑不住了,要继续扩容咋办?这个可能就是说你的每个库的容量又快满了,或者是你的表数据量又太大了,也可能是你每个库的写并发太高了,你得继续扩容. 缩容就是现在业务不景气了,数据量减少,并发量下降,那么

分库分布的几件小事(二)如何进行分库分表的数据迁移

1.停机迁移方案 这是最简单的也是最low的迁移方案了,如果系统就算短期停机也没有关系或者造不成多大的影响,可以选用此方案. 首先停掉机器,将系统全都停掉,不要再有新的数据进来,然后使用之前写好的程序,连接旧的数据库,将旧数据库里面的数据读出来,然后通过数据分发中间件写到分库分好的数据里面去.然后修改系统是数据库连接.分库分表配置,然后重新上线. 2.双写不停机迁移方案 双写迁移方案的核心在双写,首先要修改系统所有需要写库的地方,将虽有对数据的写操作不但要写入就库,也要同时写入新库. 然后使用写

笔试面试那件小事(数据库-范式)

1>相关概念和知识 数据依赖:反映一个关系内部属性与属性之间的约束关系,是现实世界属性相互联系的抽象,属于数据内在的性质和语义的体现 规范化理论:是用来设计良好的关系模式的基础.它通过分解关系模式来消除其中不合适的数据依赖,以解决插入异常.删除异常.更新异常和数据冗余问题 函数依赖:简单的说,对于关系模式的两个属性子集X和Y,若X的任一取值都能唯一确定Y的值,那么则称Y函数依赖于X,记为X->Y 非平凡函数依赖:对于关系模式的两个属性子集X和Y,如果X->Y,但是Y不是X的子集,那么就称

笔试面试那件小事(数据库概念知识)

第一节: 相关概念: 1>Data:数据,是数据库中存储的基本对象,是描述事物的符号记录 2>DataBase:数据库,是长期存储在计算机内.有组织的,可共享的大量数据的集合. 3->DBMS:数据库管理系统,是位于用户与操作系统之间的一层数据管理软件,用于科学的组织.存储和管理数据,高效的获取和维护数据 4->DBS:数据库系统,指在计算机系统中引入数据库后的系统,一般由数据库.数据库管理系统和数据库管理员组成 5->数据模型:是用来抽象.表示和处理现实世界的数据和信息工具

笔试面试那件小事(数据库知识)

1>关系数据库规范化是为了解决关系数据库中(插入异常.删除异常和数据冗余)问题而引入. 2>在数据管理技术的发展过程中,经历了人工管理阶段.文件系统阶段和数据库系统阶段.在这几个阶段过程中,其中(数据库系统阶段)的数据独立性最高. 3>数据库(DB).数据库系统(DBS).数据库管理系统(DBMS)三者之间的关系(DBS包括DB和DBMS) 4>数据库管理系统能实现对数据库中数据表.索引等对象的定义.修改.删除,这类语言称为(数据库定义语言(DDL)) 5>同一关系模型的任意

一件小事引发纯属自我的调节,于是有了这篇随笔

只能说今天运气差到极点了吧,也是因此,晚上十点半的现在的我也只能在word上把随笔先写好,等网好了再发出去. 原定的计划是先把周末的网页先写得差不多再直接睡觉的,结果先是PS运行不了,再是快把PS安装包下载完的时候网络又出问题了.弄来弄去结果就把心态搞炸了.在写这篇随笔的时候网络还是忽好忽坏,PS还是没有下下来.这么早就睡觉肯定是睡不着的,也是想借写随笔的过程来平复下烦躁的心情吧. 学习日近尾声,老师的节奏加快的同时,自己的节奏越发受到外界因素的影响,许久未曾谋面的烦躁又开始活跃起来了.而且由于

《一件小事.呐喊》--鲁迅 词语解释

<一件小事> -出自鲁迅小说集<呐喊>. 伊:彼,他,她. 装腔作势:故意装出一种腔调,做出一种姿势,用来比喻故意做作. 威压:表现出使人敬畏的气魄.威:表现出来使人敬畏的气魄:威力,威风,权威:凭借力量或势力:威胁,威逼. 压:从上面加力:压住:用威力制服.镇服:镇压,压服,压迫:逼近:大兵压境.

asp.net 不用控件 循环输出数据库数据的方法

不使用什么repeater gridview之类的控件,怎么才能输出数据库的数据到一个table ,我用response.write在后台,拼接 table 代码可以输出 但总是在页面的最上面 , 是不是要在aspx页面相应位置用<% %> 循环输出 但又提示找不到我后台填充的DATASET,因为听说公司做asp.net是不用控件的,想知道他们是怎么做输出数据库表格的,还请高手帮帮忙,谢谢了. 不明白来问我后台代码public string test = "";    pr

单例模式不是一件小事,快回来看看

上次写了一篇<单例模式那件小事,看了你不会后悔>的文章,总结了常用的单例模式的实现.本文是上文的延续,单例模式绝不是一件小事,想弄清楚,真不是那么简单的.上文提到了常用的三种单例模式的实现方法:饿汉式(除了提前占用资源,没毛病.),懒汉式(DCL优化过后,没毛病?),静态内部类式(优雅的方法,没毛病.).文末最后还提到,反射会破坏单例. 本文继续,双重检查锁定优化过后的懒汉式,真的没毛病吗?其实不是,这里涉及到java编译器编译时的一些细节,对象初始化时的写操作与写入 sSingleton 字