一个系统在用户多,高并发的情况下,数据库该如何设计
高并发的情况下,对于系统各个方面都有一定的要求,单从数据库层面主要有以下几点:
1、读写分离
高并发的场景读写分离是第一要做的。一般的系统都是读的频率要远远大于写的频率。所以我们将读写分开,从库读,主库写,一主多从,根据qps和iops大小再进行扩容调整。
2、分库分表
分库分表的目的在于降低单个表的数据量,提升查询效率。主要有横向拆分和纵向拆分。横向就是把一张表的数据分到不同的库或表,每张表的数据结构一样。纵向就是把一张宽表拆分成小表。例如,一张表有50个字段,可以将常用的字段放到一张表,不常用的放到另一张表。
3、索引
索引是必须要的。针对查询条的不同,建立相关索引,可以极大的提升查询效率。
最后,我们加入缓存、优化sql、优化业务逻辑,目的就是尽可能的减少操作数据库的次数,降低iops。
数据库建立多表关联,关键业务数据字段和查询字段建立索引,对唯一性建立好,同时多任务并发时程序设计时注意数据的合理性检验和用户处理数据有问题时的友好提示见面,建立好的结构文档说明,同时对关键字段的关系型作好记录,有效地设计多表的结构安排,尽量减少数据的冗余,同时又要避免对历史数据的影响,保持良好的数据管理
在多用户,高并发的业务场景下,传统关系型数据库i/o往往成为系统瓶颈,如上面几位的回答,这种情况下首先应该考虑减少对数据库的直接访问,常见的方法有使用缓存(包括客户端缓存,前端缓存以及服务器缓存,和CDN等),使用消息队列异步化数据库读写进行削峰等。其次我们应该优化对数据库的访问,使数据库能承受更高的qps,主要方法有优化重写查询语句,数据库读写分离,分表分库,以及对非事务型访问考虑使用nosql等。
简述系统总体设计的一般步骤
根据系统设计的总体目标,在特定环境条件下,运用一定 的原理和方法,确定一个合乎需要的系统的技术过 程。系统设计应考虑系统功能、系统的输入、系统的 输出、系统结构、系统环境和系统条件等方面的问 题。
设计的一般步骤是:
①确定系统功能和总目标;
②收集原始资料、约束条件和技术、经济、社会、环境 等方面的可靠信息;
③提出供选择的可行方案;
④对 备选方案进行评价和选择,确定设计方案;
⑤按系统 的层次结构进行详细设计;
⑥优化设计系统;
⑦对新 系统进行模拟试验和调整;
⑧联接各子系统,构成完 整的系统;
⑨对新系统的性能、成果进行测定和评 价。
Scenario 场景
这是每个系统设计的第一步,搞清楚我们的系统场景,为什么服务。我们的业务场景是什么样子的,都有哪些角色,怎么个流程?其实在这一阶段就是列出系统需要实现的功能有哪些。
接着我们把功能根据优先级和核心功能进行排序。比较互联网很快,我们先搞一个Version1.0上去,再来优化。
Needs 需求
很多人被这个中文翻译搞懵逼了,你不是在第一阶段就讲过需求吗?这里的needs是说咱们系统设计出来要满足什么样的用户量,需要咱们设计一个多么吊&牛X的系统。最好这个时候能拿出纸和笔来计算一下,咱们的DAU、并发量、QPS、TPS、峰值。Pls,remember:我们需要的是一个合适的系统,绝对不是一个可以满足100年都可用的巨牛逼的系统。
Application 应用
这一阶段,我们要做的是将我们的功能进行划分,分组成不同的模块。这样后边我们就可以团队分工开发,团队协作。
接着我们需要考虑的是关键的一些算法。比如缓存算法、分库算法等。
Service + Algorithm
Kilobyte 数据
关系型数据库SQL Database
小调查:Twitter的哪些信息适合放在关系型数据库中?
用户信息 User Table
非关系型数据库 NoSQL Database
小调查:Twitter的哪些信息适合放在非关系型数据库中?
推文 Tweets
社交图谱Social Graph(followers)
文件系统File System
小调查:Twitter的哪些信息适合放在文件系统中?
图片、视频Media Files
讲到这个地方其实我想总结一句:
程序 = 算法 + 数据结构
系统 = 服务 + 数据存储
Evolve 改进
这个阶段就是做优化和维护工作了,我们最好根据实际的需要去优化系统,满足系统不远将来的增长。选择一个最合适的方案而不是一个最好的方案。
还没有评论,来说两句吧...