1 -【 高性能 Nginx 服务器 】- 10 lvs + keepalived + nginx 实现高性能负载均衡集群
1 LVS
作用
LVS
是一个开源的软件,可以实现 传输层四层负载均衡。
LVS
是 Linux Virtual Server
的缩写,意思是 Linux 虚拟服务器
。
目前有:
- 三种 IP 负载均衡技术:
VS/NAT
、VS/TUN
和VS/DR
- 八种调度算法:
rr
、wrr
、lc
、wlc
、lblc
、lblcr
、dh
、sh
2 lvs
与 Nginx
区别
LVS
LVS
的负载能力强,因为其工作方式逻辑非常简单,仅进行请求分发,而且工作 在网络的第4层
,没有流量,所以其效率不需要有过多的忧虑。
LVS
基本能支持所有应用,因为工作在第4层,所以 LVS
可以对几乎所有应用进行负载均衡,包括Web、数据库等。
注意:
LVS
并不能完全判别节点故障,比如在WLC
规则下,如果集群里有一个节点没有配置VIP
,将会导致整个集群不能使用。还有一些其他问题,目前尚需进一步测试。
Nginx
Nginx
工作在 网路第7层
,所以可以对 HTTP
应用实施分流策略,比如域名、结构等。相比之下,LVS
并不具备这样的功能,所以 Nginx
可使用的场合远多于 LVS
。并且 Nginx
对网络的依赖比较小,理论上只要 Ping
得通,网页访问正常就能连通。LVS
比较依赖网络环境。只有使用 DR
模式且服务器在同一网段内分流,效果才能得到保证。
Nginx
可以通过服务器处理网页返回的状态码、超时等来检测服务器内部的故障,并会把返回错误的请求重新发送到另一个节点。目前 LVS
和 LDirectd
也支持对服务器内部情况的监控,但不能重新发送请求。
比如用户正在上传一个文件,而处理该上传信息的节点刚好出现故障,则 Nginx
会把上传请求重新发送到另一台服务器,而 LVS
在这种情况下会直接断掉。Nginx
还能支持 HTTP
和 Email
(Email
功能很少有人使用),LVS
所支持的应用在这个电商比 Nginx
更多。
Nginx
同样能承受很高负载并且能稳定运行,由于处理流量受限于机器 I/O
等配置,所以负载能力相对较差。
Nginx
安装、配置及测试相对来说比较简单,因为有相应的错误日志进行提示。LVS
的安装、配置及测试所花的时间比较长,因为 LVS
对网络以来比较大,很多时候有可能因为网络问题而配置不能成功,出现问题时,解决的难度也相对较大。Nginx
本身没有现成的热备方案,所以在单机上运行风险较大,建议 KeepAlived
配合使用。另外,Nginx
可以作为 LVS
的节点机器使用,充分利用 Nginx
的功能和性能。当然这种情况也可以直接使用 Squid
等其他具备分发功能的软件。
具体应用具体分析。如果是比较小型的网站(每日 PV
小于100万), Nginx
就完全可以应对,如果机器也不少,可以用 DNS
轮询。LVS
后用的机器较多,在构建大型网站或者提供重要服务且机器较多时,可多加考虑利用 LVS
。
注意:阿里云默认不支持虚拟 VIP 技术
3 Keepalived
作用
LVS
可以实现负载均衡,但是不能够进行健康检查,比如一个 rs
出现故障,LVS
仍然会把请求转发给故障的 rs
服务器,这样就会导致请求的无效性。
keepalive
软件可以进行健康检查,而且能同时实现 LVS
的高可用性,解决 LVS
单点故障的问题,其实 keepalive
就是为 LVS
而生的。
4 keepalived
工作原理
keepalived
是一个类似于 Layer2、4、7
交换机制的软件。是 Linux
集群管理中保证集群高可用的一个服务软件,其功能是用来防止单点故障。
keepalived
的工作原理:
keepalived
是基于 VRRP
协议实现的保证集群高可用的一个服务软件,主要功能是实现真机的故障隔离和负载均衡器间的失败切换,防止单点故障。在了解 keepalived
原理之前先了解一下 VRRP
协议。
VRRP
协议:Virtual Route
Redundancy Protocol
虚拟路由冗余协议。是一种容错协议,保证当主机的下一跳路由出现故障时,由另一台路由器来代替出现故障的路由器进行工作,从而保持网络通信的连续性和可靠性。在介绍 VRRP
之前先介绍一些关于 VRRP
的相关术语:
-
虚拟路由器
:由一个 Master 路由器和多个 Backup 路由器组成。主机将虚拟路由器当作默认网关。 -
VRID
:虚拟路由器的标识。有相同 VRID 的一组路由器构成一个虚拟路由器。 -
Master
路由器:虚拟路由器中承担报文转发任务的路由器。 -
Backup
路由器: Master 路由器出现故障时,能够代替 Master 路由器工作的路由器。 -
虚拟 IP 地址
:虚拟路由器的 IP 地址。一个虚拟路由器可以拥有一个或多个IP 地址。 -
IP 地址拥有者
:接口 IP 地址与虚拟 IP 地址相同的路由器被称为 IP 地址拥有者。 -
虚拟 MAC 地址
:一个虚拟路由器拥有一个虚拟 MAC 地址。虚拟 MAC 地址的格式为 00-00-5E-00-01-{VRID}。通常情况下,虚拟路由器回应 ARP 请求使用的是虚拟 MAC 地址,只有虚拟路由器做特殊配置的时候,才回应接口的真实 MAC 地址。 -
优先级
: VRRP 根据优先级来确定虚拟路由器中每台路由器的地位。 -
非抢占方式
:如果 Backup 路由器工作在非抢占方式下,则只要 Master 路由器没有出现故障,Backup 路由器即使随后被配置了更高的优先级也不会成为Master 路由器。 -
抢占方式
:如果 Backup 路由器工作在抢占方式下,当它收到 VRRP 报文后,会将自己的优先级与通告报文中的优先级进行比较。如果自己的优先级比当前的 Master 路由器的优先级高,就会主动抢占成为 Master 路由器;否则,将保持 Backup 状态。
虚拟路由示意图:
VRRP将局域网内的一组路由器划分在一起,形成一个VRRP备份组,它在功能上相当于一台路由器的功能,使用虚拟路由器号进行标识(VRID)。虚拟路由器有自己的虚拟IP地址和虚拟MAC地址,它的外在变现形式和实际的物理路由完全一样。局域网内的主机将虚拟路由器的IP地址设置为默认网关,通过虚拟路由器与外部网络进行通信。
虚拟路由器是工作在实际的物理路由器之上的。它由多个实际的路由器组成,包括一个Master路由器和多个Backup路由器。 Master路由器正常工作时,局域网内的主机通过Master与外界通信。当Master路由器出现故障时, Backup路由器中的一台设备将成为新的Master路由器,接替转发报文的工作。(路由器的高可用)
VRRP
的工作工程:
(1) 虚拟路由器中的路由器根据优先级选举出 Master。 Master 路由器通过发送免费 ARP 报文,将自己的虚拟 MAC 地址通知给与它连接的设备或者主机,从而承担报文转发任务;
(2) Master 路由器周期性发送 VRRP 报文,以公布其配置信息(优先级等)和工作状况;
(3) 如果 Master 路由器出现故障,虚拟路由器中的 Backup 路由器将根据优先级重新选举新的 Master;
(4) 虚拟路由器状态切换时, Master 路由器由一台设备切换为另外一台设备,新的 Master 路由器只是简单地发送一个携带虚拟路由器的 MAC 地址和虚拟 IP地址信息的ARP 报文,这样就可以更新与它连接的主机或设备中的ARP 相关信息。网络中的主机感知不到 Master 路由器已经切换为另外一台设备。
(5) Backup 路由器的优先级高于 Master 路由器时,由 Backup 路由器的工作方式(抢占方式和非抢占方式)决定是否重新选举 Master。
VRRP优先级的取值范围为0到255(数值越大表明优先级越高)
5 lvs
+ keepalived
+ nginx
架构图
6 环境服务配置
- Nginx 主服务器:
192.168.153.11
- Nginx 备服务器:
192.168.153.12
- Lvs 虚拟 VIP:
192.168.153.13
7 环境搭建
cd /usr/local
1. 下载
keepalived
wget http://www.keepalived.org/software/keepalived-1.2.18.tar.gz
2. 解压安装:
tar -zxvf keepalived-1.2.18.tar.gz -C /usr/local/
3. 下载插件
openssl
yum install -y openssl openssl-devel
4. 开始编译
keepalived
cd keepalived-1.2.18/ && ./configure --prefix=/usr/local/keepalived
编译成功界面:
如果 eepalived
执行./configure --prefix=/usr/local/keepalived
时报错:
configure: error: Popt libraries is required
出现此错误的原因:
未安装 popt 的开发包
解决方法:
yum install popt-devel
安装好 popt 的开发包。重新./configure
即可。
5.
make
一下
make && make install
成功界面:
8 keepalived
安装成 Linux
系统服务
将 keepalived
安装成 Linux
系统服务,因为没有使用 keepalived
的默认安装路径(默认路径:/usr/local
),安装完成之后,需要做一些修改工作:
首先创建文件夹,将 keepalived
配置文件进行复制:
mkdir /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
然后复制 keepalived
脚本文件:
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
ln -s /usr/local/sbin/keepalived /usr/sbin/
ln -s /usr/local/keepalived/sbin/keepalived /sbin/
报错:
可以设置开机启动:
chkconfig keepalived on
8.1 keepalived
常用命令
启动
keepalived
service keepalived start
启动报错:
Starting keepalived (via systemctl): Job for keepalived.service failed. See 'systemctl status keepalived.service' and 'journalctl -xn' for details.
解决办法:
cd /usr/sbin/
rm -f keepalived
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
再启动
keepalived
service keepalived start
启动成功:
停止
keepalived
service keepalived stop
8.2 使用 keepalived
虚拟 VIP
cd /etc/keepalived/
rm -rf keepalived.conf
vi keepalived.conf
! Configuration File for keepalived
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh" #运行脚本,脚本内容下面有,就是起到一个nginx宕机以后,自动开启服务
interval 2 #检测时间间隔
weight -20 #如果条件成立的话,则权重 -20
}
# 定义虚拟路由,VI_1 为虚拟路由的标示符,自己定义名称
vrrp_instance VI_1 {
state MASTER # 来决定主从
interface ens33 # 绑定虚拟 IP 的网络接口,根据自己的机器填写
virtual_router_id 121 # 虚拟路由的 ID 号, 两个节点设置必须一样
mcast_src_ip 192.168.153.11 # 填写本机ip
priority 100 # 节点优先级,主要比从节点优先级高
nopreempt # 优先级高的设置 nopreempt 解决异常恢复后再次抢占的问题
advert_int 1 # 组播信息发送间隔,两个节点设置必须一样,默认 1s
authentication {
auth_type PASS
auth_pass 1111
}
# 将 track_script 块加入 instance 配置块
track_script {
chk_nginx # 执行 Nginx 监控的服务
}
### 虚拟IP地址配置规范
virtual_ipaddress {
192.168.153.13 # 虚拟ip,也就是解决写死程序的ip怎么能切换的ip,也可扩展,用途广泛。可配置多个。
}
}
关闭防火墙:
systemctl stop firewalld
安装
Nginx
cd /usr/local/
wget http://nginx.org/download/nginx-1.9.10.tar.gz
tar -zxvf nginx-1.9.10.tar.gz
cd nginx-1.9.10
./configure
make && make install
修改 html
页面:
启动 Nginx
:
/usr/local/nginx/sbin/nginx
keepalived
service keepalived start
使用虚拟的服务器地址,发现也能访问:http://192.168.153.13/
6.3 nginx
+ keepalived
简单双机主从热备
6.3.1 双机主从热备概述
可以两台机子互为热备,平时各自负责各自的服务。在做上线更新的时候,关闭一台服务器的 tomcat
后,nginx
自动把流量切换到另外一台服务的后备机子上,从而实现无痛更新,保持服务的持续性,提高服务的可靠性,从而保证服务器 7*24
小时运行。
6.3.2 Nginx Upstream
实现简单双机主从热备
搭建
主备
Tomcat
服务器
upstream testproxy {
server 127.0.0.1:8080;
server 127.0.0.1:8081 backup;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://testproxy;
index index.html index.htm;
}
### nginx与上游服务器(真实访问的服务器)超时时间 后端服务器连接的超时时间_发起握手等候响应超时时间
proxy_connect_timeout 1s;
### nginx发送给上游服务器(真实访问的服务器)超时时间
proxy_send_timeout 1s;
### nginx接受上游服务器(真实访问的服务器)超时时间
proxy_read_timeout 1s;
}
只要在希望成为后备的服务器 ip
后面多添加一个 backup
参数,这台服务器就会成为备份服务器。
在平时不使用,nginx
不会给它转发任何请求。只有当其他节点全部无法连接的时候,nginx
才会启用这个节点。
一旦有可用的节点恢复服务,该节点则不再使用,又进入后备状态。
6.3.3 - 6.3.5
:搭建主备
Nginx
服务器
6.3.3 Nginx
+ keepalived
简单双机主从热备
每个服务虚拟安装 keepalived
虚拟一个 VIP
,配置主从关系,当主挂了,直接走备机。
-
Keepalived
虚拟VIP
地址:192.168.153.13 - A 服务器:192.168.153.11
- B 服务器:192.168.153.12
直接克隆
192.168.153.11
为192.168.153.12
6.3.4 修改主 keepalived
信息
修改主 Nginx
服务器 keepalived
文件:
vi /etc/keepalived/keepalived.conf
-
State
为MASTER
-
mcast_src_ip
:192.168.153.11
! Configuration File for keepalived
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh" #运行脚本,脚本内容下面有,就是起到一个nginx宕机以后,自动开启服务
interval 2 #检测时间间隔
weight -20 #如果条件成立的话,则权重 -20
}
# 定义虚拟路由,VI_1 为虚拟路由的标示符,自己定义名称
vrrp_instance VI_1 {
state MASTER # 来决定主从
interface ens33 # 绑定虚拟 IP 的网络接口,根据自己的机器填写
virtual_router_id 121 # 虚拟路由的 ID 号, 两个节点设置必须一样
mcast_src_ip 192.168.153.11 #填写本机ip
priority 100 # 节点优先级,主要比从节点优先级高
nopreempt # 优先级高的设置 nopreempt 解决异常恢复后再次抢占的问题
advert_int 1 # 组播信息发送间隔,两个节点设置必须一样,默认 1s
authentication {
auth_type PASS
auth_pass 1111
}
# 将 track_script 块加入 instance 配置块
track_script {
chk_nginx # 执行 Nginx 监控的服务
}
virtual_ipaddress {
192.168.153.13 # 虚拟ip,也就是解决写死程序的ip怎么能切换的ip,也可扩展,用途广泛。可配置多个。
}
}
6.3.5 修改从 keepalived
信息
修改主 Nginx
服务器 keepalived
文件
/etc/keepalived/keepalived.conf
-
State
为BACKUP
-
mcast_src_ip
:192.168.153.12
! Configuration File for keepalived
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh" #运行脚本,脚本内容下面有,就是起到一个nginx宕机以后,自动开启服务
interval 2 # 检测时间间隔
weight -20 # 如果条件成立的话,则权重 -20
}
# 定义虚拟路由,VI_1 为虚拟路由的标示符,自己定义名称
vrrp_instance VI_1 {
state BACKUP # 来决定主从
interface ens33 # 绑定虚拟 IP 的网络接口,根据自己的机器填写
virtual_router_id 121 # 虚拟路由的 ID 号, 两个节点设置必须一样
mcast_src_ip 192.168.153.12 # 填写本机ip
priority 100 # 节点优先级,主要比从节点优先级高
nopreempt # 优先级高的设置 nopreempt 解决异常恢复后再次抢占的问题
advert_int 1 # 组播信息发送间隔,两个节点设置必须一样,默认 1s
authentication {
auth_type PASS
auth_pass 1111
}
# 将 track_script 块加入 instance 配置块
track_script {
chk_nginx # 执行 Nginx 监控的服务
}
virtual_ipaddress {
192.168.153.13 # 虚拟ip,也就是解决写死程序的ip怎么能切换的ip,也可扩展,用途广泛。可配置多个。
}
}
总结
Keepalived
是在 LVS
基础上,实现心跳检测、监控服务器实现故障转移,如果服务器发生宕机的时候,会尝试自动重试脚本。如果多次重试还是失败,会发送邮件给运维人员。
在生产环境上的服务器发生宕机的时候,怎么处理?
- 故障转移
- 心跳检测
- 负载均衡
- 自动重启
6.4 nginx
+ keepalived
实现高可用
写入 nginx_check.sh
脚本:
vi /etc/keepalived/nginx_check.sh
#!/bin/bash
A=`ps -C nginx –no-header |wc -l`
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived
fi
fi
注意:该脚本一定要授权
chmod 777 nginx_check.sh
推荐阅读
-
Nginx+Tomcat搭建高性能负载均衡集群的实现方法
-
10分钟搭建服务器集群——Windows7系统中nginx与IIS服务器搭建集群实现负载均衡
-
Nginx+Tomcat搭建高性能负载均衡集群的实现方法
-
Nginx系列教程(14) - LVS+KeepAlived+Nginx实现高性能负载均衡集群
-
基于Docker搭建lvs+keepalived+nginx实现高性能负载均衡集群
-
1 -【 高性能 Nginx 服务器 】- 10 lvs + keepalived + nginx 实现高性能负载均衡集群
-
10分钟搭建服务器集群——Windows7系统中nginx与IIS服务器搭建集群实现负载均衡
-
基于nginx+swoole+phalcon+atlas实现的高性能负载均衡集群系列之【构建篇】