Keepalived+LVS+nginx搭建nginx高可用集群

LVS有三种调度器:

Virtual Server via Network Address Translation(VS/NAT):这种方式的主要原理是,用户发送请求到虚拟ip上后,lvs会根据负载均衡算法选择一个目标处理服务,然后将请求报文中的目标ip地址修改为计算得到的目标服务器,并且发送给该服务器。对于响应的报文,调度器会将目标服务器返回的响应数据中的源地址修改为虚拟ip地址。通过这种方式,对客户端而言,其形式上面向的是一台服务器。不过这种方式的缺点在于,所有的响应数据都需要通过调度器,如果请求量比较大的情况下,那么调度器就会成为整个系统的瓶颈。

Virtual Server via IP Tunneling(VS/TUN):这种方式主要解决的就是VS/NAT中,响应数据会经过调度器的问题。同VS/NAT一样 ,调度器还是会接收请求的数据,并且将报文中的目标ip修改为目标服务的ip,但是在目标服务处理完数据之后,其会直接将响应报文中的源ip修改为虚拟ip,然后将请求发送给客户端。通过这种方式,响应数据就由各个目标服务进行了处理,而无需通过调度器进行返回,这种方式会大大提高系统的吞吐量,而且由于一般请求报文比响应报文小很多,调度器也只需要处理请求报文,那么系统的整体负载将会被均摊到各个服务器上。

Virtual Server via Direct Routing(VS/DR):这种方式相对于VS/TUN,其主要区别在于,VS/TUN是将请求报文中的ip地址修改为目标服务的ip地址,而VS/DR则是直接将请求报文中的MAC地址修改为目标地址,这种方式效率会更高,因为VS/TUN中的ip地址最终还是需要转换为MAC地址来发送数据的。

开始搭建环境

  1. 环境准备
  2. 4台CentOs7虚拟主机:
  3. 192.168.12.1, 192.168.12.2, 192.168.12.3, 192.168.12.4
  4. 系统服务:LVS, Keepalived
  5. Web服务器:nginx
  6. 集群搭建:LVS DR模式
  7. 软件安装
    在四台虚拟机上,我们以如下方式搭建集群:
192.168.12.1 lvs+keepalived
192.168.12.2 lvs+keepalived
192.168.12.3 nginx
192.168.12.4 nginx
    这里我们使用192.168.12.1和192.168.12.2两台机器作为lvs+keepalived的工作机器,也就是说这两台机器的作用主要是进行负载均衡和故障检测和下线的;我们使用192.168.12.3和192.168.12.4两台机器作为应用服务器,主要是对外提供服务的。这四台服务器作为整个后端集群服务,并且对外提供的虚拟ip是192.168.12.5。需要说明的是,这里的keepalived所检测的服务是两台lvs服务器,这两台服务器,一台作为master服务器,一台作为backup服务器,两者在负载均衡的配置上是完全一样的。在正常情况下,客户端请求虚拟ip的时候,lvs会将该请求转发到master服务器上,然后master服务器根据配置的负载均衡策略选择一台应用服务器,并且将请求发送给该应用服务器进行处理。如果在某个时刻,lvs的master服务器由于故障宕机了,keepalived就会检测到该故障,并且进行故障下线,然后将backup机器上线用于提供服务,从而实现故障转移的功能。

2.1 lvs+keepalived安装
在192.168.12.1和192.168.12.2上安装ipvs和keepalived:
安装ipvs
sudo yum install ipvsadm

安装keepalived
sudo yum install keepalived

在192.168.12.3和192.168.12.4上安装nginx:
安装nginx
sudo yum install nginx

需要注意的是,在两台nginx服务器上需要将防火墙关闭,否则lvs+keepalived的两台机器就无法将请求发送到两台nginx服务器上来:

关闭防火墙
systemctl disable firewalld.service

查看两台负载均衡机器是否支持lvs:
sudo lsmod |grep ip_vs

 如果看到如下结果,则说明是支持的
[xxxx@localhost ~]$ sudo lsmod|grep ip_vs
ip_vs                 145497  0
nf_conntrack          137239  1 ip_vs
libcrc32c              12644  3 xfs,ip_vs,nf_conntrack

如果上述命令没有任何结果,则执行sudo ipvsadm命令启动ipvs之后,再通过上述命令进行查看即可。启动ipvs之后,我们就可以在/etc/keepalived/目录下编辑keepalived.conf文件,我们以192.168.12.1机器作为master机器,master节点配置如下:

Global Configuration

