6、接入层:反向代理,负载均衡,我有话要说
- no6:代理和反向代理是什么?
- no6:一般用什么做反向代理?
- 软件层面:nginx/apache
- 操作系统层面:LVS
- 硬件:F5
- no6:反向代理能解决什么问题?带来了什么新的问题?
- 解决的问题
- 1.子 web 系统的性能,不再受到单台机器资源限制,可以扩展
- 2.子 web 系统,实现了高可用(伪集群 -> 真集群)
- 新问题
- 1.多个 web 节点,带来负载均衡问题
- 2.反向代理层需要解决 高可用
- no6:反向代理如何实施负载均衡?
- 负载均衡方法:随机、轮询、静态权重轮询、动态权重轮询,一致性哈希
- 负载均衡抓手:四层(转发/交换),七层(转发/交换)
- no6:反向代理如何实现高可用呢?
- 使用两个节点使用相同的虚 IP,同时使用 keepalived 来检测 nginx 的可用性,由 nginx 把请求转发给后端实际处理的 web-server
- 缺点:两个 nginx 实际上只有一台在对外提供服务
7、DNS轮询,以及接入层架构演进
- no7:接入层的单体架构
- no7:接入层的单体架构->DNS 轮询
- no7:DNS轮询的缺点是?
- 1.系统仍然是非高可用的,只是局部高可用
- 2.扩容不是实时的
- 3.暴露了太多的外网 IP
- no7:接入层的DNS 轮询->反向代理
- no7:接入层的反向代理->高可用反向代理
- no7:接入层的高可用反向代理->多层高可用反向代理
- 反向代理层可使用 lvs 和 f5
- no7:接入层的多层高可用反向代理 -> 多层高可用反向代理+DNS 轮询
8、接入层:session一致性,要如何保证?
- no8:什么是 session?
- 服务器会为每个用户创建一个会话,存储用户的相关信息,以便多次请求,能够定位到同一个上下文
- web 开发中,web-server 可以自动地为同一个浏览器的访问用户自动创建 session,提供数据存储功能
- 最常见的,会把用户登录信息,用户信息存储到 session 中,以保持登录状态
- no8:什么是 session 一致性问题?
- 只要用户不重启浏览器,用户的每一次 http 短连接都能定位到session,定位到同一台 web-server 以保持会话
- no8:解决一致性问题的方案?
- all in one 架构
- 反向代理架构
- session 同步法
- 客户端存储法
- 反向代理 hash 一致性
- 后端统一存储法
- no8:反向代理架构,保证高可用的同时,保证 session 路由的一致性的session 同步法,即站点集群 session 同步
- 优点
- 由 web-server 支持,应用程序不需要修改任何代码
- 缺点
- session 的同步需要占用带宽,且数据量受到内存限制,无法进行水平扩展,仅有少量服务器没问题,多台 web-server 性能急剧下降
- no8:反向代理架构,保证高可用的同时,保证 session 路由的一致性的客户端存储法,把 session 存储在客户端,把 session 存储在浏览器的 cookie
- 优点
- web-server 不需要存储 sesssion
- 缺点
- 每次 http 请求都需要携带 session,占用外网带宽
- 存在泄露、篡改、窃取等的安全隐患
- 存储量的大小受到浏览器端上的限制
- no8:反向代理架构,保证高可用的同时,保证 session 路由的一致性的反向代理 hash 一致性(四层,七层),使用反向代理路由来保障
- 使用 ip_hash 或 session_id hash 等
- 优点
- 仅需要修改 nginx 的配置,不需要修改应用层的代码,负载是均衡的
- 能很好支持 web-server 水平扩展
- 缺点
- 一旦 web-server 重启,会丢失一部分 session
- 如果 web-server 水平扩展,nginx 会进行重新 hash,session 重新分布,会导致一部分用户路由不到正确的 session
- 以上两点等同于 session 失效,也是可以接受的
- 建议
- 推荐使用四层的 hash,让专业的软件做专业的事情,反向代理负责路由转发,尽量不要引入业务层的业务属性,http 请求中的属性最好不要让 nginx 关注
- no8:反向代理架构,保证高可用的同时,保证 session 路由的一致性的后端统一存储法,不存储在站点,统一存储在后端(数据库,缓存)
- 优点
- 没有安全隐患,session 不用在外网上传输了
- 可实现 web-server 层的任意水平扩展
- 当数据量增大时,数据库或缓存进行水平切分即可
- web-server 扩容或重启时,都不会有 session 的丢失
- 缺点
9、接入层:如何实现就近访问,CDN架构趣谈
- no9:什么是 CDN(Content Delivery Network)
- 即内容分发网络,它主要依靠部署在各地的服务器,通过内容分发,访问调度等技术,使用户就近获取所需的内容,降低网络阻塞,提高用户的访问速度
- 适合静态资源的加速访问(js,css,jpg 等)
- 核心是「就近访问」
- no9:什么是「智能 DNS」?
- no9:CDN 的架构组成有哪三部分?
- 源:数据库
- 镜像:多个「穿透缓存」
- 智能 DNS:决定我们访问哪一个
- no9:源里的abc.js更新了,镜像里的abc.js没更新,数据不一致,怎么办?
- 方案一:源更新的时候,过期掉镜像里的abc.js (缓存淘汰)
- 需要在源里维护一个镜像 list 的配置,每次源有静态文件更新的时候需要依次淘汰相关的镜像资源,是一个「反向依赖」的耦合设计,即源依赖了镜像,好的方案应该是源不需要知道镜像的配置
- 方案二:等待镜像里的abc.js过期(缓存过期)
- 方案三:版本号,升级为 abc_v1.2.3.js,就能解决(推荐)
- no9:当资源更新,是采用源推送还是镜像拉取的方式?
- 方案一:资源更新的时候,源一次性推送所有镜像(反向耦合设计)
- 方案二:发现资源缺失时,镜像主动去源拉取(推荐)
10、TCP负载均衡,该怎么玩?
- no10:TCP负载均衡的单体架构
- 优点:可以保证请求的一致性
- 缺失:没办法扩展,没办法保证高可用
- no10:TCP负载均衡的客户端负载均衡(内置集群配置)
- 客户端内置服务器集群的配置,通过搭建 tcp 集群来保证高可用
- 缺点,每次连接前要多一次 DNS 访问,难以预防 DNS 劫持,解决方法是直接把 IP 配置到客户端中,但这样的扩展性比较差
- no10:TCP负载均衡的服务端负载均衡(静态 IP 列表)
- 新增一个 http 接口,将客户端的 IP 配置与负载均衡策略放到服务端的 http 接口上,客户端每一次访问 tcp-server 之前,首先调用新增的一个 http 的获取 tcp-server ip 的接口,对于客户端而言,这个 http 接口只返回一个可用的tcp 服务器的 ip
- 缺点:如果 tcp-server 挂了,web-server 是无法感知的
- no10:TCP负载均衡的服务端负载均衡(服务状态上报)
- 缺点:反向依赖耦合
- no10:TCP负载均衡的服务端负载均衡(服务状态拉取)
- tcp-server就独立与解耦了,只需要专注于自身 tcp-server 业务相关的功能即可,而高可用,负载均衡,扩展性,存活性,都由 web-server 这个子系统去实施
|