基于云落地SLB+Tengine实现高可用集群负载均衡 - 上
前言
本次分享基于618慕课网直播,更多精彩可以关注:https://class.imooc.com/sale/javaarchitect
618双11这样的活动肯定会有大促,有大促就会有大流量,那么必然的我们必须要保证两个点,一个是高可用,一个是高并发。
- 什么是高并发:平时一个网站的流量每天在几千左右,但是在某一天有活动或者某一时间段涌入大量用户,在网站上活动,那么就会发起大量的请求到后端,可能有数十万个甚至百万个,这样会比平时多出很多用户请求,那么势必对服务器后端又一定的压力,这个就是并发,为了做好高并发,系统架构肯定需要做一定的调整。
- 什么是高可用:传统部署的一个系统往往只有一台服务器节点,节点挂了,啥都没了,高可用就是为了保证网络节点宕机后,整个网站系统还能够继续的对外提供服务。最简单的手段就是搭建多机高可用集群。
那么本次课程其实围绕的是高可用来展开的。
那么这次涉及到的一些资料,软件等可以到直播群里去获取,汇总后会统一发出来的。
Nginx 和 Tengine
那么说到集群高可用的话肯定会联想到Nginx,通过nginx就能搭建多机节点的集群,比如tomcat集群,nginx作为网关接受用户的请求,起到反向代理的作用。
Nginx是反向代理服务器,可以构建集群和负载均衡,我们公开课里会使用阿里的Tengine,Tengine是基于Nginx的增强版本,阿里在此基础上的二次开发并且开源的服务器。(可以理解为nginx相当于iPhone12,tengine相当于iPhone12plus)。那么学了Tengine就相当于nginx也会了,一石二鸟。
- 那么咱们先梳理一下概念,看个眼熟,抛出概念,具体后面细说,课程里主要涉及到一下四点:
- 什么是正向代理:后面会画图演示来说
- 什么是反向代理:后面会画图演示来说
- 什么是集群:后面说
- 什么是负载均衡:后面说
Nginx并发能力很强,可以支持上万并发(理论5万左右),并且所需要的硬件配置不会很高,对cpu,内存的依赖度不大,而且长期运行十分稳定可靠。
Nginx是异步非阻塞的(AIO),上万连接可以对应到一个进程。(在咱们架构师课程里我们提过apache这个httpd服务器,它是同步阻塞的(BIO),一个连接就对应一个线程,并发越高性能越低下)所以现在主流的服务器都用的nginx或者tengine。
Nginx 能够解决的问题
- 高可用
- 集群
- 负载均衡
- 虚拟主机
- 并发能力(高并发):构建多简单集群,提升并发能力,抗负载能力
- 动静分离(静态资源)(架构师体系课程中就是这么部署的)后面有时间加餐可以画图说一下
- ……
需要注意:搭建集群可以解决高可用问题,同时也能分担一定的流量压力,当然高并发并不是仅仅只靠集群就能解决的,这里指的仅仅只是一部分压力。
互动发问
欸?那nginx和tengine是7层还是4层的网络模型呀?
那LVS呢?
俗话说四层转发,七层代理。LVS4层只管向后抛,他不会处理你的请求,7层可以处理,他提供了http协议,根据根据url地址来找到你硬盘里的某个资源文件地址,或匹配请求到反向代理的upstream,他也可以操作header啊cookie啥的。后面要说的负载均衡器组件SLB也是四层负载。
如何理解四层和七层,参考下图:
入正题,Tengine 官网
上面的概念没听懂没关系,我们先把Tengine来安装一下,概念在后面循序渐进的去理解。
打开:http://tengine.taobao.org/
下载最新版的即可
虚拟机或云服务器安装
用腾讯云的的666miss服务器
-
上传到某一个目录
-
解压缩:
tar zxvf tengine-2.3.2.tar.gz
-
进入tengine根目录,结构和nginx类似,安装方式也是类似
-
安装依赖环境
- 安装gcc环境
- yum install gcc-c++ -y
- 安装PCRE库,用于解析正则表达式
- yum install -y pcre pcre-devel
- zlib压缩和解压缩依赖,
- yum install -y zlib zlib-devel
- SSL 安全的加密的套接字协议层,用于HTTP安全传输,也就是https
- yum install -y openssl openssl-devel
- 安装gcc环境
-
配置编译(可以参考nginx):
./configure --prefix=/usr/local/tengine
-
安装:
make && make install
- 安装成功,可以看到tengine的目录都有了,目录结构和nginx也都是一致的
启动tengine
启动方式与nginx一致
浏览器访问tengine所在的内网ip:
虽然是tengine,但是本质上他还是nginx的进程:
- 停止:
- ./nginx -s stop
- 重启:
- ./nginx -s reload
Tengine 配置文件详解(可以作为加餐环节)
打开 /usr/local/tengine/conf/nginx.conf
,配置内容如下:
# 默认注释了,其实就是nginx的默认用户,注释代表使用当前用户,也就是root,这里可以修改为指定的用户,用以限制。
#user nobody;
#nginx 是多进程,一个进程里又可以开很多线程,线程用以处理用户连接,可以设置为CPU的核数为1,预留一
个,比如你现在是8核的,那就设置为7,当然你设置为8问题也不大,这个服务器里不要再放额外的一些中间件了(默认1个)
worker_processes 2;
# 每个worker进程可以处理的最大连接数,连接数并不是越大越好,因为还受到环境因素,比如磁盘io或网络
io快不快,内存和cpu大不大等因素影响。
events {
worker_connections 10240;
}
# 此外,操作系统限制一个进程能够打开的最大文件数,也限制了nginx的最大并发,可以通过如下查看:
# cat /proc/sys/fs/file-max
# 一般9万左右,worker_processes x worker_connections < file-max,这个可以自己调大
# 如果反向代理了几台tomcat,那么总的并发数是 worker_processes x worker_connections / 4,得出的值
是一个差不多的范围,4是一个预估的经验值(长期以往大家总结的)。
# 需要注意,真正的并发数并不是一个特定的值,是根据硬件资源以及环境资源的一个综合的值,和上面计算
得出的值也肯定会有一定的偏差
# HTTP 模块
http {
# 在任何地方都能使用include进行配置的引入
# 资源媒体类型,浏览器支持的资源媒体类型和我们设置的类型匹配,则会在浏览器播放视频/播放音乐/展示图片,不匹配则下载,阿里OSS的图片在chrome上只能下载不能展示,道理是一样的
include mime.types;
# 如果文件类型在mime.type中找不到则默认使用下方的
default_type application/octet-stream;
# 高效传输模式,发送文件数据更快,简单来说,nginx作为静态资源服务器,开启会提高nginx性能,如果把nginx作为反向代理服务器,那么没什么卵用
# 文件数据传输存在于操作系统的内核里,不需要经过缓冲区的拷贝,如此效率更高,性能更好,也可以称之为零拷贝
sendfile on;
# 打开后可以优化网络传输,打开的前提是sendfile为on
# tcp_nopush on;
# 设置客户端与服务端请求的超时时间,保证客户端多次请求的时候不会重复建立新的连接,节约资源损耗。
#keepalive_timeout 0;
keepalive_timeout 65;
# 启用压缩,html/js/css压缩后文件变小,传输也会更快(我们在架构师课程里有演示过吧,不记得的敲个0)
#gzip on;
# 可以在http指令块中设置多个虚拟主机
server {
# listen 监听端口
# server_name localhost、ip、域名
# location 请求路由映射,匹配拦截,默认用`/`可以对后面的路径进行匹配,匹配到就显示对应的资源文件。
# location 参考文档:http://tengine.taobao.org/nginx_docs/cn/docs/http/ngx_http_core_module.html#location
# root 请求位置
# index 首页设置
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
}
}