global_defs {
  lvs_id director1  # 指定lvs的id
}

VRRP Configuration

vrrp_instance LVS {
  state MASTER	# 指定当前节点为master节点
  interface ens33	# 这里的ens33是网卡的名称,通过ifconfig或者ip addr可以查看
  virtual_router_id 51	# 这里指定的是虚拟路由id,master节点和backup节点需要指定一样的
  priority 151	# 指定了当前节点的优先级,数值越大优先级越高,master节点要高于backup节点
  advert_int 1	# 指定发送VRRP通告的间隔,单位是秒
  authentication {
    auth_type PASS	# 鉴权,默认通过
    auth_pass 123456	# 鉴权访问密码
  }

  virtual_ipaddress {
    192.168.12.5	# 指定了虚拟ip
  }

}

Virtual Server Configuration - for www server

后台真实主机的配置
virtual_server 192.168.12.5 80 {
  delay_loop 1	# 健康检查的时间间隔
  lb_algo rr	# 负载均衡策略,这里是轮询
  lb_kind DR	# 调度器类型,这里是DR
  persistence_time 1	# 指定了持续将请求打到同一台真实主机的时间长度
  protocol TCP	# 指定了访问后台真实主机的协议类型

  # Real Server 1 configuration
  # 指定了真实主机1的ip和端口
  real_server 192.168.12.3 80 {
    weight 1	# 指定了当前主机的权重
    TCP_CHECK {
      connection_timeout 10	# 指定了进行心跳检查的超时时间
      nb_get_retry 3	# 指定了心跳超时之后的重复次数
      delay_before_retry 3	# 指定了在尝试之前延迟多长时间
    }
  }

Real Server 2 Configuration

real_server 192.168.12.4 80 {
    weight 1	# 指定了当前主机的权重
    TCP_CHECK {
      connection_timeout 10	# 指定了进行心跳检查的超时时间
      nb_get_retry 3	# 指定了心跳超时之后的重复次数
      delay_before_retry 3	# 指定了在尝试之前延迟多长时间
    }
  }
}
    上面是master节点上keepalived的配置,对于backup节点,其配置与master几乎是一致的,只是其state和priority参数不同。如下是backup节点的完整配置:

Global Configuration

global_defs {
  lvs_id director2  # 指定lvs的id
}

VRRP Configuration

vrrp_instance LVS {
  state BACKUP	# 指定当前节点为master节点
  interface ens33	# 这里的ens33是网卡的名称,通过ifconfig或者ip addr可以查看
  virtual_router_id 51	# 这里指定的是虚拟路由id,master节点和backup节点需要指定一样的
  priority 150	# 指定了当前节点的优先级,数值越大优先级越高,master节点要高于backup节点
  advert_int 1	# 指定发送VRRP通告的间隔,单位是秒
  authentication {
    auth_type PASS	# 鉴权,默认通过
    auth_pass 123456	# 鉴权访问密码
  }

  virtual_ipaddress {
    192.168.12.5	# 指定了虚拟ip
  }

}

Virtual Server Configuration - for www server
后台真实主机的配置

virtual_server 192.168.12.5 80 {
  delay_loop 1	# 健康检查的时间间隔
  lb_algo rr	# 负载均衡策略,这里是轮询
  lb_kind DR	# 调度器类型,这里是DR
  persistence_time 1	# 指定了持续将请求打到同一台真实主机的时间长度
  protocol TCP	# 指定了访问后台真实主机的协议类型

  # Real Server 1 configuration
  # 指定了真实主机1的ip和端口
  real_server 192.168.12.3 80 {
    weight 1	# 指定了当前主机的权重
    TCP_CHECK {
      connection_timeout 10	# 指定了进行心跳检查的超时时间
      nb_get_retry 3	# 指定了心跳超时之后的重复次数
      delay_before_retry 3	# 指定了在尝试之前延迟多长时间
    }
  }

Real Server 2 Configuration

 real_server 192.168.12.4 80 {
    weight 1	# 指定了当前主机的权重
    TCP_CHECK {
      connection_timeout 10	# 指定了进行心跳检查的超时时间
      nb_get_retry 3	# 指定了心跳超时之后的重复次数
      delay_before_retry 3	# 指定了在尝试之前延迟多长时间
    }
  }
}
   将master和backup配置成完全一样的原因是,在master宕机时,可以根据backup的配置进行服务的无缝切换。

在lvs+keepalived机器配置完成之后,我们下面配置两台应用服务器的nginx配置。这里我们是将nginx作为应用服务器,在其配置文件中配置返回状态码为200,并且会将当前主机的ip返回,如下是其配置:

