如果各位看官的 SQL 数据库真有 2W+ 高并发,那真是要恭喜你。你已经比很多公司的 MIS 都要前卫得多。2W 和 2K 差别有那么大吗,嗯,真是有的。2K 并发的 MIS 系统也经常有无法访问,timeout 的异常,处理这些异常已经够很多朋友苦恼的了。2W+ 的并发那需要懂的知识框架就更复杂了。

笔者曾服务了 500W+ 用户的电商系统,7*24 小时的噩梦再也不想见

前几年在一家拥有 500 多万直销顾问的团队做电商平台。平时的流量很平稳,基本都在千把,月底拼业绩才会冲一冲,来个 1W+ 的并发。大部分的数据库开发人员在日常中还是没心没肺没压力的。但电商系统有个惯例,都是淘宝带出来的,会搞促销,类似于双 11. 一到这时间段,必须随时警惕流量是不是井喷,一旦跨越红线,系统就跟前期的 12306 一样,频频延迟。随着 DBA 组的介入,才慢慢搞定这难题。本文的初衷也来自于这段经历的总结。

单实例数据库应用

这种应用架构最简单,UI + 应用服务器 + 数据库服务器,所有的请求,无论读写都直接抛给数据库。往往项目初期,为了迅速的证明自己的点子靠谱,拿到市场,我们会选择这样的架构来实现产品。此时往往 10 万用户注册了,但每天访问的人数刚过 200, 每张数据库表的总数,最大也不会超过 5000 条。这样的应用,开发能力强的,1 个人就可以搞定,业务复杂的需要分前端和后端。但无论如何都属于基础项目,如果你工作 3,4 了还是停留在这种模式下,那该补补课了。

事物总是在发展之中的,只要系统正常运行,总有一天用户量会加大,随之而来的请求会超乎你的想象(前提你是做了 pv, uv 的数据分析),很快这种架构会遇到用户超过 100 万,日访问量超过 20 万,峰值并发 2 万,而数据库的表会趋近于亿级的量。此时应用系统如果还是建立在当初的硬件基础上(比如 16GB,16 核,240GB 硬盘)应该会明显感觉得到拖卡慢的尴尬,增多的是用户的抱怨和投诉。就像 12306 前期的购票一样,往往轮到你的时候,票没了。

多实例数据库

遇到流量起来的应用,如果压力确定是在数据库上了,那么分库是必然的事情了。将一个大库拆成若干小库,保持数据库对象都一致,这样每个小库分摊掉一部分流量,应用终将回归第一种简单架构上来,将用户服务好。以现在的硬件服务 4000 个并发,对于不复杂的商用没有问题。具体能负责多少看系统上线后的 baseline (基线)监测,这里我们假定 4000 并发。所以分成 5 个相同的库,来做分库。这样同时写入 4000 并发够用。

这里会遇到一个技术细节,就是分库路由。如何将流量均摊到每个库里,是需要研制算法的。比如已知全国用户分布均衡,即华东、华北、华西、华南和华中,各有 4000 用户。我们依据地理位置分成 5 个库,根据用户身份证哈希成 5 个散列值,分别对应了这 5 台数据库,用户就被分流了。

只要用户不是剧烈增长,老板也满意这种小而美的生意,这样的架构可以一直沿用下去。基本不会有瓶颈。顶多就是时间长了,表数据越来越大了,我们用分库的思想进行分表就可以了。当前年份(月份)数据放在主表里面,而历史数据就归档到聚合表里;或者索性每月,每年分成子表存储,而跨时间段的查询用视图来控制。

但用户的行为始终是不可控的,我么必须做一系列的事情来满足和留住用户。比如促销、打折、团购等等。这个时候,用户的行为不仅仅是下个单买杯咖啡这么简单了。他们会大量查询他们的数据,带来的是读请求远远大于写入请求。众所周知,读请求即使不影响写入请求(比如 MVVC),但也会耗尽服务器的 CPU\IO\Network 资源。那么我们必须更进入一层,读写分离。

读写分离

读写分离是另一种分库,但与前面的分库意图不一样。分出来的库和源库一模一样,且只读不接收用户的写入请求。实现细节每个数据库都不一样,也可以使用实时同步工具做,详情可以参考《Designing Data-Intensive Applications》这本书。不仅仅给出了指导思想,更有每种数据库的读写分离组件指南。

猜你喜欢:

SQL 人要敢于说不

BI, 数据仓库,ETL, 数据开发,有什么区别?

如何写好上千行的 SQL 存储过程(附代码规范)

