Nginx如何实现动态负载均衡及lvs+keepalived+nginx实现高性能负载均衡集群

Nginx如何实现动态负载均衡

  • 什么是动态负载均衡

  • 具体实现说明

    • 下载安装
    • 解压安装
    • 安装Nginx
    • 配置Nginx
    • 编译Nginx
    • Upstream 动态配置
    • 创建upsync_dump_path
    • 启动consul
  • lvs+keepalived+nginx实现高性能负载均衡集群

  • LVS作用 * Keepalived作用 * keepalived和其工作原理 * 细节说明 * 环境服务配置 * 环境搭建 * keepalived安装成Linux系统服务 * keepalived 常用命令 * 使用keepalived虚拟VIP * Nginx Upstream 实现简单双机主从热备 * Nginx+keepalived简单双机主从热备 * 修改主keepalived信息 * 修改从keepalived信息 * nginx+keepalived实现高可

什么是动态负载均衡

一般情况下,使用nginx搭建的服务器集群,每次修改nginx.conf配置文件都需要重启nginx服务器。动态负载均衡就是修改nginx.conf配置文件后不必重启nginx而使配置生效。

具体实现说明

搭建Nginx+Consul+Upsycn环境。Nginx实现负载均衡和反向代理。Consul是一个开源的注册中心和服务发现的框架。其在Nginx中的动态负载均衡的作用是通过Http api注册和发现服务。Upsycn是新浪微博的开源框架,在Nginx中的动态负载均衡的作用是Consul的后端的server列表,既获得Nginx的上游服务器(Upstream server)信息,并动态的安装更新Nginx的路由信息。

下载安装

  1. 安装Nginx

wget http://nginx.org/download/nginx-1.15.12.tar.gz
作用:实现反向代理、负载负载库

  1. 安装consul

wget https://releases.hashicorp.com/consul/1.3.0/consul_1.3.0_linux_amd64.zip
作用:对动态负载均衡均配置实现注册

  1. 安装nginx-upsync-module

wget https://github.com/weibocom/nginx-upsync-module/archive/master.zip
作用:nginx动态获取最新upstream信息

解压安装

unzip master.zip
unzip consul_0.7.1_linux_amd64.zip
如果解压出现该错误
-bash: unzip: 未找到命令
解决办法
yum -y install unzip

安装Nginx

解压Nginx

tar -zxvf nginx-1.15.12.tar.gz

配置Nginx

groupadd nginx
useradd -g nginx -s /sbin/nologin nginx
mkdir -p /var/tmp/nginx/client/
mkdir -p /usr/local/nginx

编译Nginx

cd nginx-1.15.12

./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_flv_module --with-http_stub_status_module --with-http_gzip_static_module --with-http_realip_module --http-client-body-temp-path=/var/tmp/nginx/client/ --http-proxy-temp-path=/var/tmp/nginx/proxy/ --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi --http-scgi-temp-path=/var/tmp/nginx/scgi --with-pcre --add-module=…/nginx-upsync-module-master
make && make install

编译的是报错
./configure: error: SSL modules require the OpenSSL library.
解决办法
yum -y install openssl openssl-devel

Upstream 动态配置

1##动态去consul 获取注册的真实反向代理地址 2 upstream aaa{ 3 server 127.0.0.1:11111; 4 upsync 192.168.212.134:8500/v1/kv/upstreams/itmayiedu upsync_timeout=6m upsync_interval=500ms upsync_type=consul strong_dependency=off; 5 upsync_dump_path /usr/local/nginx/conf/servers/servers_test.conf; 6 } 7 8 server { 9 listen 80; 10 server_name localhost; 11 12 location / { 13 proxy_pass http://aaa; 14 index index.html index.htm; 15 } 16 } 17 18

upsync指令指定从consul哪个路径拉取上游服务器配置;upsync_timeout配置从consul拉取上游服务器配置的超时时间;upsync_interval配置从consul拉取上游服务器配置的间隔时间;upsync_type指定使用consul配置服务器;strong_dependency配置nginx在启动时是否强制依赖配置服务器,如果配置为on,则拉取配置失败时nginx启动同样失败。upsync_dump_path指定从consul拉取的上游服务器后持久化到的位置,这样即使consul服务器出问题了,本地还有一个备份。

注意:替换 consul 注册中心地址

创建upsync_dump_path

mkdir /usr/local/nginx/conf/servers/
upsync_dump_path指定从consul拉取的上游服务器后持久化到的位置,这样即使consul服务器出问题了,本地还有一个备份。

启动consul

临时关闭防火墙systemctl stop firewalld
我的linux Ip地址192.168.212.131
./consul agent -dev -ui -node=consul-dev -client=192.168.212.131

添加nginx Upstream服务
1.使用linux命令方式发送put请求
curl -X PUT http://192.168.212.134:8500/v1/kv/upstreams/aaa/192.168.212.1:8081
curl -X PUT http://192.168.212.134:8500/v1/kv/upstreams/aaa/192.168.212.1:8081

2.使用postmen 发送put请求
http://192.168.212.134:8500/v1/kv/upstreams/aaa/192.168.212.1:8081 http://192.168.212.134:8500/v1/kv/upstreams/aaa/192.168.212.1:8081

负载均衡信息参数
{“weight”:1, “max_fails”:2, “fail_timeout”:10, “down”:0}
启动Nginx

