整理一些网络编程的基础知识。摘录一下方便理理解。
基本服务器
- 就是一个服务器,蕴含数据库了。
数据库分离
- web server 和 database server,client 请求 web server
- web server 请求 database server 完成 OLTP (online transaction processing,增删改查等事务)或者 OLAP (online analytical ,分析处理)活。
web server 动静分离
- 动态请求比如 http 网页的静态内容,html 文件,纯 js。
- 动态请求涉及数据库在线即时查询,cgi实时应用 php 动态网页,jsp 动态网页。
- 可以简单的理解,静态是每次请求都是一样的内容,而动态涉及 get 和 post 或者实时由服务器生成的内容(比如cgi生成html,这是动态的)。
缓存
- 有了动静分离之后,就可以分层缓存了,由于动态的内容(对应 volatile,强制每次都从内存取)不适合缓存,所以就不缓存了,但是静态的可以(放寄存器,放 Cache)。实际所有都可以缓存。
- 浏览器缓存,直接缓存用户刚刚访问又关掉的内容。
- 前端缓存(比如 squid 就是缓存代理。我们之前讲代理的时候,讲到 squid 是代理,但是不涉及加密的代理一般可以用来做缓存,什么中间人攻击)。减少对服务器的访问。
- ESI edge side includes 缓存,这个是动态缓存,esi 是用来标记片段的技术,然后缓存根据esi 标记来决定是能缓存的还是必须实时计算的。
- Local data cache,这个是针对数据库服务器的缓存,这一点很好理解,访问 web 服务器要缓存一层,web 服务器访问 database 也缓存一层,减轻数据库服务器压力。
集群与读写分离
- 一个服务器难抗压,绷不住,所以用很多服务器,这样就由前面说的 fronted page cache(一般是 cdn 用像 squid 的 proxy 技术实现)来进行 load balance 再到具体哪台服务器。
- 读写分离则是一路到了必须访问 database 的时候,将 db 服务器分为 read 和 write 的,通过 dal data access layer 来读写分离,这里涉及 master server(for write)和 slave server (for read),分布式系统的 write 要 replicate 到 slave。
- cap 原则,consitency(强一致和最终一致), availiability(实时返回) 和 partition tolerance,p的意思是如果图分为几个子图,系统能否正常工作。(@see) 只能三选二,证明是反证法。
负载均衡(@see)
- 用 DNS 负载均衡,直接对应多个机子。必须对等的多态服务器才能均衡。
- 反向代理实现内网转发,调度方法灵活一点,nginx 负载均衡即对 http 的负载均衡。
- linux vitual server 负载均衡,在 tcp/ip 层上实现负载均衡,netfilter,根据 ip + port 来转发。需要的原因是适配各种算法,工作在内核上稳定性能。
- f5 硬件负载均衡,通过交换机实现,灵活更大,对端来说透明(性能更好),类似一个包过滤器的意思?
- 以上内容都使用与 web server 和 db server。
CDN + 分布式缓存 + 分库分表
- 结合上述内容的网络架构。
- 首先是地区 CDN 实现前端的负债均衡调度给集群中的服务器。
- Data Cache 也做成分布式的,数据库也分库分表提高并发性能。
- 分布式缓存比如 memcached,membase,redis 这些 KV 类似的(nosql)从而避免直接对 db 的查询。而 nosql 的 kv 只需要处理 expire 后 evict 和 reload,很快的读性能。
- 分库是垂直上(分 column 存储)把不同的数据分到不同的服务器取。
- 分表是水平上的(shard,将 rows partition 存储)
分布式文件系统
- 继续优化 DAL 之前,通过抽象一个 DFS (分布文件系统)来透明下层的 CAP 处理事宜。使用分布式文件系统时,无需关心数据是存储在哪个节点上、或者是从哪个节点从获取的,只需要像使用本地文件系统一样管理和存储文件系统中的数据。
- 谷歌三宝:gfs,bigtable,mapreduce。
- mapreduce 是基于谷歌 gfs,bigtable 论文的一个抽象。mapreduce 是基于 DFS 上的大数据框架。map 和 reduce 在之前学 sicp lisp 的时候(或者js,python fp 等时候)学过了,就是那个差不多的意思(谷歌论文:Our abstraction is inspired by the map and reduce primitives present in Lisp and many other functional languages)。map 是对集群里每个分布式节点 map 某个操作,之后 reduce 则是合成这些结果输出。
- hadoop 则是 mapreduce 的一个实现。
- bigtable 是谷歌的一个分布式kv数据库技术,pb级海量数据。