一、lvs介绍
lvs是一款负载均衡服务器软件,它可以将客户端的请求根据分发服务器(directory,以下简称dir)的算法,分配到后端真实的资源服务器。资源服务器收到请求后通过不同的模式机制再返回到客户端。这里我们需要了解lvs的三种实现模式和八种调度算法。
上面这个图就是公司架构的一部分,有lvs的负载均衡、nginx/apache服务、mysql等后端服务、cacti\nagio监控服务等,这样组成了一个客户访问架构。绿色的线就是用户访问请求的数据流向。用户-->LVS负载均衡服务器--->apahce服务器--->mysql服务器&memcache服务器&共享存储服务器。并且我们的mysql、共享存储也能够使用LVS再进行负载均衡。
LVS更深层理解: lvs原理:http://www.it165.net/admin/html/201401/2248.html
lvs的模式:http://blog.csdn.net/pi9nc/article/details/23380589
常用的负载均衡软件很多,lvs只是一种,常见的还有nginx、hadproxy等。硬件设备也有很多,如F5,netscale
负载均衡软件对比、HA高可用集群软件对比:http://zhengdl126.iteye.com/blog/1738012
二、keepalived简介
keepalived即可以用做HA集群功能,同时又有负载均衡的功能。比如我们使用的后端的真实服务器(realserver,以下简称rs)宕机后,如果没有keepalived支持,那么dir服务器仍然会根据算法将客户的请求发送到这台宕机的rs上,那么返回给客户端的就是不能访问资源。当使用keepalived支持的时候,它不但可以监测rs的状态(即监测rs不正常工作后,会将客户请求不在发往这个rs),还可以监测dir的状态(监测分发服务器状态,可以将dir服务器分成主从高可用,监测到主挂后可以有从dir分发),保证dir服务器不间断向后端rs服务器发送请求,rs服务器也会不间断向用户响应,持续高效的工作。
常用的HA集群的软件还有heartbeat等。keepalived配置文件简单,只有一个配置文件,不像heartbeat有三个配置文件需要配置三个地方。
这里我们说的是lvs和keepalived的结合使用。
三、lvs和keepalived安装配置
由于要做HA集群,还要做LB集群,HA要搭建主从需要2台服务器,LB集群rs服务器也至少需要2台.由于我是在虚拟机上操作的,资源不够用,所以只准备了三台服务器。
第一台服务器用作主dir服务器,用于主分发。(eth0:192.168.2.234)
第二台服务器用作从dir服务器和其中一台rs1服务器,用于从分发并提供访问资源. (eth1:192.168.2.223)
第三台服务器用于rs2服务器,用于提供访问资源.(eth0:192.168.2.222)
另外还需要一个VIP:设置在dir上,192.168.2.19
我们只是为了显示效果可以实现
1.安装HA集群
(1)在第一台主dir服务器上安装keepalived
yum install -y keepalived (需要提前安装epel)
(2)配置
vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
state MASTER #配置主,若是从改成BACKUP
interface eth0 #注意网卡,须是本机的网卡
virtual_router_id 51 #id号
priority 100 #优先级,100最高,若是从改成100以下
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.2.19 #VIP,即对外的IP,用户访问的IP。可以添加多个VIP
}
}
#下面是配置VIP对应的真实服务器,也可以添加多个VIP配置
virtual_server 192.168.2.19 80 {
delay_loop 6 #每隔多少秒keepalived监测rs的状态
lb_algo rr #设置分发的算法
lb_kind DR #设置分发的模式,这里使用DR模式演示
persistence_timeout 0 #同一个IP连接访问在多少秒内被分发到同一个rs上,这里改成0,如果是60,那么会在60秒内一直被连接到同一个rs上。
protocol TCP
#真实服务器的配置,注意IP和端口
real_server 192.168.2.222 80 {
weight 100 #权重
TCP_CHECK {
connect_timeout 10 #10秒无响应超时
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
#第二台rs服务器
real_server 192.168.2.223 80 {
weight 100
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
(3)在第二台从dir安装keepalived
yum install -y keepalived
配置将上面的第一台的keepalived.conf文件可以覆盖第二台的文件,然后只需要修改
vrrp里面的
vrrp_instance VI_1 {
state BACKUP #配置主,若是从改成BACKUP
interface eth1 #注意网卡,须是本机的网卡
virtual_router_id 51 #id号,不修改
priority 90 #优先级,100最高,若是从改成100以下
2. 安装LB集群
因为在keepalived里面的算法设置的是DR模式,所以需要根据DR模式设置。
(1)在第一台主dir上配置DR模式(192.168.2.234)
开启路由转发: echo 1 > /proc/sys/net/ipv4/ip_forward
(2)在第二台从dir上配置,也做nginx服务(192.168.2.223)
1) 开启路由转发: echo 1 > /proc/sys/net/ipv4/ip_forward
2) 安装nginx : yum install -y nginx
输入echo "11111111111master" > /usr/share/nginx/html/index.html 做测试区别使用
3)配置DR模式脚本
vim /usr/local/sbin/lvs_dr.sh
加入以下内容:
#!/bin/bash
vip=192.168.2.19 #虚拟IP
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
(3)在第三台配置nginx(192.168.2.222)
1) yum install -y nginx
输入:echo "2222222slave" >/usr/share/nginx/html/index.html 做测试区别使用
2)配置DR模式脚本
vim /usr/local/sbin/lvs_dr.sh
加入以下内容:
#!/bin/bash
vip=192.168.2.19 虚拟IP
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
3. 启动服务
(1)启动第一台上的服务
dir主上keepalived:/etc/init.d/keepalived start
启动路由转发:echo 1 >/proc/sys/net/ipv4/ip_forward
(2)启动第二台上的服务
dir从的keepalived : /etc/init.d/keepalived start
keepalived LB路由转发:echo 1 >/proc/sys/net/ipv4/ip_forward
启动nginx: /etc/init.d/nginx start
启动DR脚本:sh /usr/local/sbin/lvs_dr.sh
(3)启动第三台服务
启动nginx: /etc/init.d/nginx start
启动DR脚本:sh /usr/local/sbin/lvs_dr.sh
(4)检测
可在第一台主dir上看到
1)ipvsadm -ln 看到规则
[root@zq ~]# 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.2.19:80 rr persistent 60
-> 192.168.2.222:80 Route 100 0 0
-> 192.168.2.223:80 Route 100 0 0
2)ip addr看到vip
2: eth0: mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
link/ether 00:0c:29:72:c1:f3 brd ff:ff:ff:ff:ff:ff
inet 192.168.2.234/24 brd 192.168.2.255 scope global eth0
inet 192.168.2.19/32 scope global eth0
inet6 fe80::20c:29ff:fe72:c1f3/64 scope link
valid_lft forever preferred_lft forever
四、测试
1.所有服务开启
(1)在网页访问VIP:192.168.2.19
正常会输出11111111master,在刷新会显示222222222222slave,再刷新又变成11111111111master
(2)另开一个虚拟机,使用curl 192.168.2.19也会显示和网页一样的情况
2.停掉第三台的nginx(192.168.2.222)
/etc/init.d/nginx stop
可以在第一台主dir上,使用ipvsadm -ln 看到没有了192.168.2.222这个规则了
(1)在网页访问VIP:192.168.2.19
正常会一直输出11111111master,不会输出222222slave
(2)另开一个虚拟机,使用curl 192.168.2.19也会显示和网页一样的情况
3.开启第三台nginx,停掉第一台主dir
在第三台机器上: /etc/init.d/nginx start
在第一台dir主上:/etc/init.d/keepalived stop
可以看到第二台dir从上,启动了eth1的VIP:
[root@master sbin]# ip addr
1: lo: 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
inet 192.168.2.19/32 brd 192.168.2.19 scope global lo:0
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth1: mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
link/ether 00:0c:29:58:71:74 brd ff:ff:ff:ff:ff:ff
inet 192.168.2.223/32 scope global eth1
inet 192.168.2.19/32 scope global eth1
inet6 fe80::20c:29ff:fe58:7174/64 scope link
valid_lft forever preferred_lft forever
(2)在另外虚拟机上使用curl 也会正常输出
4. 开启停掉的第一台主dir
/etc/init.d/keepalived
使用ip addr 会看到它的eth0网卡上又成功加载了192.168.2.19VIP
从上的eth1网卡的VIP消失了