Nginx实用插件_踩踩踩从踩的博客-CSDN博客
前言前面文章介绍Nginx的核心及扩展插件必要的性能优化,以及在nginx中如何实用用https;本篇文章会继续讲解重要的概念 lvs高可用框架,怎么利用虚拟服务,使得nginx高可用,以及 负载均衡策略;基于Keepalived实现LVS高可用,负载均衡器LVS跟Nginx差别
也是源自对应请求量高并发的情况才 nginx集群进行高可用,如何实用lvs进行分流
LVS简介 LVS(Linux Virtual Server)linux 虚拟服务,由中国人章文嵩创造和开发的linux内核项目。 一句话理解:将一堆的linux服务节点虚拟成一台服务器, 对外提供相同的ip访问,对内实现各服务器的负载调度。 利用一个ip 将多个服务器虚拟成一个 LVS中文站点 (linuxvirtualserver.org) 特点- 有一个负载调度器—负载均衡
- 内部结构对客户端透明—封装
- 无感知的增删服务节点—可伸缩
- 检测服务健康状态—高可用
这就是lvs达到的效果 ,对于客户端感觉像是一个的样子。
为什么要用LVS 互联网发展需求 要求web服务能具有可伸缩性、高可用性、可管理、性价比高这几个特性 服务器面临提升瓶颈 升级单台硬件设备显然代价非常大,服务集群化更具可扩展性和成本效益。 构建集群的方法- 基于DNS,DNS将域名解析为服务器的不同IP地址来将请求分发到不同的服务器,实现集群负载
- 基于客户端,客户端需要值得服务集群信息。
- 基于调度程序,调度程序可以以精细的粒度调度请求(例如每个连接) ,以便在服务器之间实更好的负载平衡。
- 基于IP
NAT(Network Address Translation,网络地址转换)是1994年提出的。当在专用网内部的一些主机本来已经分配到了本地IP地址(即仅在本专用网内使用的专用地址),但又想和因特网上的主机通信(并不需要加密)时,可使用NAT方法。
这种方法需要在专用网(私网IP)连接到因特网(公网IP)的路由器上安装NAT软件。装有NAT软件的路由器叫做NAT路由器,它至少有一个有效的外部全球IP地址(公网IP地址)。这样,所有使用本地地址(私网IP地址)的主机在和外界通信时,都要在NAT路由器上将其本地地址转换成全球IP地址,才能和因特网连接。
IPVS - IP TUN IP TUN — IP(tunnel 隧道)。将发往一个IP地址的数据报包装并重定向到另一个IP地址。是最具扩展 性 的。 TUN模式是通过ip隧道技术减轻lvs调度服务器的压力,许多Internet服务(例如WEB服务器)的请求包很短小,而应答包通常很大,负载均衡器只负责将请求包分发给物理服务器,而物理服务器将应答包直接发给用户。所以,负载均衡器能处理很巨大的请求量。相比NAT性能要高的多,比DR模式的优点是不限制负载均衡器与RS在一个物理段上。 缺点 ,需要所有的服务器(lvs、RS)支持"IP Tunneling"(IP Encapsulation)协议 优点 ,由于服务器通过使用IP隧道相互连接,负载均衡器和真实服 务器可以驻留在不同的LAN甚至WAN上。 IPVS - DR DR —(direct route 直接路由)虚拟IP地址由真实服务器和负载均衡器共享。负载均衡器的接口也配置了虚拟IP地址,用于接受请求数据包,并直接将数据包路由到选定的服务器。所有真实服务器的非arp别 名 接口都配置了虚拟IP地址,或者将发往虚拟IP地址的数据包重定向到本地套接字,以便真实服务器可以在本地处理数据包。 具有 最佳性能 。VS / DR使用MAC欺骗技术,因此它要求负载均衡器的NIC和真实服务器的NIC之一必须位于同一IP网段和物理段中。 高可用Nginx集群安装如何搭建一个nginx高可用集群
高可用Nginx集群安装搭建手册 提取码:nnfp
环境准备两台linux服务器,IP地址分别为
192.168.120.103
192.168.120.58
准备IP地址信息打印程序balancer-1.0.0.jar,http://hostname:port/server/ip,打印服务器的IP端口号信息。
安装两台Nginx安装步骤,参考前面Nginx的手册来操作,将Nginx分别安装在前面准备的两台linux服务器上。
启动Nginx,都为80端口,代理前面的的balancer-1.0.0.jar服务。
安装LVSLVS全称为Linux Virtual Server,工作在ISO模型中的第四层,由于其工作在第四层,因此与iptables类似,必须工作在内核空间上。因此lvs与iptables一样,是直接工作在内核中的,叫ipvs,主流的linux发行版默认都已经集成了ipvs,因此用户只需安装一个管理工具ipvsadm即可。 LVS现在已成为Linux内核的一部分,默认编译为ip_vs模块,必要时能够自动调用。以下操作可以手动加载ip_vs模块,并查看当前系统中ip_vs模块的版本信息。安装依赖
$ sudo yum install -y popt-static kernel-devel make gcc openssl-devel lftplibnl* popt* openssl-devel lftplibnl* popt* libnl* libpopt* gcc*加载LVS
# 通过下面命令来检查,如果没有显示,则说明没有加载 $ lsmod |grep ip_vs ip_vs 145497 0 # 加载LVS,执行下面命令就可以把ip_vs模块加载到内核 $ sudo modprobe ip_vs # 查看LVS版本号,说明安装成功 $ cat /proc/net/ip_vs IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn安装ipvsadm
curl "http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.26.tar.gz" -o ipvsadm-1.26.tar.gz tar zxf ipvsadm-1.26.tar.gz cd ipvsadm-1.26 rpm -qa | grep kernel-devel # 确认是否安装了kernel-devel(默认已经安装) su root # 需要root权限执行 make && make install curl "http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.25-1.src.rpm" -o ipvsadm-1.25-1.src.rpm sudo rpm -ivh ipvsadm-1.25-1.src.rpm # 检查是否安装成功,显示下面的内容表示安装成功 $ sudo ipvsadm IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConnLVS DR模式
DR模式是LVS三种实现负载均衡方式中性能最好的一个,下面就使用这个模式,配置Nginx负载均衡的实现。
设定IP环境如下
VIP:192.168.120.200
lvs-director:192.168.120.58
Nginx1:192.168.120.103
Nginx2:192.168.120.58
DR配置LVS配置
编辑lvs文件
sudo vim /usr/local/sbin/lvs_dr.sh
输入下面内容
#! /bin/bash # 1,启用ip转发;0,禁止ip转发;默认0。 echo 1 > /proc/sys/net/ipv4/ip_forward # 定义两个变量方便后面使用 ipv=/sbin/ipvsadm vip=192.168.120.200 # 通过ifconfig,找到自己的网卡名,我这里是enp0s3 # 下掉enp0s3:0的虚拟ip ifconfig enp0s3:0 down # 通过ifconfig,找到自己的网卡名,在其下面绑定虚拟ip # 在enp0s3上绑定虚拟ip,虚拟ip地址的广播地址是它本身 ifconfig enp0s3:0 $vip broadcast $vip netmask 255.255.255.255 up # 添加路由规则 route add -host $vip dev enp0s3:0 # 清除原有转发规则 $ipv -C # 新增虚拟服务,采用轮询策略,负载转发端口是8080 $ipv -A -t $vip:8080 -s rr # 定义实际服务ip rs1=192.168.120.103 rs2=192.168.120.58 # -a在虚拟IP中添加上游服务信息;-t表示tcp服务 # -r表示真实服务信息;-g指定为LVS为直接路由模式 $ipv -a -t $vip:8080 -r $rs1:80 -g $ipv -a -t $vip:8080 -r $rs2:80 -g
使配置生效
sudo sh /usr/local/sbin/lvs_dr.sh sudo ipvsadm
ipvsadm操作说明
sudo ipvsadm -C 清除 说明: -A --add-service在服务器列表中新添加一条新的虚拟服务器记录 -t 表示为tcp服务 -u 表示为udp服务 -s --scheduler 使用的调度算法, rr | wrr | lc | wlc | lblb | lblcr | dh | sh | sed | nq 默认调度算法是 wlc -a --add-server 在服务器表中添加一条新的真实主机记录 -r --real-server 真实服务器地址 -m --masquerading 指定LVS工作模式为NAT模式 -w --weight 真实服务器的权值 -g --gatewaying 指定LVS工作模式为直接路由器模式(也是LVS默认的模式) -i --ipip 指定LVS的工作模式为隧道模式 sudo ipvsadm -help 可以查看更多的帮助信息真实服务配置
在lvs的DR和TUn模式下,用户的访问请求到达真实服务器后,是直接返回给用户的,而不再经过前端的Director Server,因此,就需要在每个Real server节点上增加虚拟的VIP地址,这样数据才能直接返回给用户。
2台真实web服务器的配置信息,编辑lvs_dr_rs.sh文件
sudo vim /usr/local/sbin/lvs_dr_rs.sh
输入内容
#! /bin/bash vip=192.168.120.200 ifconfig enp0s3:0 $vip broadcast $vip netmask 255.255.255.255 up route add -host $vip enp0s3:0 # 关闭arp解析 echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
关闭arp解析
arp_ignore:当ARP请求发过来后发现自己正是请求的地址是否响应;
0 - 利用本地的任何地址,不管配置在哪个接口上去响应ARP请求; 1 - 哪个接口上接受ARP请求,就从哪个端口上回应。
arp_announce :定义不同级别,当ARP请求通过某个端口进来是否利用这个接口来回应。
0 - 利用本地的任何地址,不管配置在哪个接口上去响应ARP请求; 1 - 避免使用另外一个接口上的mac地址去响应ARP请求; 2 - 尽可能使用能够匹配到ARP请求的最佳地址。
使配置生效
sudo sh /usr/local/sbin/lvs_dr_rs.sh sudo sysctl -p测试
在浏览器输入访问
http://192.168.120.200:8080/server/ip安装Keepalived
只有一台LVS服务,万一挂了怎么办?需要Keepalived来做高可用,准备两台linux服务器,用来安装两台keepalived,Keepalived安装过程如下。
安装依赖2.0.18版本
sudo yum install -y openssl-devel popt-devel libnl-devel kernel-devel gcc安装Keepalived
2.0.18版本
cd ~ wget https://www.keepalived.org/software/keepalived-2.0.18.tar.gz tar -xvzf keepalived-2.0.18.tar.gz cd keepalived # 安装到/usr/local/keepalived目录 ./configure --prefix=/usr/local/keepalived --sysconf=/etc sudo make & sudo make install
配置
配置放在/etc/keepalived/,三份配置文件(一个nginx_monitor监控脚本,主备各一份keepalived配置)
Nginx监控脚本
新建nginx_monitor.sh文件
sudo vim /etc/keepalived/nginx_monitor.sh
脚本内容
#!/bin/bash
# shell脚本监控:如果程序的进程存在,则认为没有问题
if [ "$(ps -ef | grep "nginx"| grep -v grep| grep -v keepalived )" == "" ]
then
# 输出日志
echo "nginx ############# app down " >> /var/log/messages
exit 1
else
# 一切正常
exit 0
fi
执行脚本
# 创建nginx monitor 脚本,并赋予可执行权限 sudo chmod +x /etc/keepalived/nginx_monitor.sh # 测试一下脚本能不能执行 sh /etc/keepalived/nginx_monitor.sh # 没报错即表示为成功
Keepalived配置
主配置 /etc/keepalived/keepalived-nginx-master.conf
# 定义一个名为monitor的脚本
vrrp_script monitor {
# 监控脚本存放地址
script "/etc/keepalived/nginx_monitor.sh"
# 每隔1秒执行一次
interval 1
}
# 定义一个vrrp示例
vrrp_instance VI_1 {
state MASTER #(主机为MASTER,备用机为BACKUP)
interface enp0s3 #(HA监测网卡接口)
virtual_router_id 61 #(主、备机的virtual_router_id必须相同,不大于255)
priority 90 #(主、备机取不同的优先级,主机值较大,备份机值较小,值越大优先级越高)
advert_int 1 #(VRRP Multicast广播周期秒数)
track_script {
monitor #(监控脚本名称)
}
virtual_ipaddress {
192.168.120.200 #(VRRP HA虚拟IP)
}
}
备份配置 /etc/keepalived/keepalived-nginx-backup.conf
# 定义一个名为monitor的脚本
vrrp_script monitor {
# 监控nginx的脚本存放地址
script "/etc/keepalived/nginx_monitor.sh"
# 每隔1秒执行一次
interval 1
}
# 定义一个vrrp示例
vrrp_instance VI_1 {
state BACKUP #(主机为MASTER,备用机为BACKUP)
interface enp0s3 #(HA监测网卡接口)
virtual_router_id 61 #(主、备机的virtual_router_id必须相同)
priority 80 #(主、备机取不同的优先级,主机值较大,备份机值较小,值越大优先级越高)
advert_int 1 #(VRRP Multicast广播周期秒数)
track_script {
monitor #(监控脚本名称)
}
virtual_ipaddress {
192.168.120.200 #(VRRP HA虚拟IP)
}
}
# - master主机 keepalived-nginx-master.conf # - backup备机 keepalived-nginx-backup.conf
启动Keepalived服务
注意事项# 启动master主机
/usr/local/keepalived/sbin/keepalived -f /etc/keepalived/keepalived-nginx-master.conf
# 启动backup备机
/usr/local/keepalived/sbin/keepalived -f /etc/keepalived/keepalived-nginx-backup.conf
两台keepalived服务间需要通信,关闭防火墙
firewall-cmd --state #查看默认防火墙状态(关闭后显示notrunning,开启后显示running) systemctl list-unit-files|grep firewalld.service systemctl stop firewalld.service #停止firewall systemctl disable firewalld.service #禁止firewall开机启动 [root@localhost ~]#systemctl stop firewalld.service [root@localhost ~]#systemctl disable firewalld.service 启动一个服务:systemctl start firewalld.service 关闭一个服务:systemctl stop firewalld.service 重启一个服务:systemctl restart firewalld.service 显示一个服务的状态:systemctl status firewalld.service 在开机时启用一个服务:systemctl enable firewalld.service 在开机时禁用一个服务:systemctl disable firewalld.service 查看服务是否开机启动:systemctl is-enabled firewalld.service;echo $? 查看已启动的服务列表:systemctl list-unit-files|grep enabled测试
关闭master服务,服务是否仍然可用,backup服务是否替补上来。
LVS负载策略分析 LVS负载策略- 轮询(Round Robin)
- 加权轮询(Weighted Round Robin)
- 最少连接(Least Connections)
- 加权最少链接(Weighted Least Connections)
- 基于局部性的最少链接(Locality-based Least Connections)
- 带复制的基于局部性最少链接(Locality-based Least Connections with Replication)
- 目标地址散列(Destination Hashing)
- 源地址散列(Source Hashing)
- LVS系统的健康检查
- 实现VRRPv2堆栈以处理负载均衡器故障转移
Keepalived for Linux
用 C 编写的路由软件。该项目的主要目标是为 Linux 系统和 Linux 基础设施提供简单而强大的负载平衡和高可用性设施。负载平衡框架依赖于众所周知且广泛使用的Linux 虚拟服务器 (IPVS)内核模块,提供第 4 层负载平衡。保持实现实现一组检查器,以动态和自适应地维护和管理负载平衡服务器池根据他们的健康。另一方面,VRRP协议实现了高可用性。VRRP 是路由器故障转移的基本砖块。此外,Keepalived 还向 VRRP 有限状态机器实施一组挂钩,提供低级和高速协议交互。为了提供最快的网络故障检测,保持实现BFD协议。VRRP 状态过渡可以考虑 BFD 提示以推动快速状态过渡。可独立或全部使用保持框架,以提供弹性基础设施。
Keepalived的设计 子进程都有自己的I/O多路复用调度器,这样可以优化VRRP调度抖动,VRRP调度比健康检查器更敏感关键。这样拆分最小化了健康检查外部库的使用,并将其自身操作最小化到空闲主循环,以避免由自身引起的故障。 父进程监视框架称为看门狗。每个子进程打开一个接受unix域套接字,然后在守护进程引导时,父进程连接到那些unix域套接字并向子进程发送周期性(5s)hello数据包。如果父进程无法向远程连接的unix域套 接字发送hello数据包,则只需重启子进程。 这样的设计确保Keepalived的健壮性和稳定性,另外两个好处: 1. 父进程发给远程连接的hello数据包是通过子进程I/O多路复用器调度程序完成的,可以检测子程调度框架中的deadloop 2. 通过使用sysV信号来检测死亡的子进程 Keepalived的结构 Keepalived由控制平面、IO多路复用调度器、内存管理、核心组件构成。核心组件中包含了前面提到的三个进程,父进程WatchDog程序、子进程检查程序、子进程VRRP协议栈程序。 WatchDog 派生、监控(VRRP & Healthchecking)子进程。 检查程序 负责realserver的运行状况检查。检查器测试realserver是否还活着,从而决定,自动从LVS拓扑中删除或添加realserver。 VRRP协议栈 VRRP(Virtual Router Redundancy Protocol 虚拟路由器冗余协议)专门用于处理一组路由器组中路由器故障接管工作。 健康检查—Checkers 健康检查注册在全局调度框架中,有以下类型的运行状况检查: TCP_CHECK 在第4层工作,使用无阻塞/超时的TCP连接,如果远程服务器未回复此请求(超时),则测试错误,并从服务器池中删除该服务器。 HTTP_GET 在第5层工作,对指定的URL执行HTTP GET。使用MD5算法对HTTP GET结果进行摘要, 与期望值不匹配,则测试不通过,并将服务器从服务器池中删除。 SSL_GET 与HTTP_GET相同,但使用到远程Web服务器的SSL连接。 MISC_CHECK 通过System call调用自定义的脚本作为运行状况检查器运行,结果必须为0或1。 脚用来测试内部应用程序的理想方法 针对system call 写一个脚本去测试进程的存活,对功能进行增强。 高可用特性—VRRP Stack 在设计网络的时候必须考虑冗余容灾,包括线路冗余,设备冗余等,防止网络存在 单点故障,在路由器或三层交换机处实现冗余就显得尤为重要。 在网络里面VRRP协议就是来做这事的,Keepalived运用VRRP协议来实现高可用性。
VRRP是用来实现路由器冗余的协议,VRRP协议将多台路由器设备虚拟成一个设备, 对外提供虚拟路由器IP。路由器组内部,路由器分为Master、Backup两种状态, Master是一台对外提供服务的IP的路由器,或者是通过算法选举产生的,其他的 状态为BACKUP 。 MASTER路由器,实现针对虚拟路由器IP的各种网络功能,如ARP请求,ICMP,以及 数据的转发等。 BACKUP状态路由器,只接收MASTER的VRRP状态信息,不执行对外的网络功能。 当Master失效时,BACKUP将接管原先MASTER的网络功能。 由于设计和健壮性的原因,这个模块已完全集成在Keepalived守护程序中 LVS和Nginx异同分析 LVS后面的服务一定要接Nginx服务吗? 能直接接Tomcat吗?能直接接RPC服务吗? 为什么不这样做呢? LVS基于网络模型的第四层负载均衡,即传输层。 Nginx基于网络模型的第七层负载均衡,及应用用层。 两个都可以用来做Web服务器的负载均衡 传输层的LVS比Nginx能够处理的并发更高,性能更强大 应用层的Nginx则比LVS的功能特性更加丰富、更加成熟稳定
其实都是为了解决高并发的问题。但lvs 从传输层,去处理,当然并发更高。
都有第四层、第七层负载均衡的机制。
Nginx在第7层更加成熟稳定、功能更加丰富,大量的第三方模块和插件。LVS比拟不了,LVS应用层的负债均衡还不够成熟。
LVS处于第四层负债均衡,并且集成到了LInux内核中,基于IP级别的负债均衡,又在内核中,效率更加的高效、Nginx四层负载均衡无法比拟。
得益于Nginx在第7层能拿到更多的数据,功能更强大,才连接tomcat服务器。
keepalived与lvs,他们是一个功能包含关系,keepalived依赖lvs的ipvs模块。keepalived除了能进行负载均衡、还能提供负载均衡、还能提供高可用的特性。单点故障的问题。



