基本思想

Sharding的基本思想就是把一个数据库切分成多个部分放到不同的数据库,用来缓解单一数据库的性能问题。即,有两种拆分方式,第一种拆分方式是把表进行拆分,把表放到多个server上,用来实现基本的拆分。第二种拆分方式是在表的数据量很大的时候,按照某种ID顺序,切分到多个数据库上。这两种切分方式被称为水平切分和垂直切分。

常用中间件

这里常用的中间件有以下几种。

简单易用的

当当网  sharding-jdbc 蘑菇街:Tsharding

强悍重量级中间件

sharding TDDL Smart Client Atlas alibaba.cobar MyCat

需要解决的问题

事物问题

解决事物问题,有两种可行的方案,这里使用分布式事物,或者通过应用程序与数据库共同控制实现事物。做一个简单的对比

方案一:使用分布式事物

优点:交给数据库管理,简单有效。缺点:性能代价相当高。

方案二:由应用程序和数据库共同控制

原理:把一个跨多个数据库的分布式事物分拆成多个仅处于单个数据库上的小事物,通过应用程序来控制各个小事物。优点:性能较高。缺点:需要应用程序在事物上做控制,

跨节点join的问题

只要是进行切分,跨节点的join就会有此问题。一般做法是分两次查询实现。第一次查询获得id,第二次再次查询获得第二次的id。

跨节点的count,order by, group by 以及聚合函数。

这是一类问题,解决办法就是在分节点上获取到数据,然后在应用程序端进行合并。

ID 问题

一旦数据库被切分到多个物理结点上,此时需要以下的方式作为数据库主键生成方式。

UUID

这是作为主键的最简单的方案,索引建立不方便,以及性能不方便。

维护数据库的Sequence表

在数据库中建立一个相关的表,表的结构如下

CREATE TABLE `SEQUENCE` (`table_name` varchar(18) NOT NULL,`nextid` bigint(20) NOT NULL,PRIMARY KEY (`table_name`)
) ENGINE=InnoDB

通过使用Twitter的Snowflake算法

这里使用推特的UUID算法,进行生成。

  • 10---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间,然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识),然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。

这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分),并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。

跨分片的排序分页

一般来讲,分页需要按照指定字段进行排序,排序字段就是分片信息。通过分片规则可以定位到指定的分片。

上面图中所描述的只是最简单的一种情况(取第一页数据),看起来对性能的影响并不大。但是,如果想取出第10页数据,情况又将变得复杂很多,如下图所示:

分库方式

分库确定以后,如何把记录分到各自库里?一般由两种方式

  1. 根据数值范围确定,id为1-999分到一个库,999以后分到另外一个库。

  2. 进行取模。

分库数量

分库数量和单库的处理记录条数有关,Mysql单库5000万条进行分库。

路由透明

对于单库访问,必如查询条件指定用户ID,则该SQL只需要访问特定库,此时DAL会进行自动的路由。

使用框架还是自主研发

各有优势,各有短板。综合考虑。

小明菜市场

推荐阅读

● 推荐 | ASP.NET Core学习资源汇总

● 理论 | 六种延迟队列的实现方案

● 实战 | Element UI 父子组件传值与事件绑定(逆向)

● 实战 | Element UI 父子组件传值与事件绑定(正向)

● 实战 | Vue + Element UI 表格组件二次封装

