12.1 Nginx/lua 12.2 LVS 12.3 CDN 12.4 keepalived

12.1 Nginx/lua

一款轻量级Web服务器/反向代理及电子邮件代理服务器

占内存少,数据结构紧凑,零拷贝,配置文件简单
高性能,一台可十万并发,epoll的nio,零拷贝。成本低

一万个请求来,Nginx一个线程处理,Apache则有一万个线程会炸。Nginx和Apache可作静态Web服务器。
一般Nginx用于反向代理,Tomcat动态服务器

反向代理作用

1 保证内网安全,可用反向代理的WAF功能,阻止Web攻击。大型网站,通常将反向代理作为公网访问地址,Web服务是内网。
2 优化负载均衡
	默认:轮询
	最少连接
	IP地址Hash
	基于权重

负载均衡配置

服务器上host文件改域名 如 127.0.0.1  yunyun.1.com
服务器配置nginx.conf文件,配轮询方式
	upstream yunyun.1.com{
		server:127.0.0.1:8881
		server:xxx
		server:xxx
	}

Nginx缓存

http_proxy 模块,可实现缓存功能 (如访问静态html网页经过Nginx会缓存)

Nginx缓存配置

哪里配置?
	nginx.conf文件中proxy_cache_path指定位置 2个参数:目录/缓存名称及占内存大小

哪些能配置?
	默认所有get/head方法的请求结果缓存key
	可自定义key,指定请求至少发送多少次以上才缓存,可指定哪些方法请求被缓存(get/head/post等)

有效期
	默认长留,除非cache总量大于limit,可指定cache时间

一些请求可自定义不缓存
	通过proxy_cache_bypass指定请求不走缓存

网页的缓存是由HTTP消息头中 "Cache-control" 控制,默认private(仅客户端可以缓存,代理服务器不行)
比如把private改成public,则nignx可以缓存

Ngx_lua模块

Nginx模块用c开发,规则复杂。所以用ngx_lua模块,用lua脚本实现业务逻辑(lua解释器继承Nginx)

特点:高并发,非阻塞
	 lua内建协程(并发占内存很小),可以很好将异步回调改成顺序调用
	 每个协程有一个独立的全局环境(变量空间),继承于全局共享只读的"common data"

协程

类似多线程,不是操作系统线程,所以创建切换开销比线程小
协程栈在用户进程空间模拟的,所以创建切换开销小
多线程是并发执行,一个瞬间多个流执行。协程强调协作,一瞬间能有一个运行
因为一瞬间只能一个运行,对临界区不用加锁,多线程则需要加
因为多线程有多个控制流,程序行为不可控,协程可控

Nginx每个worker进程都在epoll/kqueue上封装成协程,每个请求一个协程处理,与lua内建协程模型一致。
所以ngx_lua执行lua对c开销很小,高并发能力仍然很好

这个解释的更清楚 协程是线程内的一个内存模型,一个线程可以有多个协程。当我们的协程(如read方法)遇到阻塞的时候,那么系统会立马调用另一个不阻塞的线程来执行read。这样做的好处是,这样就不需要关注什么时候socket的read会返回。因为当read完成,epoll多路复用会执行一个回调。这个回调是一个return函数,read完成会顺序的执行。这样我们的协程机制就是一个同步的,它就不需要进行加锁。

网图

中断负载均衡RPS软中断负载均衡 常用负载均衡中间件_lvs

Nginx进程模型

采用多进程,单master进程,多worker进程。master进程管理worker进程
worker 用单线程非阻塞事件模型(个数一般CPU数量) 具体处理请求
master 
	接收外界信号
	向各个worker发送信号
	监控worker运行状态
	当worker异常退出,会自动重启worker

总结:不就是reactor模式IO多路复用么,只是这里是epoll比select牛逼点

HTTP请求处理

反向代理Nginx先分阶段处理

OpenResty

原理:可用lua脚本直接调用Nginx,可直接对redis/mysql等操作
目标:web服务器可直接跑在Nginx server内部
使用:下载OpenResty后,编写OpenResty的lua脚本 xxx.conf

应用

//1 目标:访问http://127.0.0.1:8080时,返回请求报文和输出Hello World

nginx.conf下
http{
	server{
		listen:8080; //监听8080端口
		location/{
			//很多参数
			default_type text/html;
			return 200 "Hello World"
		}
	}
}
//2 目标:调用http://yunyun.123.com会重定向到127.0.0.1:8080
1 host文件
127.0.0.1 yunyun.123.com

