超详细的Nginx负载均衡+高可用配置(亲测附图)

负载均衡

目的:提升吞吐率, 提升请求性能, 提⾼高容灾
Nginx 实现负载均衡用到了 proxy_pass 代理模块核心配置, 将客户端请求代理转发至一组 upstream 虚拟服务池。
负载均衡和反向代理的区别是,反向代理由代理服务器指定特定的服务器去请求资源,而负载均衡中的代理服务器将请求转发给虚拟服务池,具体由那个服务器处理根据相应的算法来定。

环境准备

准备两台主机并且都装有Nginx和Apache或者Tomcat
我的第一个主机A的ip:-.-.-.244;第二个主机B的ip:-.-.-.17
在主机A和主机B的apache访问目录(默认是/var/www/html)下放测试代码loadBalanceTest.html,内容分别为【I am -.-.-.244 server】、 【I am -.-.-.17 server】
环境测试
访问主机B,看到如下页面则说明环境可用,A主机同样的方式。
在这里插入图片描述

配置反向服务代理器

打开A主机的Nginx配置文件,在http模块内server模块外添加代码
在这里插入图片描述
重启A主机的Nginx,【systemctl reload nginx】,在浏览器上访问A主机的loadBalanceTest.html
在这里插入图片描述
可以看到,访问的实际上是B主机上的loadBalanceTest.html页面

配置负载均衡例1

在A和B两台主机上做相同的如下配置
在这里插入图片描述
在这里插入图片描述
现在分别访问三次A主机和B主机都会出现的情况是:I am -.-.-.244 server连续出现两次,第三次是I am -.-.-.17 server,此后的刷新都是按照该规律

配置负载均衡例2

也可以通过不同的的端口做负载均衡配置:

//server.conf
server	{
	listen 8081;
	root	/soft/code1;
	index index.html;
}
server	{
	listen 8082;
	root	/soft/code2;
	index index.html;
}
server	{
	listen 8083;
	root	/soft/code3;
	index index.html;
}
//proxy.conf
upstream	node	{
	server	你的IP:8081;
	server	你的IP:8082;
	server	你的IP:8083;
}
server	{
	server_name	localhost;
	listen	80;
		location	/	{
		proxy_pass	http://node;
		proxy_set_header    Host    $http_host;
		proxy_set_header    X-Real-IP   $remote_addr;
		proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
	}
}

现在通过浏览器访问http://IP:80,则会轮流得到code1 code2 code3下面的index.html页面。

Nginx负载均衡配置状态

状态概述
down当前的server暂不参与负载均衡
backup预留的备份服务器,当其他服务器都挂掉的时候,启用
max_fails允许请求失败的次数 ,如果请求失败次数超过限制,则进过fail_timeout 时间后从虚拟服务池中kill掉该服务器
fail_timeout经过max_fails失败后,服务暂停时间,max_fails设置后,必须设置fail_timeout 值
max_conns限制最大的连接数,用于服务器硬件配置不同的情况下
upstream	node	{
	server	你的IP:8081 down;
	server	你的IP:8082  backup;
	server	你的IP:8083  max_fails=1fail_timeout=10s;
}

Nginx负载均衡调度策略

调度算法概述
轮询逐一轮询,默认方式
weight加权轮询,weight越大,分配的几率越高
ip_hash按照访问IP的hash结果分配,会导致来自同一IP的请求访问固定的一个后台服务器
url_hash按照访问URL的hash结果分配
least_conn最少链接数,那个服务器链接数少就会给分配
hash关键数值hash自定义的key
upstream	node	{
	server	你的IP:8081 weight = 10;
	server	你的IP:8082 weight = 20;
	server	你的IP:8083  weight = 30;
}
upstream	node	{
    hash $request_uri;
	server	你的IP:8081;
	server	你的IP:8082;
	server	你的IP:8083;
}

负载均衡类型划分

按照作用范围划分

GSLB:全局负载均衡,SLB
在这里插入图片描述
上图所示,假如张三在北京,李四在新疆,张三的请求有调度中心节点分配到北京的某个调度节点,在由该节点分配到具体的服务器,但是实际的应用中非常复杂。
在这里插入图片描述
上图是Nginx的典型SLB,调度节点和服务节点在同一个局域网,用户请求由调度节点直接分配到服务节点。

按照负载均衡层级划分

四层代理和七层代理

这里的层是OSI 7层网络模型,OSI 模型是从上往下的,越底层越接近硬件,越往上越接近软件,这七层模型分别是物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。

