负载均衡之-LVS

负载均衡用的很多,这里对负载均衡做一个总结吧,总共包含下面几片博文。

  • LVS负载均衡
  • keepalived负载均衡+高可用
  • haproxy负载均衡
  • nginx负载均衡

LVS负载均衡

LVS是章文嵩博士开发的一个基于linux内核的项目,国内有着比较清晰中文描述http://www.linuxvirtualserver.org/zh/lvs1.html ,在这里只是对这个项目做一些概述,方便查看!

针对高可伸缩、高可用网络服务的需求,我们给出了基于IP层和基于内容请求分发的负载平衡调度解决方法,并在Linux内核中实现了这些方法,将一组服务器构成一个实现可伸缩的、高可用网络服务的虚拟服务器。

虚拟服务器的体系结构如下所示,一组服务器通过高速的局域网或者地理分布的广域网相互连接,在它们的前端有一个负载调度器(Load Balancer)。负载调度器能无缝地将网络请求调度到真实服务器上,从而使得服务器集群的结构对客户是透明的,客户访问集群系统提供的网络服务就像访 问一台高性能、高可用的服务器一样。客户程序不受服务器集群的影响不需作任何修改。系统的伸缩性通过在服务机群中透明地加入和删除一个节点来达到,通过检 测节点或服务进程故障和正确地重置系统达到高可用性。由于我们的负载调度技术是在Linux内核中实现的,我们称之为Linux虚拟服务器(Linux Virtual Server)

Linux Virtual Server项目的目标 :使用集群技术和Linux操作系统实现一个高性能、高可用的服务器,它具有很好的可伸缩性(Scalability)、可靠性(Reliability)和可管理性(Manageability)。

在LVS框架中,提供了含有三种IP负载均衡技术的IP虚拟服务器软件IPVS、基于内容请求分发的内核Layer-7交 换机KTCPVS和集群管理软件。但是我们主要说明基于ip虚拟服务器软件IPVS的实现!

ip虚拟服务器软件ipvs有三种方式8中调度算法来实现负载均衡

LVS集群通用体系结构

直白一点,负载均衡就是把原来一个机器干和活,按照一定的规则分配给多个机器一起工作!【单台机器提供的计算能力是有限的】

在一个框架中,加入了负载均衡之后,会是怎么样的?

用户的请求通过网络连接到虚拟ip(virtual ip addresss),然后通过调度器(load balancer)把用户的请求转发到后端真实的服务器(real server)!整个在后端转发的过程对用户来说是不可见的,用户不必要关心后端的转发,只需要把请求发往对应的VIP即可!

LVS的三层结构如下:

  1. 调度器,主要用来处理用户的请求,把用户的请求发送给后面的真实服务器!
  2. 服务器池,真实的服务器,接收来自调度器转发的用户请求。
  3. 共享存储,它为服务器池提供一个共享的存储区,这样很容易使得服务器池拥有相同的内容,提供相同的服务。

调度器是服务器集群系统的唯一入口点(Single Entry Point),它可以采用IP负载均衡技术、基于内容请求分发技术或者两者相结合。在IP负载均衡技术中,需要服务器池拥有相同的内容提供相同的服务。当 客户请求到达时,调度器只根据服务器负载情况和设定的调度算法从服务器池中选出一个服务器,将该请求转发到选出的服务器,并记录这个调度;当这个请求的其 他报文到达,也会被转发到前面选出的服务器。在基于内容请求分发技术中,服务器可以提供不同的服务,当客户请求到达时,调度器可根据请求的内容选择服务器 执行请求。因为所有的操作都是在Linux操作系统核心空间中将完成的,它的调度开销很小,所以它具有很高的吞吐率。但是一般选择的是基于IP的负载均衡技术。

服务器池的结点数目是可变的。当整个系统收到的负载超过目前所有结点的处理能力时,可以在服务器池中增加服务器来满足不断增长的请求负载。对大多数 网络服务来说,请求间不存在很强的相关性,请求可以在不同的结点上并行执行,所以整个系统的性能基本上可以随着服务器池的结点数目增加而线性增长。

