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完成会顺序的执行。这样我们的协程机制就是一个同步的,它就不需要进行加锁。
网图
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,主要用于服务器负载均衡
企业简单负载均衡架构图
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
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协议的实现