四层是指传输层的 tcp / udp 。七层是指应用层,通常是http 。

原理:

四层代理:运用NAT技术。NAT英文全称是“Network Address Translation”,中文意思是“网络地址转换”,请求进来的时候,nginx修改数据包里面的目标和源IP和端口,然后把数据包发向目标服务器,服务器处理完成后,nginx再做一次修改,返回给请求的客户端。
七层代理:需要读取并解析http请求内容,然后根据具体内容(url,参数,cookie,请求头)然后转发到相应的服务器,转发的过程是:建立和目标机器的连接,然后转发请求,收到响应数据在转发给请求客户端。

优缺点对比:

从性能上看,四层理论上比七层块,因为七层代理需要解析数据包的具体内容,需要消耗额外的cpu,而四层代理直接根据数据包中的源IP,目的IP和端口进行地址转换。
从灵活性上看,由于四层代理使用的是NAT,nginx并不知道请求的具体内容,因此Nginx可以干的事情很少,但是七层代理中,nginx可以根据请求内容(如url,ip,请求头,参数)等做其他事情,如动态代理(不同的IP或者url分配到不同的服务器上)

现在的CPU等性能都很好,因此四层代理没有明显优势。

搭建Keepalived:(Keepalived需要依赖openssl)

1.下载源码包到/usr/local/keepalived目录

wget http://www.keepalived.org/software/keepalived-2.0.15.tar.gz  //2019年4月前的最新版本

2.解压

tar zxvf keepalived-2.0.15.tar.gz

在这里插入图片描述
3.安装依赖插件

yum install -y gcc openssl-devel popt-devel

4.编译安装

cd keepalived-2.0.15
#指定安装目录
./configure --prefix=/usr/local/keepalived
#编译 安装
make && make install

在这里插入图片描述
5.运行前配置

cp /usr/local/keepalived-1.4.2/keepalived/etc/init.d/keepalived /etc/init.d/

mkdir /etc/keepalived

cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/

cp /usr/local/keepalived-1.4.2/keepalived/etc/sysconfig/keepalived /etc/sysconfig/

cp /usr/local/keepalived/sbin/keepalived /usr/sbin/

使用systemctl start keepalived命令启动服务时,默认会将/etc/sysconfig/keepalived文件中KEEPALIVED_OPTIONS参数作为keepalived服务启动时的参数,并从/etc/keepalived/目录下加载keepalived.conf配置文件,或用-f参数指定配置文件的位置。
在这里插入图片描述
防止出现脑裂现象(主备同时获取了VIP地址)

# 指定keepalived配置的网卡:eth0,固定的VRRP广播地址:224.0.0.18
firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface eth0 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
firewall-cmd --direct --permanent --add-rule ipv4 filter OUTPUT 0 --out-interface eth0 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
firewall-cmd --reload

# 查看配置的规则
firewall-cmd --direct --get-rules ipv4 filter INPUT
firewall-cmd --direct --get-rules ipv4 filter OUTPUT

启动

systemctl start keepalived

查看启动情况

ps -aux |grep keepalived

在这里插入图片描述
查看启动状态

systemctl status keepalived

在这里插入图片描述
查看vip
在这里插入图片描述
查看启动日志

journalctl -xe

查看keepalived日志

tail -f  /var/log/messages

让keepalived监控Nginx的状态来搭建keepalived+Nginx实现负载均衡

进入A主机的目录/etc/keepalived,把已经存在的keepalived.conf改为其他名字,然后重新生成一个名为keepalived.conf的文件,内容如下

  1 ! Configuration File for keepalived
  2 #全局配置
  3 global_defs {
  4 #一个没有重复的名字即可
  5     router_id server_master
  6 }
 12 
 13 vrrp_instance VI_1 {
 14 # 此处不设置为MASTER,代表主服务器
 15     state MASTER
 16 # 网卡名字
 17     interface eth0
 18 # 同一个keepalived集群的virtual_router_id相同
 19     virtual_router_id 51
 20 # 权重,master要大于slave
 21     priority 100
 22 # 主备通讯时间间隔
 23     advert_int 1
 24     authentication {
 25         auth_type PASS
 26         auth_pass 1111
 27     }
 28 #虚拟ip,随便写一个没有被用到的ip,可以直接用keepalived.conf默认vip中的一个
 29     virtual_ipaddress {
 30         192.168.200.16
 31     }
 36 }

