LVS Keepalived双机高可用负载均衡搭建

应用环境:

LVS负责多台WEB端的负载均衡(LB);Keepalived负责LVS的高可用(HA),这里介绍主备模型。

测试环境:

未分类

未分类

配置步骤:

1. 安装软件

在LVS-1和LVS-2两台主机上安装ipvsadm和keepalived

~]# yum install ipvsadm keepalived -y  

在两台Web主机上安装Nginx

~]# yum install nginx -y    //修改访问主页内容,方便最后测试,这里改为了Nginx Web 1 [IP:12]和Nginx Web 1 [IP:13]

  

2. 配置Keepalived

说明:keepalived底层有关于IPVS的功能模块,可以直接在其配置文件中实现LVS的配置,不需要通过ipvsadm命令再单独配置。

[root@lvs-1 ~]# vim /etc/keepalived/keepalived.conf    // Master配置好的信息如下 
! Configuration File for keepalived

global_defs {
   router_id LVS        ## 不一定要与主机名相同,也不必与BACKUP的名字一致
}

vrrp_instance VI_1 {      
    state MASTER        ## LVS-1配置了为主,另外一台LVS-2配置为BACKUP
    interface eth0       ## 注意匹配网卡名
    virtual_router_id 51    ## 虚拟路由ID(0-255),在一个VRRP实例中主备服务器ID必须一样
    priority 150        ## 优先级值设定:MASTER要比BACKUP的值大
    advert_int 3        ## 通告时间间隔:单位秒,主备要一致
    authentication {      ##认证机制
        auth_type PASS     ## 默认PASS; 有两种:PASS或AH 
        auth_pass 1111     ## 默认1111; 可多位字符串,但仅前8位有效
    }
    virtual_ipaddress {
        138.138.82.222     ## 虚拟IP;可多个,写法为每行一个
    }
}
virtual_server 138.138.82.222 80 {
    delay_loop 3       ## 设置健康状态检查时间
    lb_algo rr        ## 调度算法,这里用了rr轮询算法,便于后面测试查看
    lb_kind DR        ## 这里测试用了Direct Route 模式,
   # persistence_timeout 1  ## 持久连接超时时间,先注释掉,不然在单台上测试时,全部会被lvs调度到其中一台Real Server
    protocol TCP
    real_server 138.138.82.12 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 10    ##设置响应超时时间
            nb_get_retry 3       ##设置超时重试次数
            delay_before_retry 3   ##设置超时重试间隔时间
            connect_port 80
        }
    }
    real_server 138.138.82.13 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 10
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
}                   

保存,退出;

[root@lvs-2 ~]# vim /etc/keepalived/keepalived.conf     //同样,修改BACKUP上的配置文件,如下
! Configuration File for keepalived

global_defs {
   router_id LVS
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 120
    advert_int 3
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        138.138.82.222
    }
}
virtual_server 138.138.82.222 80 {
    delay_loop 3
    lb_algo rr
    lb_kind DR
   # persistence_timeout 1
    protocol TCP
    real_server 138.138.82.12 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 10
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
    real_server 138.138.82.13 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 10
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
}                   

保存,退出;

启动keepalived

[root@lvs-1 ~]# service keepalived start

[root@lvs-2 ~]# service keepalived start

加入开机启动:

[root@lvs-1 ~]# chkconfig keepalived on

[root@lvs-2 ~]# chkconfig keepalived on

查看:

未分类    

未分类   

说明:

此时,Virtual IP是飘在MASTER上面,如果断开MASTER(关闭MASTER上keepalived),Virtual IP就会飘到BACKUP上;

再当MASTER复活(启动keepalived),Virtual IP会再次回到MATSTER上,可通过/var/log/message查看变更信息;

3. 配置WEB端(两台Nginx)

这里直接给出了配置脚本,方便操作;

用法:~]# sh lvs-web.sh start | stop    //新建一个脚本,假定该脚本名为lvs-web.sh
#!/bin/bash 
VIP=138.138.82.222
case "$1" in
start)
           echo "start LVS of RealServer DR" 
           /sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
           /sbin/route add -host $VIP dev 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
       ;;
stop)
           /sbin/ifconfig lo:0 down
           echo "close LVS of RealServer DR" 
           echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
           echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
           echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
           echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
           ;;

*)
          echo "Usage: $0 {start|stop}" 
          exit 1
