Skip to content

LVS+Keepalived高可用负载均衡集群架构实践

Keepalived简介

什么是Keepalived:keepalived可以实现服务的高可用或热备,用来防止单点故障的问题;而Keepalived的核心VRRP协议,VRRP协议主要实现了在路由器或三层交换机处的冗余;Keepalived就是使用VRRP协议来实现高可用的;下面一起来看一下Keepalived的原理图:

Keepalived启动后会有三个进程:
    父进程:内存管理,子进程管理
    子进程:VRRP子进程
    子进程:healthchecker子进程

由上图可知:两个子进程都被系统WatchDog看管,两个子进程各自复杂自己的事,healthchecker子进程复杂检查各自服务器的健康程度,例如HTTP,LVS等,如果healthchecker子进程检查到MASTER上服务不可用了,就会通知本机上的VRRP子进程,让它删除通告,并且去掉虚拟IP,转换为BACKUP状态;

Keepalived的设计目标是构建高可用的LVS负载均衡群集,可以调用ipvsadm工具来创建虚拟服务器,管理服务器池,而不仅仅用来做双机热备。通过LVS+Keepalived构建的LVS集群,LVS负载均衡用户请求到后端Real WEB服务器,Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。


使用keepalived构建LVS群集更加简便易用,主要优势体现在:
对LVS负载调度器实现热备切换,提高可用性;
对服务器池中的节点进行健康检查,自动移除失效节点,恢复后再重新加入。


负载均衡架构图:

配置安装LVS+keepalived
1.在Master与Backup服务器上分别安装Ipvsadm、Keepalived软件包、这里使用的是yum安装方式
yum install -y keepalived ipvsadm

注释:IPVSADM理解为IPVS管理工具;LVS(Linux Virtual Server)的核心为IPVS(IP Virtual Server), 从Linux内核版本2.6起,IPVS模块已经编译进了Linux内核。
这里安装Ipvsadm工具主要是为了查看lvs规则使用,不安装ipvsadm工具也能成功配置规则,但不方便。

2.修改Master端的keepalived配置文件
keepalived的文件路径/etc/keepalived/keepalived.conf

vim /etc/keepalived/keepalived.conf   ! Configuration File for keepalived

global_defs {
   notification_email {    #设置邮件报警通知地址,可以设置多个
     admin@fandenggui.com
   }
   notification_email_from root@localhost    #设置报警邮件的发送地址
   smtp_server 127.0.0.1    #设置SMTP server的地址,必须存在
   smtp_connect_timeout 30  #设置连接SMTP server的超时时间
   router_id LVS_MASTER      #运行Keepalived服务器的标识,发邮件时显示在邮件标题中的信息
}

vrrp_instance VI_1 {  #定义VRRP实例,实例名自定义
    state MASTER      #指定Keepalived角色MASTER/BACKUP
    interface eth0    #指定HA监测的接口
    virtual_router_id 51  #虚拟路由标识,1-255之间的数字,在一个VRRP实例中主备服务器ID必须一致
    priority 100      #优先级,数字越大优先级越高,在一个实例中主服务器要高于备服务器的优先级
    advert_int 1      #设置主备之间同步检查的时间间隔(秒)
    authentication {     #设置验证类型和密码
        auth_type PASS   #验证类型(PASS|HA)
        auth_pass mypass #验证密码,一个实例中主备密码要保持一致
    }
    virtual_ipaddress {  #定义虚拟IP地址,可以有多个,每行一个
        10.1.2.100
    }
}

