数据库架构演变概要

一. 背景

为了适应业务增长,数据库数据量快速增长,性能日趋下降,稳定性不佳的实际情况,急需架构逐步演变适应未来的业务发展。

二. 现状

【稳定性】数据库为单点,没有高可用和稳定性方案。

【数据量大】数据库目前400G 左右,每个月大约100G 的增量;

单表数据只增不删,数据持续增长;

【业务优化,剥离难】业务比较复杂,单纯的业务梳理剥离和优化,涉及业务方沟通及方案确立周期太长;

【查询慢】单机性能已出现过cpu 瓶颈导致响应缓慢,大量的慢查询。

三. 架构升级方案概要

数据库架构演变顺序:

1) 大表表级拆分多表方案 【风险:中 效果:不会特别明显】

优点:通过拆分大表,拆分冷热数据,从而减少单表的数据扫描,进而优化数据库性能。

缺点:只能缓解大表的数据增量,但是不能彻底解决快速增长数据的本质问题。以目前的业务增量,即便做了冷热数据分离,也最多多支持几个月时间。

总结:只能缓解增量的症状[避免全表扫描的不必要的数据筛选],但不能解决本质问题。

2) UUID 转int 方案 【风险: 高 效果:应该比较明显

优点:保守估计性能大约有6 倍左右的提升(连表操作),索引及内存存储量降低为原来的1/4 左右,表大小,数据库大小都会有相应的减少。

缺点:现有的数据库太大约400g ,整体迁移过程和步骤相对非常复杂,需要自行通过编码实现迁移,难度很高。

总结:在cpu 运算上和内存上会有明显优化,但是解决不了数据量(磁盘)本质问题。

3) 用户维度拆分方案 【风险: 高 效果:最好

优点:通过用户维度拆分多个用户库和主库(这里的主库不一定是一个库,也可以是垂直拆分的多库),从而分散数据量,增加多个表和库锁的粒度,数据库的连接池,硬件资源等;用户维度性能提升n 倍,主库可以通过读写分离提升性能;足够业务n 年的数据发展和平滑扩展。

缺点:拆分多库,可用性和服务器稳定性下降(但是理论上出问题仅影响部分用户,可以保证总体可用性不会降低)。后期维护索引和更新,运维工作量加大多倍。业务代码基本大部分稍微调整(需要选择分库),部分业务代码需要分布式事务支持(基本现有代码的所有一致性事务需要调整)。

总结:全维度(cpu ,内存,磁盘)优化数据库,较彻底解决数据库平行扩展和性能问题(除主库外)。相应的业务运维和运营的工作量加大和调整,但外围业务用户基本无感知架构变化。

4) 业务降低事务化方案 【风险:中,效果:高并发下面效果好】

优点:通过降低事务等级,减少读共享锁,避免部分业务更新操作的阻塞;从而提升并发处理的性能(类似java 读写锁原理,现在让数据库读不加锁或者部分加锁)。

缺点:部分数据会出现脏读(但是用户基本无感知)(资金财务相关的不得降低事务等级),但去锁并不会加快单条数据查询的速度。业务代码基本大部分需要根据业务场景,进行细粒度的事务等级控制(原则上一些查询校验,能不用事务就不用事务;大块事务尽量拆开多个事务;能通过Tcc 或者最终一致性的业务幂等解决就不用强事务)(类似java 方法级的锁,修改成方法内的多条代码级锁,减少锁粒度,保证尽快释放事务和锁)。

总结:有效的降低锁竞争导致的阻塞问题,能够有效提升业务高并发下面的总体并发能力,但是对无高并发下面的单笔业务处理耗时不会有明显提升,同时业务代码改动和梳理时间略费时间,但可根据情况自行取舍。mysql 和sqlserver 事务锁处理可能略有不同,但是总体降低事务等级思路不变。

5) 数据库读写分离方案 【风险:中 效果:比较好】

优点:基于用户维度拆分后,特别是针对主库进行读写分离(根据用户维度读指定的读库);将一些报表性查询,根据业务的实际情况选择读库或者写库(再加上低事务等级),极大的提升数据库的性能(主库中一些全局的配置可以做读写分离,用户维度考虑硬件层面读备热切换和读写分离)。

缺点:需要代码级别支持读库宕机,移除节点,平滑故障(需要分库分表中间件支持配置中心和数据库故障检测信息打通,自动故障转移)。要梳理业务逻辑,使一部分业务代码的查询切换到读库。

总结:读写分离主要解决用户维度拆分后,主库的读压力(也可以部分分布式缓存解决)和稳定性。从二八理论上讲,能分担大部分的性能到从库,但是从库会有数据延迟的可能性,故在业务读写分离处理时需考虑。

6) 绝对低耦合(独立性)服务数据库垂直拆分 【风险:中 效果:未知】

优点:低耦合的服务化数据库拆分成独立服务或者功能,此服务化数据库又可以按照多维和技术特性进行更细粒度的服务化拆分和高性能,可以提供服务复用性和独立稳定性规划。进一步降低业务数据量,提高业务的纯性能。(一般独立服务拆分有个特点:要么是共性业务,要么不带业务属性的功能,而且这种服务数据量不少或稳定性要求极高)