共享存储通常是数据库、网络文件系统或者分布式文件系统。

LVS负载集群中的IP负载均衡技术

ip负载均衡技术的实现主要有三种方式:

  • 通过网络地址转换的VS/NAT方式
  • 通过直接路由实现的VS/DR方法。
  • 通过IP隧道技术实现的VS/TUN方式

这片博客中对LVS的三种方式做了详细的说明

VS/NAT:

就是网络地址翻译技术实现虚拟服务器,当用户请求到达调度器时,调度器将请求报文的目标地址改写成选定的real server地址,同时将报文的目标端口也改成选定的real server的相应的端口,最后将报文请求发送到选定的real server。在服务器端得到数据后,real server将数据返回给客户时,需要再次经过负载调度器将报文的源地址和源端口改成虚拟ip地址和相应的端口,然后把数据发送给用户,完成整个负载调度过程。在整个过程中,对用户来说就是虚拟IP在对外提供服务,后端的转发是不可见的!在NAT的方式下,用户请求和响应报文都必须经过director地址重写,当用户请求越来越多时,调度器的处理能力将称为瓶颈!

 

VS/TUN:

在VS/NAT 的集群系统中,请求和响应的数据报文都需要通过负载调度器,当真实服务器的数目在10台和20台之间时,负载调度器将成为整个集群系统的新瓶颈。大多数 Internet服务都有这样的特点:请求报文较短而响应报文往往包含大量的数据。如果能将请求和响应分开处理,即在负载调度器中只负责调度请求而响应直 接返回给客户,将极大地提高整个集群系统的吞吐量。

IP隧道(IP tunneling)是将一个IP报文封装在另一个IP报文的技术,这可以使得目标为一个IP地址的数据报文能被封装和转发到另一个IP地址。IP隧道技 术亦称为IP封装技术(IP encapsulation)。【把用户请求的ip报文封装成svip报文,发给real server,然后real server直接发送响应给用户】。

这里请求和响应只经过了一次调度器!

 

VS/DR:

也就是用直接路由技术实现虚拟服务器。这种方式的连接调度和管理与前两种一样,但它的报文的转发方法有所不同,VS/DR通过改写请求报文的mac地址,将请求发送到real server,而real server将响应直接返回客户端。这是三种调度算法中性能最好的,但是要求director server与real server必须由一块网卡连在同一物理网段上。

