分布式.数据库架构(Mysql 就这么点东西,分库分表读写分离集群演化)

2023-10-28

缘起

讲个创业故事,某一天老总想做一个HR的Saas系统,其中员工信息表,但不同员工信息表有一部分是相同的,也有一部分不同的。我们就把不同的放在一个json字段(Mysql 8.0以后支持)中,Dao用的Mybatis,以及MybatisGenerator生成的基础包访问DB,大家知道这个查询就会查询一条完整的数据,没法查几个字段。刚开始没啥,为了赶进度查询一条就一条吧,不用就行。后来试用开始,量上来就慢了,尤其一些扩展的字段都是在更多详情中展示,但基础信息获取也很慢。原因就是查询用户基础信息也用的是按照行全量查询。

为了解决读的问题,我们做了读写分离,后来干脆多高几个Slave从库进行读,可随着业务发展,尤其有些公司扩展字段很多,读取速度就更慢了。

垂直分离,将基本信息和扩展信息拆分为两个表,ID是一致的。这样,基础信息查询用户基础基础信息表,点击更多的时候查询用户的扩展信息表。

因为是Saas多租户架构,用户表数据量也上来了,于是开始分片。这里的分片不同于数据库的那个分片,也指业务上的分片。一般方案有两个,按照某种业务规则拆分,如三个月内+历史数据(时间维度);另一种是根据ID进行Hash,平均分配到不同DB,缺点是当然你查询自己的订单时候就不得不从两个表查询了。Saas多租户,租户ID自然是比较好的拆分依据,就把不同租户的用户拆分到不同的DB中,关于是分库还是分表,建议是分库,实现简单,且两个租户不争夺IO资源,当然也不绝对,看业务。

分库后,刚开始没有进行读写分离,运维成本的考虑。但对于大公司还是比较慢的,于是就添加了从库,进行读写分离,尤其对于报表生成都迁移从库来完成。

业务发展到现在,对于一个租户来说,主库还是单点。畅想一下,一般情况,业务复杂后,数据量再上来,优先考虑纵向根据业务拆分为不同微服务,这样原来一个DB 100张表,可能就拆分为40+60的两个库,能缓解一段时间。

但如果对于一些业务表,单表都能超过kw级别,分表一定不行了,原因是:能达到kw规模存量数据,增速一定很高,写性能和IO性能是瓶颈,即使分表也会争抢IO资源,所以这里就必须进行分库了,这里的分库指的是:同一个表的分库,类似根据ID去Hash分库一样。以此来解决数据量大,单点扛不住问题。

演化到这里,已经很少有业务能到这个程度,如果到了,也只是系统中少有的几个模块,就需要特殊设计了,也不存在什么通用的方案。

数据库架构分解

说起“数据库架构”,包括:数据库表设计和数据持久层架构。下面主要将持久层架构,但也会涉及数据库表设计。

创业初期:一个服务一个库

读瓶颈:读写分离

   

架构:一主多从,主从同步,读写分离

这么一套就是一组,这个架构也成为:分组架构

技术实现:在Service层使用AOP注解标记;多数据源路由的时候根据标记路由;或者配置规则进行路由。

架构特点:

  1. 主从表结构和数据完全一致
  2. 通过binlog同步数据,会有一定的时差
  3. 解决读多写少的场景,或者读费时的问题

表中冷热数据纵向拆分

如下表单,先展示基本信息,点击“更多”后,展开其他详细信息。

 刚开始数据库表设计:

前面的“基本信息”比“扩展信息”更常用,所以可以拆分为两个表: 

单表总数据库大:分片架构

 

根据租户ID进行拆分,即:一个公司的数据独立的放在一个库里边。 

路由的技术实现:Spring的动态数据源;Mycat中间件

分库还是分表:建议分库,拆分数据是为了解决单表数据量问题,数据量大的两个瓶颈是:数据库单表瓶颈和服务器IO,如果分表意味着IO瓶颈会突出出来。

水平分配规则:

  1. 按照业务key分,如:不同租户的数据;不同地点订单;不同类别等
  2. 根据ID按照Hash算法平均分配,这类只是为了解决数据量大的问题

架构特点:

  1. 每个数据库的Schema一样
  2. 数据每个库数据是不同的,区别于主从复制

解决问题:此架构解决单库成为瓶颈问题,通过拆分为多个库存储数据,一次来降低单库的压力,代价就是统计,查询我的历史等功能,需要通过合并数据才可以。

 分片后读写分离