添加nginx Upstream服务
1.使用linux命令方式发送put请求
curl -X PUT http://192.168.212.134:8500/v1/kv/upstreams/aaa/192.168.212.1:8081
curl -X PUT http://192.168.212.134:8500/v1/kv/upstreams/aaa/192.168.212.1:8081

2.使用postmen 发送put请求
http://192.168.212.134:8500/v1/kv/upstreams/aaa/192.168.212.1:8081 http://192.168.212.134:8500/v1/kv/upstreams/aaa/192.168.212.1:8081

负载均衡信息参数
{“weight”:1, “max_fails”:2, “fail_timeout”:10, “down”:0}
启动Nginx

lvs+keepalived+nginx实现高性能负载均衡集群

LVS作用

LVS是一个开源的软件,可以实现传输层四层负载均衡。LVS是Linux Virtual Server的缩写,意思是Linux虚拟服务器。目前有三种IP负载均衡技术(VS/NAT、VS/TUN和VS/DR);八种调度算法(rr,wrr,lc,wlc,lblc,lblcr,dh,sh)

Keepalived作用

LVS可以实现负载均衡,但是不能够进行健康检查,比如一个rs出现故障,LVS 仍然会把请求转发给故障的rs服务器,这样就会导致请求的无效性。keepalive 软件可以进行健康检查,而且能同时实现 LVS 的高可用性,解决 LVS 单点故障的问题,其实 keepalive 就是为 LVS 而生的。

keepalived和其工作原理

keepalived是一个类似于Layer2,4,7交换机制的软件。是Linux集群管理中保证集群高可用的一个服务软件,其功能是用来防止单点故障。

keepalived的工作原理:
keepalived是基于VRRP协议实现的保证集群高可用的一个服务软件,主要功能是实现真机的故障隔离和负载均衡器间的失败切换,防止单点故障。在了解keepalived原理之前先了解一下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 状态。

环境服务配置

两台Nginx服务器
Nginx 主服务器 192.168.212.143
Nginx 备服务器 192.168.212.144
Lvs 虚拟VIP 192.168.212.110
前面三个一定要相同

环境搭建

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
5.make一下
make && make install

报错: eepalived执行./configure --prefix=/usr/local/keepalived时报错:configure: error: Popt libraries is required
出现此错误的原因:
未安装popt的开发包
解决方法:
yum install popt-devel
安装好popt的开发包。重新./configure 即可。

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,到此我们安装完毕!

keepalived 常用命令

service keepalived start
service keepalived stop

启动报错Starting keepalived (via systemctl): Job for keepalived.service failed. See ‘systemctl status keepalived.service’ and ‘journalctl -xn’ for details.
解决办法
[root@edu-proxy-01 sbin]# cd /usr/sbin/
[root@edu-proxy-01 sbin]# rm -f keepalived
[root@edu-proxy-01 sbin]# cp /usr/local/keepalived/sbin/keepalived /usr/sbin/

使用keepalived虚拟VIP

vi /etc/keepalived/keepalived.conf
virtual_ipaddress {
192.168.110.110 # 虚拟ip,也就是解决写死程序的ip怎么能切换的ip,也可扩展,用途广泛。可配置多个。
}
关闭防火墙
centOS6及以前版本使用命令: systemctl stop iptables.service
centOS7关闭防火墙命令: systemctl stop firewalld.service

Nginx Upstream 实现简单双机主从热备

1upstream testproxy { 2 server 127.0.0.1:8080; 3 server 127.0.0.1:8081 backup; 4 } 5 6 server { 7 listen 80; 8 server_name localhost; 9 10 11 12 location / { 13 proxy_pass http://testproxy; 14 index index.html index.htm; 15 } 16 ###nginx与上游服务器(真实访问的服务器)超时时间 后端服务器连接的超时时间_发起握手等候响应超时时间 17 proxy_connect_timeout 1s; 18 ###nginx发送给上游服务器(真实访问的服务器)超时时间 19 proxy_send_timeout 1s; 20 ### nginx接受上游服务器(真实访问的服务器)超时时间 21 proxy_read_timeout 1s; 22 23 } 24 25

只要在希望成为后备的服务器 ip 后面多添加一个 backup 参数,这台服务器就会成为备份服务器。
在平时不使用,nginx 不会给它转发任何请求。只有当其他节点全部无法连接的时候,nginx 才会启用这个节点。
一旦有可用的节点恢复服务,该节点则不再使用,又进入后备状态

Nginx+keepalived简单双机主从热备

每个服务虚拟安装keepalived 虚拟一个VIP ,配置主从关系,当主挂了,直接走备机。
Keepalived虚拟VIP 地址 192.168.212.110
A 服务器 192.168.212.142
B 服务器 192.168.212.143

修改主keepalived信息

修改主Nginx服务器keepalived文件, /etc/keepalived/keepalived.conf
State 为MASTER

修改从keepalived信息

修改主Nginx服务器keepalived文件, /etc/keepalived/keepalived.conf
State 为BACKUP

nginx+keepalived实现高可

写入nginx_check.sh脚本 /etc/keepalived/nginx_check.sh

1#!/bin/bash 2A=`ps -C nginx –no-header |wc -l` 3if [ $A -eq 0 ];then 4 /usr/local/nginx/sbin/nginx 5 sleep 2 6 if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then 7 killall keepalived 8 fi 9fi 10 11

注意该脚本一定要授权
chmod 777 nginx_check.sh。

本文参考http://www.mayikt.com

代码交流 2021