esac
exit 0

保存,退出;

运行脚本:    

~]# sh lvs-web.sh start  //启动脚本

    

4. 测试

测试①

若一切顺利,正常测试如下:

~]# while true ; do curl 138.138.82.222; sleep 1;done    //每秒执行一次curl 138.138.82.222

未分类
    
默认现在访问VIP:138.138.82.222,走的是LVS-1(MASTER)

测试②

断开MASTER:VIP飘到BACKUP上,访问VIP正常,Client 轮询依旧;

复活MASTER:VIP飘回MASTER上,访问VIP正常,Client 轮询依旧;    // 成功实现:LVS的高可用 和 Nginx的负载均衡

测试③

手动断开Nginx,然后再手动启动Nginx:

未分类   

结束.

LVS负载均衡架构原理

高可用/集群

Linux Virtual Server
Ipvs : 嵌入到Linux的内核
IPVsadm:管理应用程序

负载均衡器

1、硬件:

 F5BIG-IP
 CitrixNetScaler
 A10

2、软件

 四层:tcp 之上的第四层协议
           LVS:只能操作IP,端口 ,在操作系统内核中。
 七层:http,ajp,https,(应用层)
           nginx
           haproxy
           httpd

调度方法(静态方法和动态方法)

四种静态:

     rr:轮循
     wrr:
     dh:
     sh:

动态调度方法:

     lc:最少连接
               active*256+inactive
               谁的小,挑谁
     wlc:加权最少连接
               (active*256+inactive)/weight
     sed:最短期望延迟
               (active+1)*256/weight
     nq:never queue
     LBLC:基于本地的最少连接
               DH:
     LBLCR:基于本地的带复制功能的最少连接
     默认方法:wlc

类型:

     NAT:地址转换
     DR:直接路由
     TUN:隧道

  NAT:
               集群节点跟director必须在同一个IP网络中;
               RIP通常是私有地址,仅用于各集群节点间的通信;
               director位于client和real server之间,并负责处理进出的所有通信;
               realserver必须将网关指向DIP;
               支持端口映射;
               realserver可以使用任意OS;
               较大规模应该场景中,director易成为系统瓶颈;
               VIP:虚拟服务器地址
               DIP:   转发的网络地址
                RIP:  后端真实主机(后端服务器)
               CIP:客户端IP地址
 DR:  
              集群节点跟director必须在同一个物理网络中;
              后端服务器(真实服务器)可以使用公网地址,实现便捷的远程管理和监控;
              director仅负责处理入站请求,响应报文则由realserver直接发往客户端;
              不支持端口映射;

高可用/集群

VIP(隐藏)的意思:

不对外广播

被叫不响应

Node1
VIP:192.168.1.251
DIP:192.168.239.3
集群服务器

Node2
RIP:192.168.1.248
VIP:192.168.239.10
RS,apache

Node3
RIP:192.168.1.249
VIP:192.168.239.10
RS,apache

TUN:

               集群节点可以跨越Internet;
               RIP必须是公网地址;
               director仅负责处理入站请求,响应报文则由realserver直接发往客户端;
               realserver网关不能指向director;
               只有支持隧道功能的OS才能用于realserver;
               不支持端口映射;

Ipvsadm命令:

  管理集群服务
               添加:-A -t|u|fservice-address [-s scheduler]
                        -t:TCP协议的集群
                        -u:UDP协议的集群
                                 service-address:     IP:PORT
                        -f:FWM: 防火墙标记
                                 service-address:Mark Number
               修改:-E
               删除:-D -t|u|fservice-address

               #ipvsadm -A -t 172.16.100.1:80 -s rr

  管理集群服务中的RS
               添加:-a -t|u|fservice-address -r server-address [-g|i|m] [-w weight]
                          -t|u|f service-address:事先定义好的某集群服务
                          -r server-address: 某RS的地址,在NAT模型中,可使用IP:PORT实现端口映射;
                          [-g|i|m]: LVS类型      
                                 -g:DR
                                 -i:TUN
                                 -m:NAT
                        [-wweight]: 定义服务器权重
               修改:-e
               删除:-d -t|u|fservice-address -r server-address

               #ipvsadm -a -t 172.16.100.1:80 -r 192.168.10.8 –g
               #ipvsadm -a -t 172.16.100.1:80 -r 192.168.10.9 -g
     查看
               -L|l
                        -n:数字格式显示主机地址和端口
                        --stats:统计数据
                        --rate:速率
                        --timeout:显示tcp、tcpfin和udp的会话超时时长
                        -c:显示当前的ipvs连接状况

     删除所有集群服务
               -C:清空ipvs规则
     保存规则
               -S
               #ipvsadm -S > /path/to/somefile
     载入此前的规则:
               -R
               # ipvsadm -R </path/form/somefile