以上是IPVS中的三种处理请求和响应的技术,上面提到,调度器利用这三种技术中的某一个把请求发送到后方的real server。那么调度器是使用什么样的方式来选择后面的real server的?总共有8种调度算法!

  1. 轮叫调度:也叫1:1调度,调度器通过轮叫调度算法将外部用户请求顺序按1:1地分配到集群种每个real sever种。这种算法平等地对待每一台real server,而不管服务器上实际的负载状况和连接状况。
  2. 加权轮叫调度:加权轮叫调度算法根据real server的不同处理能力来调度访问请求。可以对每台real server设置不同的调度权值,对性能相对较好的real server可以设置较高的权重,而对处理能力较弱的real server,可以设置较低的权重。这样保证了处理能力强的服务器处理更多的访问流量,充分合理地利用了服务器资源。同时,调度器还可以自动查询real server的负载情况,并动态地调整其权值。
  3. 最少连接调度:调度算法动态的将网络请求调度到已建立的连接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用“最少连接”调度算法可以较好的均衡负载。
  4. 加权最少连接调度:加权最少连接调度,是最少连接调度的超集每个服务节点可以用相应的权重表示其处理能力,而系统管理员可以动态地设置相应的权值,默认权值为1.加权最小连接调度在分配新连接请求时尽可能使服务节点已建立的连接数和其权值成正比。
  5. 基于局部性的最少链接调度(Locality-Based Least Connections Scheduling,以下简称为LBLC)算法是针对请求报文的目标IP地址的负载均衡调度,目前主要用于Cache集群系统,因为在Cache集群中 客户请求报文的目标IP地址是变化的。这里假设任何后端服务器都可以处理任一请求,算法的设计目标是在服务器的负载基本平衡情况下,将相同目标IP地址的 请求调度到同一台服务器,来提高各台服务器的访问局部性和主存Cache命中率,从而整个集群系统的处理能力。LBLC调度算法先根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器不 存在,或者该服务器超载且有服务器处于其一半的工作负载,则用“最少链接”的原则选出一个可用的服务器,将请求发送到该服务器。
  6. 带复制的基于局部性最少链接调度(Locality-Based Least Connections with Replication Scheduling,以下简称为LBLCR)算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。它与LBLC算法的不同之处是它要 维护从一个目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。对于一个“热门”站点的服务请求,一台Cache 服务器可能会忙不过来处理这些请求。这时,LBLC调度算法会从所有的Cache服务器中按“最小连接”原则选出一台Cache服务器,映射该“热门”站 点到这台Cache服务器,很快这台Cache服务器也会超载,就会重复上述过程选出新的Cache服务器。这样,可能会导致该“热门”站点的映像会出现 在所有的Cache服务器上,降低了Cache服务器的使用效率。LBLCR调度算法将“热门”站点映射到一组Cache服务器(服务器集合),当该“热 门”站点的请求负载增加时,会增加集合里的Cache服务器,来处理不断增长的负载;当该“热门”站点的请求负载降低时,会减少集合里的Cache服务器 数目。这样,该“热门”站点的映像不太可能出现在所有的Cache服务器上,从而提供Cache集群系统的使用效率。

    LBLCR算法先根据请求的目标IP地址找出该目标IP地址对应的服务器组;按“最小连接”原则从该服务器组中选出一台服务器,若服务器没有超载, 将请求发送到该服务器;若服务器超载;则按“最小连接”原则从整个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该 服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。
  7. 目标地址散列调度(Destination Hashing Scheduling)算法也是针对目标IP地址的负载均衡,但它是一种静态映射算法,通过一个散列(Hash)函数将一个目标IP地址映射到一台服务器。

    目标地址散列调度算法先根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。
  8. 源地址散列调度(Source Hashing Scheduling)算法正好与目标地址散列调度算法相反,它根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。它采用的散列函数与目标地址散列调度算法 的相同。

测试LVS

 后端的真实服务器我们准备两台web服务如下:

#一个显示IP地址,一个显示主机名
[root@test1 ~]# curl 10.0.102.214 The hosname is test3 [root@test1 ~]# curl 10.0.102.204 The host ip is 10.0.102.204

在找一台服务器作为调度器,ip为10.0.102.179!

需要在调度器上安装lvs的核心模块IPVS:

[root@test1 ~]# yum install -y ipvsadm