virtual_server 10.1.2.100 80 { #设置虚拟服务器,需要指定虚拟IP与服务端口,用空格隔开
    delay_loop 6  #设置健康检查时间(秒)
    lb_algo rr    #设置负载算法,rr为轮询
    lb_kind DR    #设置负载机制,NAT/TUN/DR三种
    nat_mask 255.255.255.0  #设置掩码
    persistence_timeout 50  #会话保持时间(秒)这个选项对于动态网站非常有用,为集群系统中session共享提供了一个很好的解决方案
    protocol TCP  #指定转发协议类型(TCP/UDP)

    real_server 10.1.2.20 80 { #设置后端服务器节点,指定Real_server的IP与端口,用空格隔开
        weight 1      #配置服务器节点的权重,数字越大权重越高
        TCP_CHECK {    #设置检测Real_server的方式为HTTP协议{TCP_CHECK|HTTP_GET|SSL_GET|MISC_CHECK}
            connect_timeout 3     #设置响应超时时间
            nb_get_retry 3        #设置超时重试次数
            delay_before_retry 3  #设置超时后重试间隔时间
        }
    }
    real_server 10.1.2.21 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

3.将Master服务器节点上的主配置文件拷贝到Backup服务器节点上稍作修改
##修改如下两项 

# vim /etc/keepalived/keepalived.conf 
state BACKUP 
priority 99

4.启动两台服务器上的Keepalived服务并设置为开机自启动

service keepalived start
chkconfig keepalived on

PS:Keepalived的日志信息存储在/var/log/message中

5.开启Master节点与Backup节点服务器的路由转发功能

vim /etc/sysctl.conf
net.ipv4.ip_forward = 1

sysctl -p  #执行该命令,使配置生效


安装配置后端Real Web服务器

1. 出于测试考虑,我先安装Apache服务器,并定义两台WEB页面为不同的内容

yum install httpd -y
vim /var/www/html/index.html
From Real Web 1.....
service httpd start
chkconfig httpd on

在Real Web2上面执行相同的操作,将index.html的内容改为

From Real Web 2.。。。。

2. 使用脚本为两台Real Web服务器配置自动修改内核参数与虚拟IP

vim /etc/init.d/lvsrs
#!/bin/bash
SNS_VIP=10.1.2.100

. /etc/rc.d/init.d/functions

case "$1" in
start)
     /sbin/ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP up
     /sbin/route add -host $SNS_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
     syscty -p > /dev/null 2>&1
     echo "RealServer Start Ok"
     ;;
stop)
     ifconfig lo:0 down
     route del $SNS_VIP >/dev/null 2>&1
     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 "RealServer Stoped"
     ;;
*)
     echo "Usage: $0 {start|stop}"
exit 1
esac
exit 0

chmod +x /etc/init.d/lvsrs  #为脚本添加执行权限
sersvice lvsrs start

3. 在另一台Real Web服务器编辑相同的脚本,并执行启动该脚本。

4.查看节点的VIP地址设置完成与否:

# ip addr show lo
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 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
    inet 10.1.2.100/32 brd 10.1.2.100 scope global lo:0
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever

访问测试:


这里我们用的是轮询调度算法(简称rr),更多算法:点击了解! 


模拟故障发生:

一、模拟lvs层故障,将LVS_Master中的Keepalived服务停止,查看LVS_Slave服务器是否接管所有服务。

1. 默认LVS层只有Master上面有虚拟IP的信息

#LVS_Master执行如下命令:
ip addr show 
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 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 00:0c:29:1f:c8:6f brd ff:ff:ff:ff:ff:ff
    inet 10.1.2.10/24 brd 10.1.2.255 scope global eth1
    inet 10.1.2.100/32 scope global eth0    #这里是虚拟IP
    inet6 fe80::20c:29ff:fe1f:c86f/64 scope link 
       valid_lft forever preferred_lft forever

#LVS_Slave执行同样命令则没有虚拟IP
ip addr show 
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 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 00:0c:29:75:91:de brd ff:ff:ff:ff:ff:ff
    inet 10.1.2.11/24 brd 10.1.2.255 scope global eth0
    inet6 fe80::20c:29ff:fe75:91de/64 scope link 
       valid_lft forever preferred_lft forever

2. 下面我们关闭Master上面的Keepalived,查看相关信息变化:

Master上执行:
service keepalived stop