DR模式

VIP: 虚拟主机IP
DIP:
kernelparameter:
arp_ignore:定义接收到ARP请求时的响应级别;
0:只要本地配置的有相应地址,就给予响应;
1:仅在请求的目标(MAC)地址配置请求到达的接口上的时候,才给予响应;

               arp_announce:定义将自己地址向外通告时的通告级别;
                        0:将本地任何接口上的任何地址向外通告;
                        1:试图仅向目标网络通告与其网络匹配的地址;
                        2:仅向与本地接口上(MAC)地址匹配的网络进行通告;

—————————————————————–DR模式示例————————————————————

Lvs DR模式集群步骤

1、 找一台主机作为DR(虚拟服务器),安装ipvsadm

   a) Yum install ipvsadm

2、 在DR设置两个IP地址:

       a) DIP: 192.168.1.134 ,设置静态ID
       b) VIP:192.168.1.200 , ifconfig eth0:1 192.168.1.200/24 (取消绑定ifconfig eth1 down)

3、 找多台机器作为RS(apeche或者tomcat )

   a) 两台:静态设置192.168.1.137
                               192.168.1.138
   b) 修改报文源IP的设置,需要设置内核参数
                    i.  echo 1 >/proc/sys/net/ipv4/conf/eth0/arp_ignore
                    ii. echo 1 >/proc/sys/net/ipv4/conf/all/arp_ignore
                    iii.echo 2 >/proc/sys/net/ipv4/conf/eth0/arp_announce
                    iv.echo 2 >/proc/sys/net/ipv4/conf/all/arp_announce
       c)  在两台机器(RS)上,设置网卡的别名IP:192.168.1.200
                     i. ifconfig lo:0 192.168.1.200 netmask 255.255.255.255 broadcast 192.168.1.200
       d)  在两台机器(RS)上,添加一个路由
                      i. route add -host 192.168.1.200 dev lo:0

4、 DR上需要加一个路由设置:route add -host 192.168.1.200 dev eth0:1

5、 在RS 检查web服务是否正常

6、 在DR上使用ipvsadm添加集群服务

       a)  Ipvsadm –C
       b)  ipvsadm -A -t 192.168.1.200:80-s wlc
       c)  ipvsadm -a -t 192.168.1.200:80-r 192.168.1.137 -g -w 1
       d)  ipvsadm -a -t 192.168.1.200:80-r 192.168.1.138 -g -w 1

脚本

#!/bin/bash
#description : start realserver
VIP=125.38.38.64
/etc/rc.d/init.d/functions
case "$1" in
start)
echo " start LVS of REALServer"
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
/sbin/ifconfig lo:0 $VIP broadcast $VIPnetmask 255.255.255.255 up

;;
stop)
/sbin/ifconfig lo:0 down
echo "close LVS Directorserver"
echo "0">/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0">/proc/sys/net/ipv4/conf/lo/arp_announce
echo "0">/proc/sys/net/ipv4/conf/all/arp_ignore
echo "0">/proc/sys/net/ipv4/conf/all/arp_announce
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac

lvs负载均衡及高可用(heartbeat+ldirectord)集群配置

lvs是一个开源免费的负载均衡软件,能实现多台服务器之间的负载均衡,搭配heartbeat和ldirectord的使用,就能配置成高可用的集群。

服务器环境说明

下面说明本次测试配置的服务器环境。
系统:CentOS-5 32 内核2.6.18-238.el5
因为机器只有两台,所以lvs负载器和后端服务器在同一机器。
node1 192.168.79.130
node2 192.168.79.131
VIP 192.168.79.135
当node1出现故障时,lvs负载器和web服务器转移到node2。
如果机器充足,还是建议lvs负载器和web服务器分开。

软件安装

  1. yum -y install heartbeat heartbeat-ldirectord ipvsadm

配置

主要的配置文件有以下几个:
Authkeys
ha.cf
ldirectord.cf
haresources