拆分为不同的库后,也有读多写少的问题,于是再对每台DB进行分组架构,添加从库进行读写分离。

如果业务读写并发量很高,数据量也很大,通常需要实施分组+分片的数据库架构:

1.通过分片来降低单库的数据量,线性提升数据库的写性能

2.通过分组来线性提升数据库的读性能,保证读库的高可用

 主库单点问题扩展

此案例先进行根据租户ID分库,但如果一个租户的数据也过大,就需要对这个租户进行分库存储。图跟上面类似,路由的规则却变为根据ID去hash。这个只是扩展,实际业务需要看具体业务,必须分库会带来其他额外的工作,比如获取全部员工信息,需要从多个数据库查询查询。类似这样的功能需要全部重构。

数据库架构总结

  1. 业务初期用单库
  2. 数据量和并发量增加开始可以选择更好好一点的机器
  3. 读写比例差异,可以进行读写分离
  4. 类似报表等查询和统计类功能,又比较好性能的模块就可以迁移到从库
  5. 单库写量上来后,可以进行分片,将压力拆分到多个库中
  6. 高频的信息查询和低频信息可以拆分为两个表

题外话

其实架构就像是打架,为了解决问题手脚会并用的。

读写比例差异场景除了读写分离外,还可以将热点数据放在缓存如redis或者memcache中,只需要保证缓存数据的一致性即可。

数据如果按照冷热字段拆为两个表后,如果要统计或者查询,一般都会合并出一个中间表,在这个中间表进行操作。

如果数据分散到多个数据库中,并需要查询“简历上干过***类项目的员工”场景是,查询则需要专门的组件或者架构支持,如ES的引入,解决关键字查询为。

数据和业务到了一定量,或者一定并发。提交数据,查询,统计等功能都已经不是简简单单的数据库的事情了,需要专门为此设计解决。

补充:数据库分配优化查询速度

比如Saas多租户架构,将一个租户的数据放在一片或者相邻的片来存储,查询速度会快点。能否解决查询速度的问题?可以。

但,这属于战术层面的方法,就是在不跳转架构的情况下,可以做此优化;从战略架构层面,还是要着眼于解决扩展问题。


END

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