缺点:未来业务确保不会出现耦合度粘性的发展,细粒度服务会更多,但是开发稳定后一般不会更改。

总结:只拆绝对低耦合的业务为服务(如没把握,宁可不拆)

四.架构简单示意图

by 车江毅

Original: https://www.cnblogs.com/chejiangyi/p/8022569.html
Author: 车江毅
Title: 数据库架构演变概要

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/710995/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 混沌工程之混沌测试平台

    https://www.jianshu.com/p/4bd4f88e24e4 一款用于测试kubernetes环境的工具。通过人为地在集群中注入故障来检测集群对故障的处理以及恢复能…

    技术杂谈 2023年5月31日
    099
  • Codeforces1514B

    问题描述 给你两个数n,k,问可以构造多少n个最大位数为k数按位与为0并且这n个数加起来最大的合法序列,答案对1e9 + 7取模。 思路分析 首先我们考虑这n个数按位与以后为0这个…

    技术杂谈 2023年7月24日
    079
  • lightdb修改用户密码

    zjh@postgres=# alter user zjh password ‘123456’;ALTER ROLE Original: https://w…

    技术杂谈 2023年6月1日
    097
  • CSRF攻击:陌生链接不要随便点

    中我们讲到了 XSS 攻击,XSS 的攻击方式是黑客往用户的页面中注入恶意脚本,然后再通过恶意脚本将用户页面的数据上传到黑客的服务器上,最后黑客再利用这些数据进行一些恶意操作。XS…

    技术杂谈 2023年5月31日
    0108
  • Redis使用Swap,但系统可用内存充足

    最近生产环境遇到一个很奇怪的问题,系统内存32G,redis使用8G左右,剩余的内存都被系统cache使用,从表面上看系统可用内存有20G左右。但是系统运行过程中,redis时不时…

    技术杂谈 2023年7月11日
    0101
  • 日常白痴_Long类型的除法,保留两位小数

    背景提要 一直除法用的都是/,忘记了这个只能取到整数部分,需要小数的时候就不知道怎么办很基础的东西了,唉! 解决 首先需要获得小数部分,需要除数是Double类型,然后用 Deci…

    技术杂谈 2023年7月25日
    082
  • PyTorch 介绍 | TRANSFORMS

    数据并不总是满足机器学习算法所需的格式。我们使用 transform对数据进行一些操作,使得其能适用于训练。 所有的TorchVision数据集都有两个参数,用以接受包含trans…

    技术杂谈 2023年7月25日
    098
  • 让你的Nginx支持分布式追踪opentracing

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    技术杂谈 2023年7月25日
    099
  • docker官方仓库下载镜像

    官方仓库镜像地址:https://hub.docker.com/search/ 以下载mysql为例 进入到详情页后我们看到有很多Tags 我们选择5.7.25版本进行下载 doc…

    技术杂谈 2023年7月10日
    0105
  • 华为OPS,自定义命令,动态执行命令

    OPS API示例 命令行事件订阅 result1_value, result2_description = ops.cli.subscribe(tag, pattern, ent…

    技术杂谈 2023年7月25日
    099
  • Java — 反射

    程序在运行中也可以获取类的变量和方法信息,并通过获取到的信息来创建对象。程序不必再编译期就完成确定,在运行期仍然可以扩展。 示例:学生类 public class Student …

    技术杂谈 2023年7月11日
    079
  • 数字孪生万物可视 | 联接现实世界与数字空间

    摘要:在新型智慧城市建设中,数字孪生是关键。 一直备受欢迎的某沙盒类模拟城市建设游戏中,玩家以市长的身份亲自规划和建设整座城市,比如购买土地、新建商业区等。游戏画面中可以在远景中看…

    技术杂谈 2023年5月31日
    0112
  • playwright-自动化(二):过滑块验证码 验证码缺口识别

    前两天需要自动化登录一个商城的后台 用的是playwright 没有用selenium 中间出了一个滑块验证 现阶段playwright教程不是太多,自己做移动的时候各种找,费劲巴…

    技术杂谈 2023年7月11日
    085
  • 网站操作备忘

    ll /proc/1296892/fd/ 通过PID找到哪个文件操作的进程,进而知道问题所在 flash不能使用。安装Flash Player官方下载中心-Flash中国官网 ,在…

    技术杂谈 2023年5月31日
    0124
  • 拒绝蛮力,高效查看Linux日志文件!

    原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。 简介 日常分析问题时,会频繁地查看分析日志,但如果蛮力去查看日志,耗时费力还不一定有效果,因此我总结…

    技术杂谈 2023年7月25日
    0100
  • 到底为什么不建议使用SELECT*?

    “不要使用 SELECT *“几乎已经成为了MySQL使用的一条金科玉律,就连《阿里Java开发手册》也明确表示不得使用 *作为查询的字段列表,更是让这条规…

    技术杂谈 2023年7月23日
    0113
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球