LVS的全称Linux vitual system, linux vitual server,是由目前阿里巴巴的著名工程师章文嵩博士开发的一款开源软件。LVS工作在一台server上提供Directory(负载均衡器)的功能,本身并不提供服务,只是把特定的请求转发给对应的realserver(真正提供服务的主机),从而实现集群环境中的负载均衡。
LVS的核心组件ipvs工作在kernel中,是真正的用于实现根据定义的集群转发规则把客户端的请求转发到特定的realserver。而另一个组件ipvsadm是工作在用户空间的一个让用户定义ipvs规则的工具。故我们只要在server上装了ipvsadm软件包就可以定义ipvs规则,而在linux kernel的2.6版本之后kernel是直接支持ipvs的。
IPVS 是 lvs的第一部分负载调度器(load balancer)的实现 ,也就是最核心的部分,用来进行负载均衡,所以 ipvs主要实现。
一般来说,LVS集群采用三层结构,其主要组成部分为:
A、负载调度器(load balancer),它是整个集群对外面的前端机,负责将客户的请求发送到一组服务器上执行,而客户认为服务是来自一个IP地址(我们可称之为虚拟IP地址)上的。
B、服务器池(server pool),是一组真正执行客户请求的服务器,执行的服务有WEB、MAIL、FTP和DNS等。
C、共享存储(shared storage),它为服务器池提供一个共享的存储区,这样很容易使得服务器池拥有相同的内容,提供相同的服务。
DR工作模式
,即Direct Routing模式。这种模式中,调度器直接重写进入包的mac地址,将其改为选定的目标服务器的mac地址,这样就可以到达服务器。但这样的话需要要求IPVS服务器需要和真实服务器在同一局域网内,且真实服务器必须有真实网卡(这样重写了mac地址的报文才可以才可以到达该服务器)
NAT工作模式
,简单来说就是传统的NAT,进出流量都需要经过调度器,调度器会选择一个目的服务器,将进入流量的目标IP改写为负载均衡到的目标服务器,同时源IP地址也会改为调度器IP地址。机制简单,但限制大,IPVS需要维护每个映射关系,而且进出入流量都需要经过调度器,实际上这个会成为瓶颈。 TUN工作模式
,即IP Tunneling模式。这种模式中,调度器将进入的包重新包成一个IP包,然后发送给选定的目的服务器,目的服务器处理后,直接将应答发送给客户(当然该重新封装的报文的源IP地址还是要填成调度器的)。 FULLNAT工作模式
轮训算法 加权轮训算法 最小连接算法 加权最下连接算法 .....
LVS Scheduling Method LVS的调度方法:
1.Fixed Scheduling Method 静态调服方法
(1).RR 轮询
(2).WRR 加权轮询
(3).DH 目标地址hash
(4).SH 源地址hash
2.Dynamic Scheduling Method 动态调服方法
(1).LC 最少连接
(2).WLC 加权最少连接
(3).SED 最少期望延迟
(4).NQ 从不排队调度方法
(5).LBLC 基于本地的最少连接
(6).LBLCR 带复制的基于本地的最少连接
Heartbeat 项目是 Linux-HA 工程的一个组成部分,其与lvs在本质上无关。
Heartbeat提供了2个核心的功能正是lvs所需要的,心跳监测部分和资源接管,心跳监测可以通过网络链路和串口进行,而且支持冗余链路,安装了 Heartbeat 的两台机器会通过心跳检测互相检测对方的状态,当检测到对方失效的时候会调用资源接管来做接管服务器,保证高可靠性。
在一个高可靠的lvs集群中,负载调度IPVS部分一般由2台服务器组成,一台负责调度,一台负责备用,当负责调度的服务器出现问题的时候迅速切换到备用机器上,而heartbeat 就是负责检测,负载调度 IPVS 的可用性,并在出现问题的时候切换到备用 IPVS 上面。
ldirectord是专门为LVS监控而编写的,用来监控lvs架构中服务器池(server pool) 的服务器状态。
ldirectord 运行在 IPVS 节点上, ldirectord作为一个守护进程启动后会对服务器池中的每个真是服务器发送请求进行监控,如果 服务器没有响应 ldirectord 的请求,那么ldirectord 认为该服务器不可用, ldirectord 会运行 ipvsadm 对 IPVS表中该服务器进行删除,如果等下次再次检测有相应则通过ipvsadm 进行添加。
Keepalived在这里主要用作RealServer的健康状态检查以及LoadBalance主机和BackUP主机之间failover的实现 。IPVS通常与keepalived配合使用,后者也是LVS项目的子项目之一,用于检测服务器的状态。
在lvs体系中,Keepalived主要有如下3个功能:
1 管理LVS负载均衡软件
2 实现对LVS集群节点的健康检查功能
3 作为系统网络服务的高可用功能
即 Keepalived 实现了 heartbeat + ldirectord 的功能。
实验环境:
物理机:172.25.129.250
server1:172.25.129.1
server2:172.25.129.2
server3:172.25.129.3
server4:172.25.129.4
NO.1 LVS负载均衡的实现
在server1中:
为server1提供完整的yum源,方便下一步工具的安装
vim /etc/yum.repos.d/rhel-source.repo
[rhel-source]
name=Red Hat Enterprise Linux $releasever - $basearch - Source
baseurl=http://172.25.129.250/rhel6.5
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
[LoadBalancer]
name=LoadBalancer
baseurl=http://172.25.129.250/rhel6.5/LoadBalancer
gpgcheck=0
[HighAvailability]
name=HighAvailability
baseurl=http://172.25.129.250/rhel6.5/HighAvailability
gpgcheck=0
[ResilientStorage]
name=ResilientStorage
baseurl=http://172.25.129.250/rhel6.5/ResilientStorage
gpgcheck=0
[ScalableFileSystem]
name=ScalableFileSystem
baseurl=http://172.25.129.250/rhel6.5/ScalableFileSystem
gpgcheck=0
如图:在物理机中可以看到完整的yum源
yum install ipvsadm -y ##安装管理集群服务ipvsadm
[root@server1 ~]# ip addr add 172.25.129.100/24 dev eth0 ##临时添加ip(vip)
[root@server1 ~]# ipvsadm -A -t 172.25.129.100:80 -s rr
[root@server1 ~]# ipvsadm -a -t 172.25.129.100:80 -r 172.25.129.2:80 -g
[root@server1 ~]# ipvsadm -a -t 172.25.129.100:80 -r 172.25.129.3:80 -g #vip添加RS地址,并设置为D模式 -r:RS地址,-g:DR模式
[root@server1 ~]# /etc/init.d/ipvsadm save ##保存ipvsadm操作
在server2中:
[root@server2 ~]# vim /var/www/html/index.html
[root@server2 ~]# ip addr add 172.25.0.100/32 dev eth0 ##Realserver同样添加虚拟ip地址,与调度器虚拟ip地址一致
[root@server2 ~]# yum install arptables_jf -y ##安装arp防火墙 arp防火墙用来屏蔽数据包,拦截ip冲突,因为虚拟机与real server的地址一致,所以进入real server时需要把虚拟ip DROP掉,即拦截real server的虚拟ip
[root@server2 ~]# arptables -A IN -d 172.25.0.100 -j DROP ##拒绝客户端访问realserver的虚拟ip,只要输入进来直接DROP掉
[root@server2 ~]# arptables -A OUT -s 172.25.0.100 -j mangle --mangle-ip-s 172.25.0.2 ##由于tcp三次握手,出去时仍要以vip地址形式才会握手,而真正将数据传输给客户端的就是realserver,mangle参数就是这个功能
[root@server2 ~]# /etc/init.d/arptables_jf save
在server3中:
vim /var/www/html/index.html ##修改Apache服务测试页内容,并开启httpd服务
ip addr add 172.25.129.100/24 dev eth0
yum install arptables_jf -y
arptables -A IN -d 172.25.129.100 -j DROP
arptables -A OUT -s 172.25.129.100 -j mangle --mangle-ip-s 172.25.129.2
/etc/init.d/arptables_jf save
arptables -L ##查看策略
测试:在物理机中
在server1中查看ipvsadm状态:
NO.2 ldirectord实现lvs健康检查
[root@server1 ~]# yum install ldirectord-3.9.5-3.1.x86_64.rpm ##安装服务
[root@server1 ~]# rpm -qpl ldirectord-3.9.5-3.1.x86_64.rpm ##查找配置文件
[root@server1 ~]# cd /etc/ha.d/
[root@server1 ha.d]# ls
resource.d shellfuncs
[root@server1 ha.d]# cp /usr/share/doc/ldirectord-3.9.5/ldirectord.cf .
[root@server1 ha.d]# ls
ldirectord.cf resource.d shellfuncs
[root@server1 ha.d]# vim ldirectord.cf ##修改配置文件
virtual=172.25.129.100:80
real=172.25.129.2:80 gate
real=172.25.129.3:80 gate
fallback=127.0.0.1:80 gate ##server2、3服务down后,访问本机80端口
service=http
scheduler=rr ##调度模式:轮询
#persistent=600
#netmask=255.255.255.255
protocol=tcp
checktype=negotiate
checkport=80 ##端口
request="index.html" ##文件
# receive="Test Page" ##注释掉这两行
# virtualhost=www.x.y.z
[root@server1 ha.d]# /etc/init.d/ldirectord start 开启服务
ipvsadm -C ##清除所有ipvs策略,不用执行这一行命令
查找配置文件的方法
修改http的端口为80
[root@server1 ha.d]# vim /var/www/html/index.html
此网站正在维护中...
关闭server2的httpd后,测试:
关闭server2和server3的httpd后,再次测试:
NO.3高可用集群HA的搭建
在server1中:
[root@server1 ~]# /etc/init.d/ldirectord stop
[root@server1 ~]# chkconfig ldirectord off ##关闭ldirectord服务
lftp 172.25.0.250:/pub> get keepalived-1.4.3.tar.gz
[root@server1 ~]# tar zxf keepalived-1.4.3.tar.gz
[root@server1 ~]# cd keepalived-1.4.3
yum install gcc
[root@server1 keepalived-1.4.3]# ./configure --prefix=/usr/local/keepalived --with-init=SYSV
[root@server1 keepalived-1.4.3]# make && make install ##安装keepalived,可能需要安装依赖性服务
[root@server1 ~]# yum install openssl-devel.x86_64 -y ##解决依赖性
修改keepalived的配置
[root@server1 ~]# cd /usr/local/keepalived/etc/rc.d/init.d/
[root@server1 init.d]# chmod +x keepalived
[root@server1 local]# ln -s /usr/local/keepalived/etc/keepalived/ /etc
[root@server1 local]# ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
[root@server1 local]# ln -s /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
[root@server1 local]# ln -s /usr/local/keepalived/sbin/keepalived /sbin/
[root@server1 init.d]# vim /etc/keepalived/keepalived.conf
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
# vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 12
priority 100 ##数值要大于BACKUP的
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.129.100
}
}
virtual_server 172.25.129.100 80 {
delay_loop 3
lb_algo rr
lb_kind DR
# persistence_timeout 50
protocol TCP
real_server 172.25.129.2 80 {
weight 1
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
}
}
real_server 172.25.129.3 80 {
weight 1
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
}
}
}
将server1的配置文件复制给server4
[root@server1 ~]# scp -r /usr/local/keepalived/ server4:/usr/local/
[root@server1 ~]# scp -r /etc/keepalived/keepalived.conf server4:/etc/keepalived/
开启服务
[root@server1 ~]# /etc/init.d/keepalived start
[root@server1 ~]# /etc/init.d/keepalived reload
在server4中:
vim /etc/yum.repos.d/rhel-source.repo ##配置完整的yum源
yum install -y ipvsadm ##安装服务
yum install openssh-clients-5.3p1-94.el6.x86_64 -y
ln -s /usr/local/keepalived/etc/keepalived/ /etc/
ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
ln -s /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
ln -s /usr/local/keepalived/sbin/keepalived /sbin/
cd /usr/local/keepalived/etc/rc.d/init.d
chmod +x keepalived
vim /etc/keepalived/keepalived.conf ##修改内容如下
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 12
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.0.100
}
}
[root@server4 ~]# /etc/init.d/keepalived start
[root@server4 ~]# /etc/init.d/keepalived reload
[root@server2 ~]# /etc/init.d/httpd start
[root@server3 ~]# /etc/init.d/httpd start
测试:
当server1的keepalived关闭时,server为backup自动替补上来