听说你们的数据库并发 2 万就跪了?相关推荐

  1. 数据库 并发更新之乐观锁和悲观锁

    文章目录 1. 问题引出 2. 数据库悲观锁解决并发更新 3. 数据库乐观锁解决并发更新 4. 乐观锁 CAS 的 ABA 问题 5. 拓展思考 5.1. 悲观锁和排他锁.乐观锁和 CAS 分别有什么 ...

  2. 订单系统开发(仿淘宝和美团网) 之 项目总结(降低数据库并发量)

    原文:订单系统开发(仿淘宝和美团网) 之 项目总结(降低数据库并发量) 继上一篇"订单系统开发(仿淘宝和美团网) 之 项目总结(一)",这篇博客重点想说下订单系统开发的设计和有待优 ...

  3. 云计算之路-阿里云上:数据库连接数过万的真相,从阿里云RDS到微软.NET Core

    在昨天的博文中,我们坚持认为数据库连接数过万是阿里云RDS的问题,但后来阿里云提供了当时的数据库连接情况,让我们动摇了自己的想法. 帐户 连接数 A 4077 B 3995 C 741 D 698 E ...

  4. C# 数据库并发的解决方案(通用版、EF版)

    C# 数据库并发的解决方案(通用版.EF版) 参考文章: (1)C# 数据库并发的解决方案(通用版.EF版) (2)https://www.cnblogs.com/BluceLee/p/1061939 ...

  5. 乐观锁 与 悲观锁 来解决数据库并发问题

    乐观锁 与 悲观锁 来解决数据库并发问题 参考文章: (1)乐观锁 与 悲观锁 来解决数据库并发问题 (2)https://www.cnblogs.com/xudong-bupt/p/8614997. ...

  6. 【眼见为实】数据库并发问题 封锁协议 隔离级别

    目录 序 数据库并发的几大类问题 ①丢失修改(Lost Update) ②不可重复读(Non-Repeatable Read) ③幻读(Phantom Read) ④读脏数据(Dirty Read) ...

  7. 数据库并发问题和事务隔离界别

    数据库并发问题和事务隔离界别 一.数据库的并发问题 1. 脏读 2. 不可重复读 3. 幻读 二.事务隔离界别 1. Read Uncommited:读未提交的数据 2. Read Commit:读已 ...

  8. 数据库并发事务存在的问题(脏读、不可重复读、幻读等)

    一个数据库可能拥有多个访问客户端,这些客户端并发访问数据库时,若没有采取必要的隔离措施,存在以下问题,这些问题分为5类,包括3类数据读问题:脏读.不可重复读和幻读.两类数据更新问题:第一类丢失更新.第 ...

  9. 数据库并发机制和事务的隔离级别详解

    (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/64444896冷血之心的博客) 本文将从以下4个方面来展开: (1) ...

最新文章

  1. 如何为Keras中的深度学习模型建立Checkpoint
  2. 全面理解Javascript闭包和闭包的几种写法及用途
  3. 一种简易实现磁悬浮吊坠方案
  4. html frame 菜单切换,官方底部导航如何通过frame0.html的JS控制切换
  5. python数据结构视频百度云盘_数据结构与算法Python视频领课
  6. ASP.NET Web API中的Controller
  7. 两个人投票的c语言程序,设计网页投票器(二)《精通Unix下C语言编程与项目实践》之十...
  8. IO_ADDRESS()的实现【转】
  9. android studio 新建工程慢,关于AndroidStudio新建与编译项目速度慢解决办法
  10. 1.3Python快速入门
  11. 【Deep Learning 三】神经网络中的非线性激活函数之间的优缺点:sigmoid、tanh、ReLu、Leaky ReLu...
  12. AC自动机(Aho-Corasick automation)(转)
  13. Kafka 几个实现细节
  14. 51单片机初学3-从零开始制作一款电子时钟
  15. 雅虎前端性能优化的35条军规
  16. 宝可梦火红存档修改器
  17. 使用Druid SQL Parser解析SQL
  18. matlab绘制那奎斯特曲线和bode图
  19. 欧氏空间距离和内积_欧式空间、内积空间和赋范空间之间的关系
  20. Oracle数据库Blob字段存储文本文件

热门文章

  1. 发明或者实用新型的独立权利要求怎样撰写
  2. 极差标准化方法因子分析综合得分
  3. php+firebird,Firebird/InterBase
  4. uva 11300
  5. SQL Server On Linux(3)——SQL Server 2019 For Linux 下载并部署示例数据库
  6. Jakarta Commons Logging(JCL)开发手记
  7. 【Golang入门】二、Go语言快速开发
  8. 软件安全漏洞挖掘:Buffer_Overflow
  9. 用几行python代码获取Yahoo,tushare股票数据,超级爽!!(比爬网好太多)
  10. Android 混淆那些事儿