# LVS_Master中的日志信息:
Oct 10 19:22:02 localhost Keepalived_healthcheckers[21125]: Removing service [10.1.2.20]:80 from VS [10.1.2.100]:80
Oct 10 19:22:02 localhost Keepalived_vrrp[21126]: VRRP_Instance(VI_1) sending 0 priority
Oct 10 19:22:02 localhost Keepalived_vrrp[21126]: VRRP_Instance(VI_1) removing protocol VIPs.
Oct 10 19:22:02 localhost Keepalived_healthcheckers[21125]: Removing service [10.1.2.21]:80 from VS [10.1.2.100]:80
Oct 10 19:22:02 localhost kernel: IPVS: __ip_vs_del_service: enter
Oct 10 19:22:02 localhost Keepalived[21123]: Stopping Keepalived v1.2.13 (03/19,2015)

# LVS_Slave中的日志信息变化:
Oct 10 19:22:03 localhost Keepalived_vrrp[11097]: VRRP_Instance(VI_1) Transition to MASTER STATE
Oct 10 19:22:04 localhost Keepalived_vrrp[11097]: VRRP_Instance(VI_1) Entering MASTER STATE
Oct 10 19:22:04 localhost Keepalived_vrrp[11097]: VRRP_Instance(VI_1) setting protocol VIPs.
Oct 10 19:22:04 localhost Keepalived_healthcheckers[11096]: Netlink reflector reports IP 10.1.2.100 added
Oct 10 19:22:04 localhost Keepalived_vrrp[11097]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth1 for 10.1.2.100
Oct 10 19:22:09 localhost Keepalived_vrrp[11097]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth1 for 10.1.2.100

# 再次查看LVS_Slave中的地址
ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 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 00:0c:29:75:91:de brd ff:ff:ff:ff:ff:ff
    inet 10.1.2.11/24 brd 10.1.2.255 scope global eth1
    inet 10.1.2.100/32 scope global eth0   #多了虚拟IP。
    inet6 fe80::20c:29ff:fe75:91de/64 scope link 
       valid_lft forever preferred_lft forever

3. 测试访问服务是否正常。


4. 如果Master服务器修复好重新上线,则虚拟IP会重新配置到Master上而在Slave上面删除。


二、如果后端Real Web 服务出现故障,则LVS会自动剔除相应故障主机的规则

关闭Real Web 1 上面的httpd服务查看相关信息

# Real Web 1 执行:
service httpd stop

# 产看LVS_Master上的日志信息:
Oct 10 19:36:38 localhost Keepalived_healthcheckers[25886]: TCP connection to [10.1.2.20]:80 failed !!!
Oct 10 19:36:38 localhost Keepalived_healthcheckers[25886]: Removing service [10.1.2.20]:80 from VS [10.1.2.100]:80
Oct 10 19:36:38 localhost Keepalived_healthcheckers[25886]: Remote SMTP server [127.0.0.1]:25 connected.
Oct 10 19:36:38 localhost Keepalived_healthcheckers[25886]: SMTP alert successfully sent.

# 查看LVS_Master上的ipvs规则:
# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.1.2.100:80 rr persistent 50
  -> 10.1.2.21:80                 Route   1      0          0         

# 查看LVS_Slave上的日志信息:
Oct 10 19:36:39 localhost Keepalived_healthcheckers[11096]: TCP connection to [10.1.2.20]:80 failed !!!
Oct 10 19:36:39 localhost Keepalived_healthcheckers[11096]: Removing service [10.1.2.20]:80 from VS [10.1.2.100]:80
Oct 10 19:36:39 localhost Keepalived_healthcheckers[11096]: Remote SMTP server [127.0.0.1]:25 connected.
Oct 10 19:36:39 localhost Keepalived_healthcheckers[11096]: SMTP alert successfully sent.

可以看到当后端Real server出现问题,lvs规则中会剔除故障主机信息,并发送报警邮件。


注:LVS主备中的优先级问题,如果两者优先级一致,则会导致Master故障并修复启动后,并不会重新接管VIP和IPVS规则。虽然经过测试Slave发送故障时候,Master也会再次接管,但是为了避免一些位置问题,实际生产环境中,主节点优先级一定要高于备节点。


Published in服务应用集群架构

Be First to Comment

发表评论

电子邮件地址不会被公开。 必填项已用*标注