authkeys

  1. vi /etc/ha.d/authkeys

代码:

  1. auth 1
  2. 1 crc

ha.cf

  1. vi /etc/ha.d/ha.cf
  1. debugfile /var/log/ha-debug
  2. logfile /var/log/ha-log
  3. logfacility local0
  4. keepalive 8
  5. deadtime 60
  6. warntime 60
  7. initdead 120
  8. udpport 694
  9. ucast eth0 192.168.79.131
  10. auto_failback on
  11. node node1
  12. node node2
  13. respawn hacluster /usr/lib/heartbeat/ipfail
  14. apiauth ipfail gid=haclient uid=hacluster

node2唯一不同是ucast eth0 192.168.79.131,把IP改成node1的IP。

haresources

  1. vi /etc/ha.d/haresources

填入:

  1. node1 lvs IPaddr::192.168.79.135/24/eth0:0 ldirectord

这段代码的意思是双机启动heartbeat时,启动node1的lvs脚本,接着配置vip 192.168.79.135/24/eth0:0,然后启动ldirectord来设置node1成lvs负载器并监控80端口。如果node1出故障,node1的heartbeat将从右到左停止服务,如先停止ldirectord,取消vip等。接着node2将接管node1的所有服务,如vip,web服务等。

ldirectord.cf

  1. vi /etc/ha.d/ldirectord.cf
  1. checktimeout=10
  2. checkinterval=8
  3. autoreload=yes
  4. logfile="/var/log/ldirectord.log"
  5. logfile="local0"
  6. quiescent=no
  7.  
  8. virtual=192.168.79.135:80
  9. real=192.168.79.130:80 gate
  10. real=192.168.79.131:80 gate
  11. service=http
  12. request="test.html"
  13. receive="Test Page"
  14. scheduler=wrr
  15. persistent=30
  16. protocol=tcp
  17. checktype=negotiate
  18. checkport=80

node2配置这文件时,需要把real=192.168.79.130:80 gate删除,因为当lvs负载器转移到node2时,不能把故障机node1添加到虚拟机。

test.html

在网站根目录建立test.html,并写入Test Page字段,这个用来监控web服务器的健康情况。假设根目录为/var/www/html:

  1. echo "Test Page" > /var/www/html/test.html

lvs启动脚本

  1. vi /etc/init.d/lvs

node1上的lvs启动脚本:

  1. #!/bin/bash
  2. /sbin/ipvsadm –set 10 10 10

node1上的lvs启动脚本:

  1. #!/bin/bash
  2. VIP=192.168.79.135
  3. /etc/rc.d/init.d/functions
  4. /sbin/ipvsadm –set 10 10 10
  5. case "$1" in
  6. start)
  7. /sbin/ifconfig lo:0 down
  8. /sbin/ifconfig eth0:0 $VIP broadcast $VIP netmask 255.255.255.255 up
  9. /sbin/route add -host $VIP dev eth0:0
  10. ;;
  11. stop)
  12. /sbin/ifconfig eth0:0 down
  13. /sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
  14. /sbin/route add -host $VIP dev lo:0
  15. ;;
  16. *)
  17. echo "Usage: $0 {start|stop}"
  18. exit 1
  19. esac

最后加上执行权限:

  1. chmod +x /etc/init.d/lvs

主机名及hosts配置

1、对两台机分别设置对应的主机名
192.168.79.130 为 node1
192.168.79.131 为 node2
2、添加主机名解析

  1. vi /etc/hosts
  1. 192.168.79.130 node1
  2. 192.168.79.131 node2

解决arp问题

  1. vi /etc/sysctl.conf
  1. net.ipv4.ip_forward = 1
  2. net.ipv4.conf.lo.arp_ignore = 1
  3. net.ipv4.conf.lo.arp_announce = 2
  4. net.ipv4.conf.all.arp_ignore = 1
  5. net.ipv4.conf.all.arp_announce = 2

立即使内核参数生效:

  1. sysctl -p

lvs测试

测试负载均衡:可以在两台机放入不同的首页内容,在不同的客户端测试是否显示不一样的内容
测试高可用:关掉node1 heartbeat,在node2执行ip a查看是否已经接管vip。
测试ldirectord:ldirectord可以实时监控指定的服务是否可用,如果发现不可用,就会使用ipvsadm把这台故障的机从虚拟机中删除。