System design summary
system design
https://github.com/donnemartin/system-design-primer
Performance vs scalability
scalability 这里面的伸缩性是指指标的。当系统有较高的负载时,每个用户仍然能够有较好的响应时,我们说他系统伸缩性强。
Performance 就是指一个请求的响应越快,自然说性能越高
如何才能让系统有更好的可伸缩性?
需要在系统设计初就提前考虑好系统设计,提前知道可能的问题点,性能点等等。
那么具体的系统设计如下:
Latency vs throughput
延时:单个请求的延时
吞吐量:单位时间内处理的请求量
Availability vs consistency
CAP理论:对于分布式系统,发生网络分区是一定要考虑的,因此在发生网络分区的情况下,对于C和A只能二选一。
当发生网络分区时,如果你允许用户操作,那么就会造成网络分区之间的数据不一致。
当发生网络分区时,如果你不允许用户操作,那么不同分区之间的数据不会因此而不一致,但这就不能保证可用性。
Consistency patterns
Weak consistency 通话视频,丢一些也没关系,最大限度保证通畅
Eventual consistency 可以忍受延时,保证最终一致性
Strong consistency 强一致性,比如Mysql 事务,事务执行后,第一次查询就要是最新的数据
Availability patterns
Fail-over : Active-passive 主从结构,当主节点挂掉后,从节点自动升级为主节点向外提供服务,比如redis哨兵,mysql主从。 Active-active 主主结构,集群中各个节点都向外提供服务,当某个节点挂机后,负载均衡器不将流量负载到宕机节点即可。比如一些分布式数据库,kafka集群等。
Availability in numbers
可靠性的一些指标,比如要达到几个9
99.9% availability - three 9s
Duration | Acceptable downtime |
---|---|
Downtime per year | 8h 45min 57s |
Downtime per month | 43m 49.7s |
Downtime per week | 10m 4.8s |
Downtime per day | 1m 26.4s |
99.99% availability - four 9s
Duration | Acceptable downtime |
---|---|
Downtime per year | 52min 35.7s |
Downtime per month | 4m 23s |
Downtime per week | 1m 5s |
Downtime per day | 8.6s |
一些常见的系统组件
DNS,用DNS做负载均衡的
CDN,某些云服务器厂商的CDN原理。我有一个域名keboom.site。然后我可以访问此域名拿到一些文件。在云厂商处配置keboom.site,他会返回给你一个类似 alicloud.keboom.site的域名,前端代码在请求资源时,使用 alicloud.keboom.site来获取资源。云厂商会将keboom.site 的资源缓存到他们的服务器上。前端程序将访问云厂商缓存的资源,这大概就是CDN原理。
负载均衡,平时我们说的有nginx,这其实是在application 层。对于负载均衡在网络协议中,layer 4 也是可以做的,我记得是有些硬件设备支持这种层次的协议。
数据库
关系式数据库,特点是他支持事务,关系型表结构。
一些讨论点: 主从:分主从的话,比如读写分离,那么就要有手段做读写分离 主主:数据冲突,事务性的破坏,需要控制访问哪个主
对于数据库主主,主从,共同的缺点:数据延时问题(主同步不及时,此时主挂机,则数据丢失),数据同步问题(同步数据,消耗性能) 联邦:国外是这么叫的,对于国内来说,他可能说叫根据业务进行数据切分。缺点:如果多数据库join就很麻烦。多数据库事务。
切片:数据做分区,切片。mysql是有partition功能的,可对数据做分区(但这只是mysql内部做的优化,如果数据量足够大,仅仅分区还是不够,可能还是要将数据分到多个数据库多个服务器,然后做hash)。当然有也人为的对表做切分,比如对表加后缀然后做hash,这样人为做切分。缺点很明显就是数据切分后,我们的查询逻辑变得复杂。
反规范:可以消除一些join,但带来一些冗余。
SQL优化:建表时:比如字段的选择,尽可能让表结构更小。SQL查询时,注意建立索引,并且能够使用到索引。慢查询排查等。
NoSQL
虽然一些NoSQL数据库声称自己支持事务,但是网络上并不太认同。
一般来说他们 可用性 > 一致性
key value:典型的redis等,作为分布式缓存使用。
doc:如MongoDB,文档型,数据结构更加灵活些,json类型的文档不必要每个字段都必须一致。如果你的数据结构层级较深,结构没有那么规整,那么可以考虑使用文档型
列式存储:大数据相关,HBase clickhouse等,特点是数据压缩效率高,支持大量的写入,大数据情形下表现好。比如日志存储,或者一些数据归档等,作为数据仓库等使用。
图形:社交关系
Cache
从头到尾,客户端缓存,CDN缓存,web sever缓存,application 缓存,分布式缓存,数据库缓存
cache pattern: 经典的redis 和 数据库的更新
查询时: cache aside:查询cache,如果cache没有,则从数据库中查询出来放到缓存中,然后返回。
缺点: 1.时间变长(查询缓存、更新数据库、更新缓存)2. 当数据库数据更新时,缓存中数据需要做过期或修改或删除等操作。3. 当缓存服务器重启,则所有缓存需要重新加载
更新时:
- 先更新数据库再跟新redis
- 先更新redis在更新数据库
以上两种方式都是有一定时间的数据不一致。
异步
消息队列—背压:生产者生产消息放到消息队列服务器的内存中,消费者进行消费时,直接从内存中读取。这样是效率最高的。如果队列中数据过多导致服务器内存不足,则消息势必存储到磁盘中。这时消费者再来进行消费,则需要先从磁盘中随机读,将数据加载到内存中,才能进行消费,这样速度就会慢。那么通过背压的方式,当内存满时,则同时生产者减慢或者暂停生产。
System design summary的更多相关文章
- File System Design Case Studies
SRC=http://www.cs.rutgers.edu/~pxk/416/notes/13-fs-studies.html Paul Krzyzanowski April 24, 2014 Int ...
- Stanford机器学习笔记-7. Machine Learning System Design
7 Machine Learning System Design Content 7 Machine Learning System Design 7.1 Prioritizing What to W ...
- Machine Learning - 第6周(Advice for Applying Machine Learning、Machine Learning System Design)
In Week 6, you will be learning about systematically improving your learning algorithm. The videos f ...
- Microchip 125 kHz RFID System Design Guide
Passive RFID Basics - AN680 INTRODUCTION Radio Frequency Identification (RFID) systems use radio fre ...
- 【线性结构上的动态规划】UVa 11400 - Lighting System Design
Problem F Lighting System Design Input: Standard Input Output: Standard Output You are given the tas ...
- Machine Learning - XI. Machine Learning System Design机器学习系统的设计(Week 6)
http://blog.csdn.net/pipisorry/article/details/44119187 机器学习Machine Learning - Andrew NG courses学习笔记 ...
- 【系统设计】论文总结之:Butler W. Lampson. Hints for computer system design
Butler W. Lampson. Hints for computer system design. ACM Operating Systems Rev. 15, 5 (Oct. 1983), p ...
- UVA11400-Lighting System Design(动态规划基础)
Problem UVA11400-Lighting System Design Accept: 654 Submit: 4654Time Limit: 3000 mSec Problem Descr ...
- Qsys 设计流程---Qsys System Design Tutorial
Qsys 设计流程 ---Qsys System Design Tutorial 1.Avalon-MM Pipeline Bridge Avalon-MM Pipeline Bridge在slave ...
- 【原】Coursera—Andrew Ng机器学习—课程笔记 Lecture 11—Machine Learning System Design 机器学习系统设计
Lecture 11—Machine Learning System Design 11.1 垃圾邮件分类 本章中用一个实际例子: 垃圾邮件Spam的分类 来描述机器学习系统设计方法.首先来看两封邮件 ...
随机推荐
- NC20139 [JLOI2014]松鼠的新家
题目链接 题目 题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在"树& ...
- Centos7的KVM安装配置详解
KVM和虚拟化 虚拟化有几种类型: 完全虚拟化(Full virtualization), 虚机使用原始版本的操作系统, 直接与CPU通信, 是速度最快的虚拟化. 半虚拟化(Paravirtualiz ...
- virtualbox中给redhat安装增强功能
关于虚拟机中安装redhat请参考其他教程: 1.点击虚拟机菜单:设备--安装增强功能.... 2.ssh连接到redhat,执行以下操作: [root@rhel-server ~]# mount / ...
- Golang从入门到跑路-从基础到微服务学习路线图
收录的awesome-go项目,学习基础系列,go项目实战,go源码分析,go开发者成长路线图等等,把他们收集起来学习. 地址:https://github.com/jiujuan/go-collec ...
- ADVMP 三代壳(vmp加固)原理分析(执行流程)
由于在加壳时插入了System.loadLibrary("advmp");,看一下JNI_OnLoad JNIEXPORT jint JNICALL JNI_OnLoad(Java ...
- @staticmethod/@classmethod/实例方法/@abstractmethod
from abc import ABCMeta, abstractmethod # 定义一个抽象类 class Person(metaclass=ABCMeta): name = "泰山&q ...
- ASP.NET Core 微信支付(四)【支付结果通知回调(未按照官方步骤) APIV3】
官方文档 支付通知API 证书和回调报文解密 参考资料 netcore 中没有Request.InputStream 理论实战 对于我来说,这个微信支付结果通知回调有两个难点. 难点一 一开始在想是怎 ...
- Golang标准库——io
原文:Golang标准库--io 1.io io包提供了对I/O原语的基本接口.本包的基本任务是包装这些原语已有的实现(如os包里的原语),使之成为共享的公共接口,这些公共接口抽象出了泛用的函数并附加 ...
- DataGear 制作基于 three.js 的 3D 数据可视化看板
DataGear专业版 1.0.0 已发布,欢迎试用! http://datagear.tech/pro/ DataGear 支持采用原生的HTML.JavaScript.CSS制作数据可视化看板,也 ...
- 【Azure Webjob + Redis】WebJob一直链接Azure Redis一直报错 Timeout Exception
问题描述 运行在App Service上的Webjob连接Azure Redis出现Timeout Exception. 错误截图: 参考Azure Redis对于超时问题的排查建议, 在修改Min ...