2 nginx.conf下
upstream origin.123.com{
	server 127.0.0.1:8080;//通过负载均衡策略,选择服务器
	server ...
	server ...
}
server{
	listen 8080;
	server-name yunyun.123.com;
	location/{ //通过location拦截
		proxy_pass http://origin.123.com
	}
}

Nginx常用配置

inclue各种conf文件
worker一些控制(控制worker进程运行的用户,用户组,进程打开的最大句柄数)
限制信号队列
	worker_rlimit_sigpending limit 某用户信号队列满了,再发的信号量
	设置worker进程个数
	设置worker到指定的CPU内核,worker优先级设置
	设accpet锁,accept延迟时间
	设事件模型 poll/select/kqueue
	批量连接 on/off

12.2 LVS

Linux Virtual Server
在linux2.6版本后加入内核。基于IP+TCP Port,主要用于服务器负载均衡

企业简单负载均衡架构图

中断负载均衡RPS软中断负载均衡 常用负载均衡中间件_nginx_02

LVS框架

E-Commerce
General Network Services
Cluster Management
KTCPUS (基于内容请求分发Layer-7交换机)
IPVS (3种IP负载均衡IP虚拟服务器软件)

IPVS (IP负载均衡,效率最高)

1 VS/DR (Virtual Server vs Direct ROuting)
通过改写MAC地址,将请求发到真实服务器上,直接相应客户,不再需要IP隧道的开销。但要求调度器和真实服务器都有一块网卡连在同一物理网段上

2 VS/NAT 
调度器重写请求报文目标地址,通过调度算法请求发送到真实服务器上。服务器响应后通过调度器,再次重写报文源地址返回客户

3 VS/TUN
使用NAT时,请求和响应都要调度器重写,当请求太大时,调度器承受不了,所以调度器把请求报文通过IP隧道发送到真实服务器响应。所以调度器只处理请求报文,集群吞吐量上升10倍。

IPVS调度算法

Source Hash
轮询
加权轮询
最少连接
加权最少连接
局部性最少连接
带复制的局部性最少连接
目标地址hash

中断负载均衡RPS软中断负载均衡 常用负载均衡中间件_lvs_03

中断负载均衡RPS软中断负载均衡 常用负载均衡中间件_cdn_04

12.3 CDN

内容分发网络
	使用户就近获取所需要的内容,减少网络阻塞,提高访问响应
	CDN依靠部署在各地边缘服务器,包括中心平台负载均衡,内容分发,调度等功能模块

	比如下载Jquery库,通过CDN分析从就近节点上快速下载下来

CDN优势

本地Cache加速(大量图片,静态页面访问加速)
镜像,远程加速,带宽优化,集群抗攻击

CDN服务模式

分发服务系统(保存缓存) -> 负载均衡系统(user访问调度) -> 内容管理系统(收集整理交付)

CDN工作流程

常规Web请求
	1 用户网站上输入url
	2 浏览本地DNS(如有直接相应)
	3 如无,整个DNS系统递归解析
	4 浏览器拿到域名解析结果(IP地址)
	5 浏览器向服务器请求内容
	5 服务器将请求内容发给浏览器

引入CDN后Web请求
	1 url后,经本地DNS解析,DNS系统将域名解析权交给CNAME指向的CDN专用DNS server
	2 CDN的DNS server 将全局负载均衡设备IP返回用户
	3 用户用CDN全局负载均衡设备发送url请求
	4 CDN全局负载均衡设备选一个区域负载均衡设备响应
	5 区域负载均衡设备选一个缓存服务器
	6 缓存服务器与用户交互
	7 如果此缓存服务器没有用户需要数据,则它向上一级缓存服务器要数据,知道追溯到源服务器,拿到数据返回用户

12.4 keepalived

用于检查服务器状态。一台服务器挂了,keepalived会将它剔除选择新的节点替换,服务器恢复正常了会再加入,全程自动。
人工只需要修复服务器

ARP协议:IP转MAC地址(网卡)的协议
RARP协议:MAC转IP
ICMP协议:控制IP的协议

特性

配置简单
稳定性强,成本低
应用范围广,用于几乎所有高可用应用(LVS,数据库,htttp,nginx)
支持多种类型(主从,主主等)

原理

keepalived以VRRP协议实现,通过优先级确定虚拟路由器中每个路由器角色(master/backUp路由器),
优先级一样时候,接口地址大的为master。比Zookeeper简单粗暴效率高

VRRP及虚拟路由器具体介绍

三大模块

core:核心,主进程启动,维护及全局配置文件的加载和解析
check:健康检查
vrrp:vrrp协议的实现

中断负载均衡RPS软中断负载均衡 常用负载均衡中间件_中断负载均衡RPS软中断负载均衡_05