数据库架构演变概要

一.背景

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

二.现状

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

【数据量大】数据库目前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,一经查实,立即删除!

相关文章

jzoj3189-解密【字符串hash】

正题 题目大意 一个句子有多个单词。 给出了一个加密了的串。加密方法是将不同的单词转换成不同的单词。然后再给一个加密前的串,求再加密串中可能出现的最早位置。 解题思路 设aia_iai​表示与iii相同的前一个字母的位置。 然后根据题目意思对与两个串如果aaa序列…

面试请不要再问我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项目中进行…

Spring Boot 多数据源(读写分离)入门

转载自 芋道 Spring Boot 多数据源(读写分离)入门 1. 概述 在项目中,我们可能会碰到需要多数据源的场景。例如说: 读写分离:数据库主节点压力比较大,需要增加从节点提供读操作,以减少压力。 …

欢乐纪中A组周六赛【2019.3.30】

前言 做A组被虐好惨 成绩 RankRankRank是有算别人的 RankRankRankPersonPersonPersonScoreScoreScoreAAABBBCCC1010102017ZYC2017ZYC2017ZYC1141141142424244040405050501313132017XXY2017XXY2017XXY1001001000001001001000001818182017HJQ2017HJQ2017HJQ95959500095959500022…

参加双车项目的一些感触

已经十月尾旬了,再过两天就是11月份了,这个月我过的很不好,或者说很煎熬吧!!! 国庆节之后就一直参加一个双车的项目,由于我对硬件算是一窍不通,学这个很吃力,相比于另一…

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

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

P2101-命运石之门的选择【dp,离散化】

前言 我切掉这道题是命运石之门的选择 正题 题目链接:https://www.luogu.org/problemnew/show/P2101 题目大意 nnn个连在一起的高度hih_ihi​盒子。一个刷子只能直着刷而且得连续都得刷。求至少刷多少次。 解题思路 fi,jf_{i,j}fi,j​表示前iii个已经刷完了,上一个…

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

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

laravel关闭crsf

在中间件VerifyCsrfToken.php 加入 自己想要关闭的crsf protected $except [user/*,article/*,article,api/*,];

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

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

nssl1167-桐人的约会【最短路】

正题 题目大意 去掉一条边使得最短路最长。 解题思路 这条边一定在最短路上而最短路最多只有n−1n-1n−1条边&#xff0c;所以直接枚举最短路上的边。复杂度O(nmK)O(nmK)O(nmK) codecodecode #include<cstdio> #include<algorithm> #include<queue> #incl…

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

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

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

环境要求&#xff1a; wampcomposer 创建laravel项目&#xff1a; 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博客&#xff1a;https://www.hanselman.com/blog/WritingSmarterCrossplatformNETCoreAppsWithTheAPIAnalyzerAndWindowsCompatibilityPack.aspx正文&#xff1a;这是最近这几周你应该知道的一对.Net Core界的优秀工具。我们在编写或者移植跨平台代码…

P4562-[JXOI2018]游戏【数论,组合数学】

正题 题目链接:https://www.luogu.org/problemnew/show/P4562 题目大意 l∼rl\sim rl∼r的变化&#xff0c;每次访问第iii个那么iii的倍数就不用访问了。对于一个顺序sss&#xff0c;定义t(s)t(s)t(s)表示按这个顺序访问玩前t(s)t(s)t(s)个就都不用访问了。求所有顺序的t(s)t(…

Redis RDB文件格式全解析

转载自 Redis RDB文件格式全解析 点评 这篇文章作为对RDB理解的教程文章&#xff0c;对RDB文件的原理理解有助于进行Redis高阶应用的设计与开发。 文章转自&#xff1a;http://blog.nosqlfan.com/html/3734.html 作者&#xff1a;nosqlfan RDB文件是Redis持久化的一种方式…

实验进行中:.NET WebAssembly支持

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

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

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