Ipvsadm常用的语法和格式如下:
ipvsadm -A|E -t|u|f virutal-service-address:port [-s scheduler] [-p [timeout]] [-M netmask]
ipvsadm -D -t|u|f virtual-service-address
ipvsadm -C
ipvsadm -R
ipvsadm -S [-n]
ipvsadm -a|e -t|u|f virtual-service-address:port -r real-server-address:port
[-g|i|m] [-w weight]
ipvsadm -d -t|u|f virtual-service-address -r real-server-address
ipvsadm -L|l [options]
ipvsadm -Z [-t|u|f virtual-service-address]
ipvsadm --set tcp tcpfin udp
ipvsadm –h
其中:
? virtual-service-address:是指虚拟服务器的IP地址,本文是192.168.60.200
? real-service-address:是指Real Server的IP地址,本文是192.168.60.132/144
? scheduler:指定调度算法
ipvsadm命令选项详细含义如下所示:
-A (--add-service) 在内核的虚拟服务器列表中添加一条新的虚拟IP记录。也就是增加一台新的虚拟服务器。虚拟IP也就是虚拟服务器的IP地址。
-E (--edit-service) 编辑内核虚拟服务器列表中的一条虚拟服务器记录
-D (--delete-service) 删除内核虚拟服务器列表中的一条虚拟服务器记录
-C (--clear) 清除内核虚拟服务器列表中的所有记录
-R (--restore) 恢复虚拟服务器规则
-S (--save) 保存虚拟服务器规则,输出为-R 选项可读的格式
-a (--add-server) 在内核虚拟服务器列表的一条记录里添加一条新的Real Server记录。也就是在一个虚拟服务器中增加一台新的Real Server
-e (--edit-server) 编辑一条虚拟服务器记录中的某条Real Server记录
-d (--delete-server) 删除一条虚拟服务器记录中的某条Real Server记录
-L|-l –list 显示内核中虚拟服务器列表
-Z (--zero) 虚拟服务器列表计数器清零(清空当前的连接数量等)
--set tcp tcpfin udp 设置连接超时值
-t 说明虚拟服务器提供的是tcp服务,此选项后面跟如下格式:
[virtual-service-address:port] or [real-server-ip:port]
-u 说明虚拟服务器提供的是udp服务,此选项后面跟如下格式:
[virtual-service-address:port] or [real-server-ip:port]
-f  fwmark 说明是经过iptables标记过的服务类型
-s   此选项后面跟LVS使用的调度算法
有这样几个选项: rr|wrr|lc|wlc|lblc|lblcr|dh|sh
默认的调度算法是: wlc
-p  [timeout] 在某个Real Server上持续的服务时间。也就是说来自同一个用户的多次请求,将被同一个Real Server处理。此参数一般用于有动态请求的操作中,timeout 的默认值为300 秒。例如:-p 600,表示持续服务时间为600秒。
-r 指定Real Server的IP地址,此选项后面跟如下格式:
 [real-server-ip:port]
-g (--gatewaying) 指定LVS 的工作模式为直接路由模式(此模式是LVS 默认工作模式)
-i (-ipip) 指定LVS 的工作模式为隧道模式
-m (--masquerading) 指定LVS 的工作模式为NAT模式
-w (--weight) weight 指定Real Server的权值
-c (--connection) 显示LVS目前的连接信息 如:ipvsadm -L -c
-L --timeout 显示“tcp tcpfin udp”的timeout值,如:ipvsadm -L --timeout
-L --daemon 显示同步守护进程状态,例如:ipvsadm -L –daemon
-L  --stats 显示统计信息,例如:ipvsadm -L –stats
-L  --rate 显示速率信息,例如:ipvsadm -L  --rate
-L  --sort 对虚拟服务器和真实服务器排序输出,例如:ipvsadm -L --sor

DR:直接路由调度算法

上面提到过DR的性能是最好的,首先测试DR调度算法。

在调度器上配置DR模式

首先选择一个虚拟ip,这里选择为10.0.102.110!然后再调度器上执行如下脚本:

#!/bin/bash
#开启调度器的ip转发功能
echo 1 >/proc/sys/net/ipv4/ip_forward ipv=/sbin/ipvsadm vip=10.0.102.110 rs1=10.0.102.214 rs2=10.0.102.204
#在eth0:0上绑定虚拟ip
ifconfig eth0:0 $vip broadcast $vip netmask 255.255.255.255 up
#添加路由规则,指定虚拟ip指向的网卡 route add
-host $vip dev eth0:0 $ipv -C $ipv -A -t $vip:80 -s rr $ipv -a -t $vip:80 -r $rs1 -g -w 1 $ipv -a -t $vip:80 -r $rs2 -g -w 1

 

执行完成之后查看内核中的虚拟地址:

#查看虚拟ip
[root@test1 ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether fa:bc:66:8d:2e:00 brd ff:ff:ff:ff:ff:ff
    inet 10.0.102.179/22 brd 10.0.103.255 scope global eth0
    inet 10.0.102.110/32 brd 10.0.102.110 scope global eth0:0
    inet6 fe80::f8bc:66ff:fe8d:2e00/64 scope link
       valid_lft forever preferred_lft forever

#查看内核中的地址列表
[root@test1 ~]# ipvsadm -L IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 10.0.102.110:http rr -> test2:http Route 1 0 0 -> test3:http Route 1 0 0

然后再后端的real server上执行如下脚本:

#!/bin/bash
vip=10.0.102.110
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip lo:0
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

#这里几个内核参数的修改,推荐博文:https://www.cnblogs.com/lipengxiang2009/p/7451050.htm
arp_ignore和arp_announce参数都和ARP协议相关,主要用于控制系统返回arp响应和发送arp请求时的动作。这两个参数很重要,特别是在LVS的DR场景下,它们的配置直接影响到DR转发是否正常。
arp_ignore参数的作用是控制系统在收到外部的arp请求时,是否要返回arp响应。
  arp_ignore参数常用的取值主要有0,123~8较少用到:
0:响应任意网卡上接收到的对本机IP地址的arp请求(包括环回网卡上的地址),而不管该目的IP是否在接收网卡上。
1:只响应目的IP地址为接收网卡上的本地地址的arp请求。
2:只响应目的IP地址为接收网卡上的本地地址的arp请求,并且arp请求的源IP必须和接收网卡同网段。
3:如果ARP请求数据包所请求的IP地址对应的本地地址其作用域(scope)为主机(host),则不回应ARP响应数据包,如果作用域为全局(global)或链路(link),则回应ARP响应数据包。
4~7:保留未使用
8:不回应所有的arp请求

arp_announce的作用是控制系统在对外发送arp请求时,如何选择arp请求数据包的源IP地址。(比如系统准备通过网卡发送一个数据包a,这时数据包a的源IP和目的IP一般都是知道的,而根据目的IP查询路由表,发送网卡也是确定的,故源MAC地址也是知道的,这时就差确定目的MAC地址了。而想要获取目的IP对应的目的MAC地址,就需要发送arp请求。arp请求的目的IP自然就是想要获取其MAC地址的IP,而arp请求的源IP是什么呢? 可能第一反应会以为肯定是数据包a的源IP地址,但是这个也不是一定的,arp请求的源IP是可以选择的,控制这个地址如何选择就是arp_announce的作用)
  arp_announce参数常用的取值有0,120:允许使用任意网卡上的IP地址作为arp请求的源IP,通常就是使用数据包a的源IP。
1:尽量避免使用不属于该发送网卡子网的本地地址作为发送arp请求的源IP地址。
2:忽略IP数据包的源IP地址,选择该发送网卡上最合适的本地地址作为arp请求的源IP地址。
  sysctl.conf中包含all和eth/lo(具体网卡)的arp_ignore参数,取其中较大的值生效。
arp两个参数说明

在另外一台服务器测试:【因为是轮叫调度,所以会依次出现】

[root@mgt01 ~]# curl 10.0.102.110
The host ip is 10.0.102.204
[root@mgt01 ~]# curl 10.0.102.110
The hosname is test3
[root@mgt01 ~]# curl 10.0.102.110
The host ip is 10.0.102.204
[root@mgt01 ~]# curl 10.0.102.110
The hosname is test3

 这里对两个real server的权重设置都为1!可以在命令更改!

强烈建议手动使用下这个ipvsadm命令,有点意思!上面默认调度算法为rr,我们修改默认调度算法为WRR,然后更改204的权重为3!

[root@test1 ~]# ipvsadm -E -t 10.0.102.110:80 -s wrr              #修改调度算法为wrr
[root@test1 ~]# ipvsadm -e -t 10.0.102.110:80  -r 10.0.102.204:80 -g -w 3       #修改204的权重为3
[root@test1 ~]# ipvsadm -L
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.0.102.110:http wrr
  -> test2:http                   Route   3      0          5         
  -> test3:http                   Route   1      0          5         
[root@test1 ~]#

测试:

[root@mgt01 ~]# curl 10.0.102.110
The host ip is 10.0.102.204
[root@mgt01 ~]# curl 10.0.102.110
The host ip is 10.0.102.204
[root@mgt01 ~]# curl 10.0.102.110
The host ip is 10.0.102.204
[root@mgt01 ~]# curl 10.0.102.110
The hosname is test3
[root@mgt01 ~]# curl 10.0.102.110
The host ip is 10.0.102.204
[root@mgt01 ~]# curl 10.0.102.110
The host ip is 10.0.102.204
[root@mgt01 ~]# curl 10.0.102.110
The host ip is 10.0.102.204
[root@mgt01 ~]# curl 10.0.102.110
The hosname is test3

LVS的NAT方式

准备环境:调度器上需要两个网卡,一个内网网址10.0.102.179,一个外网的ip(10.0.102.110需要对外通信)。

    两个real server: 10.0.102.204, 10.0.102.214.

    切记需要把real server的网关设置为调度器的内网IP。

在调度器做如下设置:

#!/bin/bash
#director服务器上开启路由转发功能
echo 1 >/proc/sys/net/ipv4/ip_forward

#关闭icmp重定向
echo 0 >/proc/sys/net/ipv4/conf/all/send_redirects
echo 0 >/proc/sys/net/ipv4/conf/default/send_redirects
echo 0 >/proc/sys/net/ipv4/conf/eth0/send_redirects
#echo 0 >/proc/sys/net/ipv4/conf/eth1/send_redirects

#设置nat防火墙
iptables -t nat -F
iptables -t nat -X
iptables -t nat -A POSTROUTING -s 10.0.100.0/26 -j MASQUERADE
#注意这里防火墙规则源ip设置
#director设置ipvsadm
IPVSADM='/sbin/ipvsadm'
$IPVSADM -C
$IPVSADM -A -t 10.0.102.110:80 -s wrr 
$IPVSADM -a -t 10.0.102.110:80 -r 10.0.102.204:80 -m -w 3
$IPVSADM -a -t 10.0.102.110:80 -r 10.0.102.214:80 -m -w 2

设置完成之后进行测试!

nat模式没有配通,网络方面不太懂哎,但是之前配通过一次!

线上的环境大多使用的DR模式!

keepalive配置

在上面DR模式中,如果调度器换掉,那么整个集群就会宕掉,因此我们需要对调度器做高可用。在这里我们选择使用keepalive做高可用!

在做高可用的时候,还会用到另外一个HA软件heartbeat,这两个软件虽然有很多相似之处,但是也有些不同!

heartbeat与keepalive的异同:

Keepalived使用的vrrp协议方式,虚拟路由冗余协议 (Virtual Router Redundancy Protocol,简称VRRP);

Heartbeat是基于主机或网络的服务的高可用方式;

keepalived的目的是模拟路由器的双机

heartbeat的目的是用户service的双机

lvs的高可用建议用keepavlived

业务的高可用用heartbeat

keepalived工作原理

keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议

虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该路由器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级选举一个backup当master。这样的话就可以保证路由器的高可用了。

keepalived主要有三个模块,分别是core、check和vrrp。core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。check负责健康检查,包括常见的各种检查方式。vrrp模块是来实现VRRP协议的。

配置keepalived的高可用

后台真实的服务器地址为: 10.0.102.204和10.0.102.214

两台做高可用的服务器为:10.0.102.179和10.0.102.221

在LVS架构中,就是对调度器做高可用,在两台调度器上面安装keepalived!

yum install -y keepalived

分析一个keepalived的配置文件:

1:有一个全局配置部分

! Configuration File for keepalived

global_defs {
   notification_email {            #故障发生时通过email发给谁
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc  #发邮件时候,发件地址
   smtp_server 192.168.200.1                              #smtp服务器地址
   smtp_connect_timeout 30                                #smtp连接超时时间设置
   router_id LVS_DEVEL                                    #标识作用,发邮件时会用到
}

虚拟路由冗余协议配置部分:

vrrp_instance VI_1 {
    state MASTER                     #当前服务器的角色,master或者backup
    interface eth0                   #网卡
    virtual_router_id 51             #虚拟路由id
    priority 100                     #权重
    advert_int 1
    authentication {                #一些认证信息
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {             #虚拟ip的信息
        192.168.200.16
        192.168.200.17
        192.168.200.18
    }
}

虚拟IP对应的真实服务器信息:

virtual_server 172.16.100.196 80 {        #虚拟ip
    delay_loop 6
    lb_algo rr                           #调度算法
    lb_kind DR                           #转发方式
    persistence_timeout 0
    protocol TCP

    real_server 172.16.100.190 80 {
        weight 100
    TCP_CHECK {
        connect_timeout 10
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
    }
    }
   real_server 172.16.100.191 80 {
        weight 100
        TCP_CHECK {
                connect_timeout 10
        nb_get_retry 3
        delay_before_retry 3
        connetc_port 80
        }
    }
}

修改keepalived的配置文件,如下!

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 59
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.102.110
    }
}

virtual_server 10.0.102.110 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 0
    protocol TCP

    real_server 10.0.102.214 80 {
        weight 100
    TCP_CHECK {
        connect_timeout 10
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
    }
    }
   real_server 10.0.102.204 80 {
        weight 100
        TCP_CHECK {
                connect_timeout 10
        nb_get_retry 3
        delay_before_retry 3
        connetc_port 80
        }
    }
}