分布式.数据库架构(Mysql 就这么点东西,分库分表读写分离集群演化) 的相关文章

  • 【计算机开题报告】二手车交易平台

    一 选题依据 简述国内外研究现状 生产需求状况 说明选题目的 意义 列出主要参考文献 选题目的 意义 如今时代网络技术正在快速发展 电子商务技术也以极为强势的姿态闯入人们的视野之中 随着人们生活质量的提升 为了对身边二手物品进行回收利用 二
  • 天猫数据分析工具推荐(天猫第三方数据平台)

    在电商迅速发展的大背景下 做好天猫数据分析能够在多方面帮助品牌商家更好地运营店铺 塑造品牌 如通过数据分析了解消费者的需求 购买偏好 这有利于品牌商家及时调整商品结构 产品推广 商品宣传等等 灵活制定品牌的销售策略 那么 天猫平台行业 品牌
  • 软件开发和网络安全哪个更好找工作?

    为什么今年应届毕业生找工作这么难 有时间去看看张雪峰今年为什么这么火就明白了 这么多年人才供给和需求错配的问题 在经济下行的今年 集中爆发 供给端 大学生越来越多 需求端 低端工作大家不愿去 高端岗位又太少 很多基础行业 比如机械 土木 所
  • 亚信安慧AntDB引领数字化转型:浙江移动成功实现CRM系统全域改造

    数字时代 通信运营商在不断迭代的背景下 需要不断探索数字化转型的路径 以适应快速发展的市场和技术环境 在这一浪潮中 浙江移动站在前沿 率先完成了其CRM系统的全域改造 采用了亚信安慧公司研发的AntDB数据库 为整个行业树立了数字化转型的标
  • 【复现】遗传算法求解分布式电源选址定容问题并考虑环境因素研究【IEEE33节点】(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现
  • 考虑极端天气线路脆弱性的配电网分布式电源配置优化模型【IEEE33节点】(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现
  • 【计算机毕业设计】病房管理系统

    当下 如果还依然使用纸质文档来记录并且管理相关信息 可能会出现很多问题 比如原始文件的丢失 因为采用纸质文档 很容易受潮或者怕火 不容易备份 需要花费大量的人员和资金来管理用纸质文档存储的信息 最重要的是数据出现问题寻找起来很麻烦 并且修改
  • Navicat 16 for MySQL:打造高效数据库开发管理工具

    随着数据的快速增长和复杂性的提升 数据库成为了现代应用开发中不可或缺的一部分 而在MySQL数据库领域 Navicat 16 for MySQL作为一款强大的数据库开发管理工具 正受到越来越多开发者的青睐 Navicat 16 for My
  • 【计算机毕业设计】航空信息管理系统

    传统信息的管理大部分依赖于管理人员的手工登记与管理 然而 随着近些年信息技术的迅猛发展 让许多比较老套的信息管理模式进行了更新迭代 飞机票信息因为其管理内容繁杂 管理数量繁多导致手工进行处理不能满足广大用户的需求 因此就应运而生出相应的航空
  • 【计算机毕业设计】学生就业管理系统

    如今社会上各行各业 都喜欢用自己行业的专属软件工作 互联网发展到这个时候 人们已经发现离不开了互联网 新技术的产生 往往能解决一些老技术的弊端问题 因为传统学生就业信息管理难度大 容错率低 管理人员处理数据费工费时 所以专门为解决这个难题开
  • APP端网络测试与弱网模拟

    当前APP网络环境比较复杂 网络制式有2G 3G 4G网络 还有越来越多的公共Wi Fi 不同的网络环境和网络制式的差异 都会对用户使用app造成一定影响 另外 当前app使用场景多变 如进地铁 上公交 进电梯等 使得弱网测试显得尤为重要
  • 电商数据api接口商品评论接口接入代码演示案例

    电商数据API接口商品评论 接口接入入口 提高用户体验 通过获取用户对商品的评论 商家可以了解用户对商品的满意度和需求 从而优化商品和服务 提高用户体验 提升销售业绩 用户在购买商品前通常会查看其他用户的评论 以了解商品的实际效果和质量 商
  • 深入了解 Python MongoDB 查询:find 和 find_one 方法完全解析

    在 MongoDB 中 我们使用 find 和 find one 方法来在集合中查找数据 就像在MySQL数据库中使用 SELECT 语句来在表中查找数据一样 查找单个文档 要从MongoDB的集合中选择数据 我们可以使用 find one
  • 【计算机毕业设计】电商个性化推荐系统

    伴随着我国社会的发展 人民生活质量日益提高 于是对电商个性化推荐进行规范而严格是十分有必要的 所以许许多多的信息管理系统应运而生 此时单靠人力应对这些事务就显得有些力不从心了 所以本论文将设计一套电商个性化推荐系统 帮助商家进行商品信息 在
  • 【计算机毕业设计】北工国际健身俱乐部

    本系统为会员而设计制作北工国际健身俱乐部 旨在实现北工国际健身俱乐部智能化 现代化管理 本北工国际健身俱乐部管理自动化系统的开发和研制的最终目的是将北工国际健身俱乐部的运作模式从手工记录数据转变为网络信息查询管理 从而为现代管理人员的使用提
  • 【计算机毕业设计】趵突泉景区的智慧导游小程序_5ztvv

    当今社会已经步入了科学技术进步和经济社会快速发展的新时期 国际信息和学术交流也不断加强 计算机技术对经济社会发展和人民生活改善的影响也日益突出 人类的生存和思考方式也产生了变化 传统趵突泉景区的智慧导游采取了人工的管理方法 但这种管理方法存
  • 面试官问,如何在十亿级别用户中检查用户名是否存在?

    面试官问 如何在十亿级别用户中检查用户名是否存在 前言 不知道大家有没有留意过 在使用一些app注册的时候 提示你用户名已经被占用了 需要更换一个 这是如何实现的呢 你可能想这不是很简单吗 去数据库里查一下有没有不就行了吗 那么假如用户数量
  • 毕业设计:基于python人脸识别系统 LBPH算法 sqlite数据库 (源码)✅

    博主介绍 全网粉丝10W 前互联网大厂软件研发 集结硕博英豪成立工作室 专注于计算机相关专业 毕业设计 项目实战6年之久 选择我们就是选择放心 选择安心毕业 感兴趣的可以先收藏起来 点赞 关注不迷路 毕业设计 2023 2024年计算机毕业
  • 温室气体排放更敏感的模型(即更高的平衡气候敏感性(ECS))在数年到数十年时间尺度上也具有更高的温度变化(Python代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Python代码 数据
  • SpringCloud Config分布式配置中心

    文章目录 代码地址 简介 与GitHub整合配置 项目整合 测试 Config客户端配置与测试 测试 Config客户端之动态刷新 测试

随机推荐