数据库架构演变概要

一.背景

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

二.现状

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

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

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

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

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

三.架构升级方案概要

数据库架构演变顺序:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

四.架构简单示意图

原文: http://www.cnblogs.com/chejiangyi/p/8022569.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/322619.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面试请不要再问我Spring Cloud底层原理

转载自 面试请不要再问我Spring Cloud底层原理 概述 毫无疑问,Spring Cloud是目前微服务架构领域的翘楚,无数的书籍博客都在讲解这个技术。不过大多数讲解还停留在对Spring Cloud功能使用的层面,其底层的很多原理,很多人可能并…

nginx配置前端反向代理

本地这里有两个端口: 8080:前端页面 80:后端接口 在nginx配置 listen 8888;server_name 127.0.0.1;location / {root html;proxy_pass http://127.0.0.1:8080;# try_files $uri $uri/ /index.php$is_args$args;index index.html…

Visual Studio 2017的第五个更新包扩展了调试工具

Visual Studio 2017近日收到了最新的完整更新包,版本号为15.5。跟随前几次更新的步伐,这次发布提供了一系列几乎会让所有用户从中受益的特性。此次发布的一个重点是IDE的性能,尤其是减少C#/Visual Basic项目的加载时间。在.NET Core项目中进行…

深港澳大湾区第三次.NET技术交流会圆满成功

2017年12月10日,一场以云、devops、微服务、容器是现在这个发展阶段的软件形态, 本次活动我们围绕这些话题介绍.NET生态下的发展本地社区活动,这次活动还得到如鹏网杨中科老师的大力支持开通网上直播,网上有229位参与活动&#xf…

基于消息中间件RabbitMQ实现简单的RPC服务

转载自 基于消息中间件RabbitMQ实现简单的RPC服务 RPC(Remote Procedure Call,远程过程调用),是一种计算机通信协议。对于两台机器而言,就是A服务器上的应用程序调用B服务器上的函数或者方法,由于不在同一个内存空间或机器上运行&#xff0c…

开源纯C#工控网关+组态软件(七)数据采集与归档

一、 引子在当前自动化、信息化、智能化的时代背景下,数据的作用日渐凸显。而工业发展到如今,科技含量和自动化水平均显著提高,但对数据的采集、利用才开始起步。对工业企业而言,数据采集日益受到重视,主要应用场景包…

实践出真知之Spring Cloud之基于Eureka、Ribbon、Feign的真实案例

转载自 实践出真知之Spring Cloud之基于Eureka、Ribbon、Feign的真实案例 Eureka是Spring Cloud Eureka的简称,是Netflix提供的组件之一。通过Eureka可以提供服务注册、发现、负载均衡、降级、熔断等功能。本篇主要介绍Eureka作为服务注册中心,以及实现…

从零开发一个laravel项目的增删改查、详情

环境要求: wampcomposer 创建laravel项目: composer create-project --prefer-dist laravel/laravel person快速完成person注册登录开发 1、migration php artisan make:migration create_people_table$table->increments(id);$table->string…

使用Api分析器与Windows兼容包来编写智能的跨平台.NET Core应用

本文翻译自Scott Hanselman博客:https://www.hanselman.com/blog/WritingSmarterCrossplatformNETCoreAppsWithTheAPIAnalyzerAndWindowsCompatibilityPack.aspx正文:这是最近这几周你应该知道的一对.Net Core界的优秀工具。我们在编写或者移植跨平台代码…

实验进行中:.NET WebAssembly支持

目前四大主流浏览器都默认支持WebAssembly,而.NET社区也在继续推动为.NET开发者提供相关能力,来将他们的代码编译成WebAssembly,然后在浏览器上运行。WebAssembly是一种二进制web格式,旨在以接近原生的性能运行不是用JavaScript语…

Js对象如何添加方法、查看Api

js万物皆对象,要带着观察对象的眼观去看待每一个函数、变量。 为什么要用到原型? Es6以前,js中没有如ooa编程当中的class,但是要用到类,怎么办呢,构造函数就应运而生,但是构造函数里面添加方法…

微软人工智能和对话平台--知识商城体验

前言微软最新发布 知识商城了!这是一个人工智能和对话平台应用的场景。他可以让开发者带着想法 出做天马行空的创造性工作!你只需要稍微动动手,如:拖拽板块,就可以做到极致对答、代码自动生成!想象一下&…

Spring @Import注解配置类方法内部调用没有注入属性值的坑

一、场景复现 application.yaml spring:application:name: config-testprofiles:active: devconfig:config-01:name: zhansancode: 001config-02:name: lisicode: 002导入配置类 Configuration Import(ImportConfig.class) public class Config {BeanConfigurationPropertie…

使用Xamarin开发手机聊天程序 -- 基础篇(大量图文讲解 step by step,附源码下载)

如果是.NET开发人员,想学习手机应用开发(Android和iOS),Xamarin 无疑是最好的选择,编写一次,即可发布到Android和iOS平台,真是利器中的利器啊!而且,Xamarin已经被微软收购…

Spring Boot 数据库连接池入门

转载自 芋道 Spring Boot 数据库连接池入门 本文在提供完整代码示例,可见 https://github.com/YunaiV/SpringBoot-Labs 的 lab-19 目录。 原创不易,给点个 Star 嘿,一起冲鸭! 1. 概述 在我们的项目中,数据库连接池基…

.net core 实现简单爬虫—抓取博客园的博文列表

一.介绍一个Http请求框架HttpCode.CoreHttpCode.Core 源自于HttpCode(传送门),不同的是 HttpCode.Core是基于.net standard 2.0实现的,移除了HttpCode与windows相耦合的api,且修改了异步实现,其余特性完全与…

SpringBoot2.1.9 Mybatis由于@Mapper注解多数据源配置不生效问题

一、场景复现 (1)项目 目录 配置文件 spring:application:name: multi-datasourceprofiles:active: dev1datasource:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/base?…

使用Windows兼容包简化向.NET Core的迁移

从.NET迁移到.NET Core的一个主要原因,在于后者具备在Linux上运行的能力。但是对于大型企业应用,不可能实现一步迁移到位。由此,Microsoft推荐采用一种逐步迁移做法:第一步,迁移到ASP.NET Core(依然使用.NE…

springboot使用xml配置mybatis

前面用注解配置了mybatis&#xff0c;非常的简单&#xff0c;但是在写动态sql语句的时候会非常的麻烦&#xff0c;所以这边我们用xml来重新配置一下 在resource目录下新建 SqlMapConfig.xml 主配置文件 <?xml version"1.0" encoding"UTF-8" ?> &…

SpringBoot2.1.9 Mybatis多数据源配置

一、配置文件 目录 application.yaml spring:application:name: multi-datasourceprofiles:active: devdatasource:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/base?autoReconnecttrue&ze…