理论 | 分库分表需要考虑的问题及方案相关推荐

  1. 分库分表需要考虑的问题及方案

    https://www.jianshu.com/p/32b3e91aa22c 分库分表的基本思想 Sharding的基本思想就要把一个数据库切分成多个部分放到不同的数据库(server)上,从而缓解单 ...

  2. 基于SpringCloud实现Shard-Jdbc的分库分表模式,数据库扩容方案

    一.项目结构 1.工程结构 2.模块命名 shard-common-entity: 公共代码块 shard-open-inte: 开放接口管理 shard-eureka-7001: 注册中心 shar ...

  3. “分库分表 ?选型和流程要慎重,否则会失控

    原文地址:https://segmentfault.com/a/1190000017272697 恭喜你,贵公司终于成长到一定规模,需要考虑高可用,甚至分库分表了.但你是否知道分库分表需要哪些要素?拆 ...

  4. 分库分表学习总结(6)——分库分表?选型和流程要慎重,否则流程会失控!

    数据库中间件之分库分表 恭喜你,贵公司终于成长到一定规模,需要考虑高可用,甚至分库分表了.但你是否知道分库分表需要哪些要素?拆分过程是复杂的,提前计划,不要等真正开工,各种意外的工作接踵而至,以至失控 ...

  5. 阿里巴巴数据库分库分表的最佳实践

    点击▲关注 "数据和云"   给公众号标星置顶 更多精彩 第一时间直达 1.阿里巴巴分布式数据层发展和演变 业务数据从原来的单库单表模式变成了数据被拆分到多个数据库,甚至多个表中, ...

  6. 分库分表和 NewSQL 到底怎么选?

    文章来源:[公众号:CoderW] 目录 背景 分表 分库 分库分表的成本 NewSQL NewSQL 平滑接入方案 NewSQL 真的有那么好吗? NewSQL 的应用 分库分表和 NewSQL 到 ...

  7. postgresql分库分表中间件开源实现方案

    PostgreSQL 分库分表的中间件开源实现方案有很多, 你可以根据自己的需要选择适合自己的方案. 下面是几种常见的方案: pgpool-II: 一个 PostgreSQL 透明数据库代理, 具有负 ...

  8. mysql 分表 条件查询,面试过关斩将:分库分表-sharding-jdbc分页,排序,条件查询优化...

    之前讲了利用sharding-jdbc 3.1进行分表的情况,也讲了利用一致性hash去做分表的高可用.今天讲下分表后的分页,排序,条件查询优化. 其实本身sharding-jdbc是提供了分页功能的 ...

  9. 分库分表真的适合你的系统吗?聊聊分库分表和NewSQL如何选择

    曾几何时,"并发高就分库,数据大就分表"已经成了处理 MySQL 数据增长问题的圣经. 面试官喜欢问,博主喜欢写,候选人也喜欢背,似乎已经形成了一个闭环. 但你有没有思考过,分库分 ...

最新文章

  1. 笔试算法题(58):二分查找树性能分析(Binary Search Tree Performance Analysis)
  2. 揭秘美国空军如何用AI技术提升“战斗力”
  3. 深入理解 C 指针阅读笔记 -- 第二章
  4. file 关闭_python文件file
  5. 2018年10月17日普级B组【模拟赛】
  6. WPF:WPF显示PDF文档
  7. win11虚拟内存如何设置 Windows11设置虚拟内存的步骤方法
  8. 【ARM】【NEON加速介绍】
  9. 无线通信原理与技术 实验二  CDMA通信系统仿真
  10. 线性代数笔记1-二阶行列式和三阶行列式
  11. 硬禾课堂 - 一分钟焊接小技巧
  12. HiKey试用体验 烧写系统至Flash之诡异事件
  13. 服务器存储光模块需要同型号吗,最全面的光模块系列分类讲解
  14. 内核态的文件操作函数:filp_open、filp_close、vfs_read、vfs_write、set_fs、get_fs
  15. 怎么用燃尽图高效搞定项目进度监控?看老原这一篇就够了!
  16. 【院士等重磅嘉宾齐聚珠海】第二届人工智能与工业设计国际会议 (AIID 2022)
  17. Matplotlib画折线图
  18. 为什么30岁的工程师容易跳槽?
  19. 2023年,重新扬帆起航!
  20. Cisco 9100系列AP清空配置

热门文章

  1. Bootstrap学习笔记--常用标签和类模板
  2. ES6入门笔记(一)
  3. sqlplus补丁包rlwrap-0.37的安装步骤(解决SQL的删除、上翻历史命令等)
  4. 20135310陈巧然家庭作业汇总[3.56 3.67 6.23 6.39.6.40 6.41]
  5. Use JPA API
  6. CodeSmith Professional 5与VS2010有冲突
  7. windows调试工具集
  8. Java虚拟机-常用工具
  9. 大屏监控系统实战(10)-大屏展示前20个博主的排名、票数及名次相对于前一日的升降情况
  10. HADOOP:Current usage: 399.9 MB of 1 GB physical memory used; 2.5 GB of 2.1 GB virtual memory used.