负载均衡用的不少,这里对负载均衡作一个总结吧,总共包含下面几片博文。html
LVS是章文嵩博士开发的一个基于linux内核的项目,国内有着比较清晰中文描述http://www.linuxvirtualserver.org/zh/lvs1.html ,在这里只是对这个项目作一些概述,方便查看!前端
针对高可伸缩、高可用网络服务的需求,咱们给出了基于IP层和基于内容请求分发的负载平衡调度解决方法,并在Linux内核中实现了这些方法,将一组服务器构成一个实现可伸缩的、高可用网络服务的虚拟服务器。linux
虚拟服务器的体系结构以下所示,一组服务器经过高速的局域网或者地理分布的广域网相互链接,在它们的前端有一个负载调度器(Load Balancer)。负载调度器能无缝地将网络请求调度到真实服务器上,从而使得服务器集群的结构对客户是透明的,客户访问集群系统提供的网络服务就像访 问一台高性能、高可用的服务器同样。客户程序不受服务器集群的影响不需做任何修改。系统的伸缩性经过在服务机群中透明地加入和删除一个节点来达到,经过检 测节点或服务进程故障和正确地重置系统达到高可用性。因为咱们的负载调度技术是在Linux内核中实现的,咱们称之为Linux虚拟服务器(Linux Virtual Server)。nginx
Linux Virtual Server项目的目标 :使用集群技术和Linux操做系统实现一个高性能、高可用的服务器,它具备很好的可伸缩性(Scalability)、可靠性(Reliability)和可管理性(Manageability)。web
在LVS框架中,提供了含有三种IP负载均衡技术的IP虚拟服务器软件IPVS、基于内容请求分发的内核Layer-7交 换机KTCPVS和集群管理软件。可是咱们主要说明基于ip虚拟服务器软件IPVS的实现!算法
ip虚拟服务器软件ipvs有三种方式8中调度算法来实现负载均衡!数据库
直白一点,负载均衡就是把原来一个机器干和活,按照必定的规则分配给多个机器一块儿工做!【单台机器提供的计算能力是有限的】后端
在一个框架中,加入了负载均衡以后,会是怎么样的?bash
用户的请求经过网络链接到虚拟ip(virtual ip addresss),而后经过调度器(load balancer)把用户的请求转发到后端真实的服务器(real server)!整个在后端转发的过程对用户来讲是不可见的,用户没必要要关心后端的转发,只须要把请求发往对应的VIP便可!服务器
LVS的三层结构以下:
调度器是服务器集群系统的惟一入口点(Single Entry Point),它能够采用IP负载均衡技术、基于内容请求分发技术或者二者相结合。在IP负载均衡技术中,须要服务器池拥有相同的内容提供相同的服务。当 客户请求到达时,调度器只根据服务器负载状况和设定的调度算法从服务器池中选出一个服务器,将该请求转发到选出的服务器,并记录这个调度;当这个请求的其 他报文到达,也会被转发到前面选出的服务器。在基于内容请求分发技术中,服务器能够提供不一样的服务,当客户请求到达时,调度器可根据请求的内容选择服务器 执行请求。由于全部的操做都是在Linux操做系统核心空间中将完成的,它的调度开销很小,因此它具备很高的吞吐率。可是通常选择的是基于IP的负载均衡技术。
服务器池的结点数目是可变的。当整个系统收到的负载超过目前全部结点的处理能力时,能够在服务器池中增长服务器来知足不断增加的请求负载。对大多数 网络服务来讲,请求间不存在很强的相关性,请求能够在不一样的结点上并行执行,因此整个系统的性能基本上能够随着服务器池的结点数目增长而线性增加。
共享存储一般是数据库、网络文件系统或者分布式文件系统。
ip负载均衡技术的实现主要有三种方式:
在这片博客中对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种调度算法!
带复制的基于局部性最少连接调度(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地址对应的服务器组;按“最小链接”原则从该服务器组中选出一台服务器,若服务器没有超载, 将请求发送到该服务器;若服务器超载;则按“最小链接”原则从整个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该 服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以下降复制的程度。目标地址散列调度(Destination Hashing Scheduling)算法也是针对目标IP地址的负载均衡,但它是一种静态映射算法,经过一个散列(Hash)函数将一个目标IP地址映射到一台服务器。
目标地址散列调度算法先根据请求的目标IP地址,做为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,不然返回空。后端的真实服务器咱们准备两台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模式
首先选择一个虚拟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,1,2,3~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,1,2。 0:容许使用任意网卡上的IP地址做为arp请求的源IP,一般就是使用数据包a的源IP。 1:尽可能避免使用不属于该发送网卡子网的本地地址做为发送arp请求的源IP地址。 2:忽略IP数据包的源IP地址,选择该发送网卡上最合适的本地地址做为arp请求的源IP地址。 sysctl.conf中包含all和eth/lo(具体网卡)的arp_ignore参数,取其中较大的值生效。
在另一台服务器测试:【由于是轮叫调度,因此会依次出现】
[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
准备环境:调度器上须要两个网卡,一个内网网址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模式!
在上面DR模式中,若是调度器换掉,那么整个集群就会宕掉,所以咱们须要对调度器作高可用。在这里咱们选择使用keepalive作高可用!
在作高可用的时候,还会用到另一个HA软件heartbeat,这两个软件虽然有不少类似之处,可是也有些不一样!
Keepalived使用的vrrp协议方式,虚拟路由冗余协议 (Virtual Router Redundancy Protocol,简称VRRP);
Heartbeat是基于主机或网络的服务的高可用方式;
keepalived的目的是模拟路由器的双机
heartbeat的目的是用户service的双机
lvs的高可用建议用keepavlived
业务的高可用用heartbeat
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协议的。
后台真实的服务器地址为: 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做为高可用软件!http://www.javashuo.com/article/p-hkzjkgni-m.html