在B主机做同样的操作,keepalived.conf内容如下

  1 ! Configuration File for keepalived
  2 #全局配置
  3 global_defs {
  4 #一个没有重复的名字即可
  5     router_id server_slave
  6 }
 12 
 13 vrrp_instance VI_1 {
 14 # 此处不设置为MASTER,代表主服务器
 15     state BACKUP
 16 # 网卡名字
 17     interface eth0
 18 # 同一个keepalived集群的virtual_router_id相同
 19     virtual_router_id 51
 20 # 权重,master要大于slave
 21     priority 99
 22 # 主备通讯时间间隔
 23     advert_int 1
 24     authentication {
 25         auth_type PASS
 26         auth_pass 1111
 27     }
 28 #虚拟ip,随便写一个没有被用到的ip,可以直接用keepalived.conf默认vip中的一个
 29     virtual_ipaddress {
 30         192.168.200.16
 31     }
 36 }

这样,如果主服务器的keepalived停止服务,从服务器会自动接管VIP对外服务;一旦主服务器的keepalived恢复,会重新接管VIP。
验证:
(1)先后在主、从服务器上启动keepalived;
(2)在主服务器上查看是否已经绑定了虚拟IP: ip addr;
(3)停止主服务器上的keepalived,然后在从服务器上查看是否已经绑定了虚拟IP:
(4)启动主服务器上的keepalived,看看主服务器能否重新接管虚拟IP。

但这我们需要的是当NginX停止服务的时候能够自动切换。
keepalived支持配置监控脚本,我们可以通过脚本监控Nginx的状态,如果状态不正常则进行一系列的操作,最终仍不能恢复Nginx则杀掉keepalived,使得从服务器能够接管服务。
让keepalived监控Nginx的状态最简单的做法是监控Nginx进程,更靠谱的做法是检查Nginx端口,最靠谱的做法是检查多个url能否获取到页面。

尝试恢复服务的做法为:如果发现NginX不正常,重启之。等待3秒再次校验,仍然失败则不再尝试。

这里使用nmap检查nginx端口来判断nginx的状态
安装nmap

yum install nmap

生成监控脚本文件

#创建nginx检测脚本
#touch nginx_check.sh

#给脚本增加可执行权限
#chmod +x nginx_check.sh

内容如下

  1 #! /bin/bash
  2 # check nginx server status
  3 NGINX=/usr/sbin/nginx
  4 PORT=80
  5 nmap localhost -p $PORT | grep "$PORT/tcp open"
  6 #echo $?
  7 if [ $? -ne 0 ];then
  8     $NGINX -s stop
  9     $NGINX
 10     sleep 3
 11     nmap localhost -p $PORT | grep "$PORT/tcp open"
 12     [ $? -ne 0 ] && /etc/init.d/keepalived stop
 13 fi

修改A主机的keepalived.conf如下

  1 ! Configuration File for keepalived
  2 #全局配置
  3 global_defs {
  4 #一个没有重复的名字即可
  5     router_id server_master
  6 }
  7 vrrp_script chk_http_port {
  8     script "/etc/keepalived/nginx_check.sh"
  9     interval 1
 10     weight -2
 11 }
 12 
 13 vrrp_instance VI_1 {
 14 # 此处不设置为MASTER,通过priority来竞争master
 15     state MASTER
 16 # 网卡名字
 17     interface eth0
 18 # 同一个keepalived集群的virtual_router_id相同
 19     virtual_router_id 51
 20 # 权重,master要大于slave
 21     priority 100
 22 # 主备通讯时间间隔
 23     advert_int 1
 24     authentication {
 25         auth_type PASS
 26         auth_pass 1111
 27     }
 28     virtual_ipaddress {
 29         192.168.200.16
 30     }
 31 # 与上方nginx运行状况检测呼应
 32     track_script {
 33         chk_http_port
 34     }   
 35 }  

在B主机的keepalived.conf中添加同样的内容,以及生成同样的检测脚本,可以通过scp命令直接将A主机上的检测脚本文件发送给B主机,命令如下

scp nginx_check.sh root@A主机ip:/etc/keepalived/nginx_check.sh

重启keepalived,发现A B两台主机都绑定上了虚拟IP
在这里插入图片描述在这里插入图片描述
先在浏览器上做准备环境中所说的同样的测试,如果结果同准备环境中的结果,说明配置大概没问题。现在,停止A主机上的Nginx,让后去浏览器上通过A主机的IP访问loadBalanceTest.html页面,可以达到同样的效果,说明配置成功。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值