然后把配置文件拷贝到从上,做如下修改!
state MASTER  #在从上把master修改为BACKUP
priority 100  #把从上的权重设置的低于主,这里也就是设置的低于100

然后开启端口转发功能!
 echo 1 > /proc/sys/net/ipv4/ip_forward
 #主从上都要执行!

在real server上执行如下脚本,脚本内容和上面做LVS时的内容是一样的!

#!/bin/bash
vip=10.0.102.110
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip lo:0
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

然后就可以模仿当前的master挂掉,测试是否可以访问后面的真实server!

使用keepalive测的时候,一个客户端的访问会重定向到某一个real server,如下这个服务器访问一直都是同一个服务器。

[root@test3 ~]# curl 10.0.102.110
The hosname is test3
[root@test3 ~]# curl 10.0.102.110
The hosname is test3
[root@test3 ~]# curl 10.0.102.110
The hosname is test3
[root@test3 ~]# curl 10.0.102.110
The hosname is test3
[root@test3 ~]# curl 10.0.102.110
The hosname is test3
[root@test3 ~]# curl 10.0.102.110
The hosname is test3
[root@test3 ~]# curl 10.0.102.110
The hosname is test3
[root@test3 ~]# curl 10.0.102.110
The hosname is test3
[root@test3 ~]# curl 10.0.102.110
The hosname is test3
[root@test3 ~]# curl 10.0.102.110
The hosname is test3

换一台服务器访问:

[root@test2 ~]# curl 10.0.102.110
The host ip is 10.0.102.204
[root@test2 ~]# curl 10.0.102.110
The host ip is 10.0.102.204
[root@test2 ~]# curl 10.0.102.110
The host ip is 10.0.102.204
[root@test2 ~]# curl 10.0.102.110
The host ip is 10.0.102.204
[root@test2 ~]# curl 10.0.102.110
The host ip is 10.0.102.204
[root@test2 ~]# curl 10.0.102.110
The host ip is 10.0.102.204
[root@test2 ~]# curl 10.0.102.110
The host ip is 10.0.102.204
[root@test2 ~]# curl 10.0.102.110
The host ip is 10.0.102.204

貌似是做了hash一样!

 

最后需要说的是,keepalived调用了内核中的LVS功能,因此可以做负载均衡,而keepalived本身是作为高可用使用的;在MHA集群做VIP漂移时,我们测试了仅使用keepalived作为高可用软件!https://www.cnblogs.com/wxzhe/p/10090936.html

posted @ 2018-12-10 15:55  夜间独行的浪子  阅读(321)  评论(0编辑  收藏  举报