worker_processes auto;
#pid /run/nginx.pid;

events {
  worker_connections 786;
}

http {
  server {
    listen 80;

    # 这里是直接返回200状态码和一段文本
    location / {
      default_type text/html;
      return 200 "Hello, Nginx! Server xxxx@192.168.12.3\n";
    }
  }
}
worker_processes auto;
#pid /run/nginx.pid;
events {
  worker_connections 786;
}

http {
  server {
    listen 80;

    # 这里是直接返回200状态码和一段文本
    location / {
      default_type text/html;
      return 200 "Hello, Nginx! Server xxx@192.168.12.4\n";
    }
  }
}
    可以看到,两台机器返回的文本中主机ip是不一样的。nginx配置完成后,可以通过如下命令进行启动:

sudo nginx
在启动nginx之后,我们需要配置虚拟ip,这是因为我们使用的lvs调度器是DR模式,前面我们讲到过,这种模式下,对客户端的响应是真实服务器直接返回给客户端的,而真实服务器需要将响应报文中的源ip修改为虚拟ip,这里配置的虚拟ip就是起这个作用的。
我们进入/etc/rc.d/init.d/目录下:
在这里插入图片描述

创建realserver 文件,写入如下内容:
在这里插入图片描述

#!/bin/bash

ifconfig lo:0 192.168.12.5 netmask 255.255.255.255 broadcast 192.168.12.5 up
route add -host 192.168.12.5 dev lo:0

echo "0" > /proc/sys/net/ipv4/ip_forward
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

exit 0

lo:表示当前主机真实网卡的名称;

192.168.12.5:表示虚拟ip;

    编写完成后运行该脚本文件即可。然后将两台lvs+keepalived机器上的keepalived服务启动起来即可:service realserver start

sudo service keepalived start
启动的时候,注意,先给文件附上权限。

最后可以通过如下命令查看配置的lvs+keepalived的策略:

[xxx@localhost keepalived]$ sudo ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.12.5:80 rr
-> 192.168.12.3:80 Route 1 0 0

2.2 集群测试
根据上述步骤,我们配置完成了一个lvs+keepalived+nginx的集群。在浏览器中,我们可以访问http://192.168.12.5即可看到如下响应:

Hello, Nginx! Server xxxx@192.168.12.3
多次刷新浏览器之后,可以看到浏览器中显示的文本切换如下,这是因为lvs的负载均衡策略产生的:

Hello, Nginx! Server xxxx@192.168.12.4

3. 小结
本文首先对lvs和keepalived的工作原理进行了讲解,分别介绍了其工作的几种模式,然后对lvs+keepalived+nginx搭建nginx集群的方式进行详细讲解,并且说明了其中所需要注意的问题。

搭建LVSKeepalivedNginx的步骤如下: 1. 安装Nginx 在Linux系统中,可以使用以下命令安装Nginx: ```bash sudo apt-get update sudo apt-get install nginx ``` 2. 安装Keepalived 在Linux系统中,可以使用以下命令安装Keepalived: ```bash sudo apt-get install keepalived ``` 3. 配置Nginx 编辑Nginx配置文件,通常位于`/etc/nginx/nginx.conf`,在`http`块中添加以下内容: ```nginx http { upstream backend { server backend1.example.com; server backend2.example.com; } server { listen 80; location / { proxy_pass http://backend; } } } ``` 这里,我们定义了一个名为`backend`的上游服务器组,包含两个后端服务器。然后,我们在`server`块中配置了一个简单的反向代理,将请求转发到`backend`上游服务器组。 4. 配置Keepalived 创建一个新的Keepalived配置文件,通常位于`/etc/keepalived/keepalived.conf`,并添加以下内容: ```conf global_defs { router_id LVS_DEVEL } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.1.100/24 dev eth0 label eth0:100 } } ``` 这里,我们定义了一个名为`VI_1`的VRRP实例,设置了其角色为`MASTER`,并将虚拟IP地址设置为`192.168.1.100/24`。请根据实际情况修改网络接口名称和IP地址。 5. 启动服务并设置开机自启动 启动NginxKeepalived服务,并将它们设置为开机自启动: ```bash sudo systemctl start nginx sudo systemctl enable nginx sudo systemctl start keepalived sudo systemctl enable keepalived ``` 至此,LVSKeepalivedNginx已经搭建完成。现在可以通过访问Nginx服务器的IP地址来测试配置是否正确。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值