基于LVS高可用架构实现Nginx集群分流
Posted 踩踩踩从踩
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于LVS高可用架构实现Nginx集群分流相关的知识,希望对你有一定的参考价值。
前言
前面文章介绍nginx的核心及扩展插件必要的性能优化,以及在nginx中如何实用用https;本篇文章会继续讲解重要的概念 lvs高可用框架,怎么利用虚拟服务,使得nginx高可用,以及 负载均衡策略;基于Keepalived实现LVS高可用,负载均衡器LVS跟Nginx差别
也是源自对应请求量高并发的情况才 nginx集群进行高可用,如何实用lvs进行分流
LVS简介
- 有一个负载调度器—负载均衡
- 内部结构对客户端透明—封装
- 无感知的增删服务节点—可伸缩
- 检测服务健康状态—高可用
这就是lvs达到的效果 ,对于客户端感觉像是一个的样子。
为什么要用LVS
- 基于DNS,DNS将域名解析为服务器的不同IP地址来将请求分发到不同的服务器,实现集群负载
- 基于客户端,客户端需要值得服务集群信息。
- 基于调度程序,调度程序可以以精细的粒度调度请求(例如每个连接) ,以便在服务器之间实更好的负载平衡。
- 基于IP
应用框架结构
LVS如何工作
IPVS - NAT
NAT(Network Address Translation,网络地址转换)是1994年提出的。当在专用网内部的一些主机本来已经分配到了本地IP地址(即仅在本专用网内使用的专用地址),但又想和因特网上的主机通信(并不需要加密)时,可使用NAT方法。
这种方法需要在专用网(私网IP)连接到因特网(公网IP)的路由器上安装NAT软件。装有NAT软件的路由器叫做NAT路由器,它至少有一个有效的外部全球IP地址(公网IP地址)。这样,所有使用本地地址(私网IP地址)的主机在和外界通信时,都要在NAT路由器上将其本地地址转换成全球IP地址,才能和因特网连接。
IPVS - IP TUN
IPVS - DR
高可用Nginx集群安装
如何搭建一个nginx高可用集群
环境准备
两台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服务。
安装LVS
LVS全称为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 InActConn
LVS 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)
基于Keepalived实现LVS高可用
什么是Keepalived
- LVS系统的健康检查
- 实现VRRPv2堆栈以处理负载均衡器故障转移
用 C 编写的路由软件。该项目的主要目标是为 Linux 系统和 Linux 基础设施提供简单而强大的负载平衡和高可用性设施。负载平衡框架依赖于众所周知且广泛使用的Linux 虚拟服务器 (IPVS)内核模块,提供第 4 层负载平衡。保持实现实现一组检查器,以动态和自适应地维护和管理负载平衡服务器池根据他们的健康。另一方面,VRRP协议实现了高可用性。VRRP 是路由器故障转移的基本砖块。此外,Keepalived 还向 VRRP 有限状态机器实施一组挂钩,提供低级和高速协议交互。为了提供最快的网络故障检测,保持实现BFD协议。VRRP 状态过渡可以考虑 BFD 提示以推动快速状态过渡。可独立或全部使用保持框架,以提供弹性基础设施。
Keepalived的设计
Keepalived的结构
健康检查—Checkers
高可用特性—VRRP Stack
LVS和Nginx异同分析
其实都是为了解决高并发的问题。但lvs 从传输层,去处理,当然并发更高。
都有第四层、第七层负载均衡的机制。
Nginx在第7层更加成熟稳定、功能更加丰富,大量的第三方模块和插件。LVS比拟不了,LVS应用层的负债均衡还不够成熟。
LVS处于第四层负债均衡,并且集成到了LInux内核中,基于IP级别的负债均衡,又在内核中,效率更加的高效、Nginx四层负载均衡无法比拟。
得益于Nginx在第7层能拿到更多的数据,功能更强大,才连接tomcat服务器。
keepalived与lvs,他们是一个功能包含关系,keepalived依赖lvs的ipvs模块。keepalived除了能进行负载均衡、还能提供负载均衡、还能提供高可用的特性。单点故障的问题。
以上是关于基于LVS高可用架构实现Nginx集群分流的主要内容,如果未能解决你的问题,请参考以下文章
网站集群架构实战(LVS负载均衡Nginx代理缓存Nginx动静分离Rsync+Inotify全网备份Zabbix自动注册全网监控)--技术流ken