LVS+Heartbeat+Ipvsadm+Ldirectord
最编程
2024-08-10 20:36:22
...
LVS+Heartbeat+Ipvsadm+Ldirectord
LVS:功能是通过一组服务器进行负载均衡,通过前段调度器,将网络请求到真实服务器,对客户的透明的,系统的伸缩通过在服务器群中进入和删除节点达到,检测节点或服务故障达到高可用性,负载调度技术在linux的内核中实现,称为:(Linux Virtual Server)linux虚拟服务器。
I在调度器的实现技术中,IP负载均衡技术是效率最高的。在已有的IP负载均衡技术中有通过网络地址转换(Network Address Translation)将一组服务器构成一个高性能的、高可用的虚拟服务器,我们称之为VS/NAT技术(Virtual Server via Network Address Translation),大多数商品化的IP负载均衡调度器产品都是使用此方法,如Cisco的LocalDirector、F5的Big/IP和 Alteon的ACEDirector。在分析VS/NAT的缺点和网络服务的非对称性的基础上,我们提出通过IP隧道实现虚拟服务器的方法VS/TUN (Virtual Server via IP Tunneling),和通过直接路由实现虚拟服务器的方法VS/DR(Virtual Server via Direct Routing),它们可以极大地提高系统的伸缩性。所以,IPVS软件实现了这三种IP负载均衡技术,它们的大致原理如下(我们将在其他章节对其工作原 理进行详细描述)
Virtual Server via Network Address Translation(VS/NAT)
通过网络地址转换,调度器重写请求报文的目标地址,根据预设的调度算法,将请求分派给后端的真实服务器;真实服务器的响应报文通过调度器时,报文的源地址被重写,再返回给客户,完成整个负载调度过程。
Virtual Server via IP Tunneling(VS/TUN)
采用NAT技术时,由于请求和响应报文都必须经过调度器地址重写,当客户请求越来越多时,调度器的处理能力将成为瓶颈。为了解决这个问题,调度器把请求报 文通过IP隧道转发至真实服务器,而真实服务器将响应直接返回给客户,所以调度器只处理请求报文。由于一般网络服务应答比请求报文大许多,采用 VS/TUN技术后,集群系统的最大吞吐量可以提高10倍。
Virtual Server via Direct Routing(VS/DR)
VS/DR通过改写请求报文的MAC地址,将请求发送到真实服务器,而真实服务器将响应直接返回给客户。同VS/TUN技术一样,VS/DR技术可极大地 提高集群系统的伸缩性。这种方法没有IP隧道的开销,对集群中的真实服务器也没有必须支持IP隧道协议的要求,但是要求调度器与真实服务器都有一块网卡连 在同一物理网段上
针对不同的网络服务需求和服务器配置,IPVS调度器实现了如下八种负载调度算法:
1. 轮叫(Round Robin)
调度器通过"轮叫"调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而不管服务器上实际的连接数和系统负载。
调度器通过"轮叫"调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而不管服务器上实际的连接数和系统负载。
2. 加权轮叫(Weighted Round Robin)
调度器通过"加权轮叫"调度算法根据真实服务器的不同处理能力来调度访问请求。这样可以保证处理能力强的服务器处理更多的访问流量。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。
调度器通过"加权轮叫"调度算法根据真实服务器的不同处理能力来调度访问请求。这样可以保证处理能力强的服务器处理更多的访问流量。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。
3. 最少链接(Least Connections)
调度器通过"最少连接"调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用"最小连接"调度算法可以较好地均衡负载。
调度器通过"最少连接"调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用"最小连接"调度算法可以较好地均衡负载。
4. 加权最少链接(Weighted Least Connections)
在集群系统中的服务器性能差异较大的情况下,调度器采用"加权最少链接"调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。
在集群系统中的服务器性能差异较大的情况下,调度器采用"加权最少链接"调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。
5. 基于局部性的最少链接(Locality-Based Least Connections)
"基于局部性的最少链接" 调度算法是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。该算法根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器 是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用"最少链接"的原则选出一个可用的服务 器,将请求发送到该服务器。
"基于局部性的最少链接" 调度算法是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。该算法根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器 是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用"最少链接"的原则选出一个可用的服务 器,将请求发送到该服务器。
6. 带复制的基于局部性最少链接(Locality-Based Least Connections with Replication)
"带复制的基于局部性最少链接"调度算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。它与LBLC算法的不同之处是它要维护从一个 目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。该算法根据请求的目标IP地址找出该目标IP地址对应的服务 器组,按"最小连接"原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器,若服务器超载;则按"最小连接"原则从这个集群中选出一 台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。
"带复制的基于局部性最少链接"调度算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。它与LBLC算法的不同之处是它要维护从一个 目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。该算法根据请求的目标IP地址找出该目标IP地址对应的服务 器组,按"最小连接"原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器,若服务器超载;则按"最小连接"原则从这个集群中选出一 台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。
7. 目标地址散列(Destination Hashing)
"目标地址散列"调度算法根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。
"目标地址散列"调度算法根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。
8、源地址散列(Source Hashing)
"源地址散列"调度算法根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出 对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空
"源地址散列"调度算法根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出 对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空
安装:LVS+Heartbeat+Ipvsadm+Ldirectory
Heartbeat: 是linux-ha项目,用于设置心跳在主/从节点设置heartbeat,一旦主节点崩溃,从立即接管主节点,将LVS资源设置进去。
ldirector:有两个主要功能,一是调用ipvsadm命令生成lvs的策略,二是对realserver进行健康检测
环境介绍:LVS master——————LVS backup
这种结构有两台双网卡的linux服务器配置lvs router。
LVS master:eth0 192.168.1.133 //模拟外网
eth0:0 192.168.1.135 //VIP
eth1 192.168.2.2 //内网IP
LVS backup:eth0 192.168.1.132 //模拟外网
eth0 192.168.1.135 //VIP
eth1 192.168.2.1 //内网IP
[root@lvs-1 network-scripts]# cat /etc/hostsDo not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1 localhost.localdomain localhost
::1 localhost6.localdomain6 localhost6
192.168.2.1 lvs2
192.168.1.2.2 lvs1
#yum install -y libnet //安装,否则编译heartbeat出错
yum install -y perl*
yum install -y mod_perl
yum install -y mod_perl-devel //安装否则启动heartbeat报错
groupadd -g 694 haclient //启动用户
useradd -u 694 -g haclient hacluster
useradd -u 694 -g haclient hacluster
一、安装heartbeat包,以下配置主/从都需要编译,和建立配置文件
tar zxvf heartbeat-2.1.2.tar.gz
cd heartbeat-2.1.2
./ConfigureMe configure ; make ; make install
自动生成在/etc/ha.d/目录中
二、 lvs_dr脚本配置
[root@lvs1 resource.d]# cat /etc/ha.d/resource.d/lvs_dr
#!/bin/bash
# description: start LVS of Directorserver
VIP=192.168.1.135 虚拟IP地址
RIP1=192.168.2.4 内部真实IP
RIP2=192.168.2.5 内部真实IP
SERVICE=80
#http is used in this case
. /etc/rc.d/init.d/functions
case $1 in
start)
echo "start LVS of DirectorServer"
# set ip_forward&send_redirects
echo "0" >/proc/sys/net/ipv4/ip_forward
echo "1" >/proc/sys/net/ipv4/conf/all/send_redirects
echo "1" >/proc/sys/net/ipv4/conf/default/send_redirects
echo "1" >/proc/sys/net/ipv4/conf/eth0/send_redirects
# set the Virtual IP Address
/sbin/ifconfig eth0:0 $VIP broadcast $VIP netmask 255.255.255.255 up
/sbin/route add -host $VIP dev eth0:0
#Clear IPVS table
/sbin/ipvsadm -C
#set LVS
/sbin/ipvsadm -A -t $VIP:$SERVICE -s rr
/sbin/ipvsadm -a -t $VIP:$SERVICE -r $RIP1:$SERVICE -g -w 1
/sbin/ipvsadm -a -t $VIP:$SERVICE -r $RIP2:$SERVICE -g -w 1
/sbin/ipvsadm --set 30 120 300
#Run LVS
/sbin/ipvsadm
#end
;;
stop)
echo "close LVS Directorserver"
/sbin/ipvsadm -C
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac
#!/bin/bash
# description: start LVS of Directorserver
VIP=192.168.1.135 虚拟IP地址
RIP1=192.168.2.4 内部真实IP
RIP2=192.168.2.5 内部真实IP
SERVICE=80
#http is used in this case
. /etc/rc.d/init.d/functions
case $1 in
start)
echo "start LVS of DirectorServer"
# set ip_forward&send_redirects
echo "0" >/proc/sys/net/ipv4/ip_forward
echo "1" >/proc/sys/net/ipv4/conf/all/send_redirects
echo "1" >/proc/sys/net/ipv4/conf/default/send_redirects
echo "1" >/proc/sys/net/ipv4/conf/eth0/send_redirects
# set the Virtual IP Address
/sbin/ifconfig eth0:0 $VIP broadcast $VIP netmask 255.255.255.255 up
/sbin/route add -host $VIP dev eth0:0
#Clear IPVS table
/sbin/ipvsadm -C
#set LVS
/sbin/ipvsadm -A -t $VIP:$SERVICE -s rr
/sbin/ipvsadm -a -t $VIP:$SERVICE -r $RIP1:$SERVICE -g -w 1
/sbin/ipvsadm -a -t $VIP:$SERVICE -r $RIP2:$SERVICE -g -w 1
/sbin/ipvsadm --set 30 120 300
#Run LVS
/sbin/ipvsadm
#end
;;
stop)
echo "close LVS Directorserver"
/sbin/ipvsadm -C
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac
#chmod +x /etc/ha.d/resource.d/lvs_dr //给脚本权限
三、 authkeys配置
cd /etc/ha.d/ //配置文件都在这里手动建立,或者cp过来#1 crc
#vi authkeys
auth 3
#1 crc
#2 sha1 HI!
3 md5 hello! //md5算法
#1 crc
#2 sha1 HI!
3 md5 hello! //md5算法
#chmod 0600 authkeys //改权限
四、 haresources的配置
lvs1 192.168.1.135 lvs_dr ldirectord
主节点机器名 VIP地址 脚本名字 ldirectord
(注:lvs_switch ,lvs_dr脚本必须位于/etc/init.d/或/etc/ha.d/resource.d下,且不能随机一启动)
五、 ha.cf配置
http://xxtianxiaxing.javaeye.com/blog/566424 //ha.cf解释
debugfile /var/log/ha-debug debbug日志文件路径
logfile /var/log/ha-log heartbeat 日志文件路径
logfacility local0
keepalive 2 心跳检测时间间隔
deadtime 30 多久没有检测到心跳时宣布死亡,这个时间不能设置太小,否则宣告时候出错不准确,谁死谁活的
initdead 60 heartbeat第一次启动时启动其所控资源的时间,是deadtime时间的两倍以上
warntime 10 指明心跳延迟的时间为十秒。当10秒钟内备份机不能联系上主机(当前活动的服务器,即无心跳信号),就会往日志中写入一个警告日志,但此时不会切换服务。
udpport 28855 heartbeat监听端口
#bcast eth0 # Linux心跳路径,最好不要与正常生产网络中的设备混在一起
#mcast eth0 225.0.0.1 694 1 0 #说明:采用udp多播播来通知心跳,建议在副节点不只一台时使用
ucast eth0 对端节点IP 采用网卡eth0的udp单播来通知心跳,ip应为对方IP
ucast eht0 192.168.2.1 (在备份dr上这里的ip就写主dr的ip:192.168.2.2)
#注:广播,单播,多播,以上三种任选其一即可
#ping 192.168.1.1 ping我内部网关地址,主要是利用ipfail功能检测主服务器网络是否正常
auto_failback on 主节点重启成功后,资源是自动拿回到主节点还是等到副节点down调后拿回资源
watchdog /dev/watchdog 启动内核看门狗功能,能让系统在出现故障1分钟后重启该机器。这个功能可以帮助服务器在确实停止心跳后能够重新恢复心跳。如果使用该特性,则在内核中装入softdog内核模块,用来生成实际的设备文件,输入insmod softdog加载模块。
# stonith用来保证共享存储环境中的数据完整性
node 主节点机器名 (必须同uname -n返回的主机名相同)
node 备份节点机器名
node lvs1
node lvs2
六、 ldirectord.cf的配置
# Global Directives
checktimeout=3 超时时间
checkinterval=1 检测真实服务器的间隔
#fallback=127.0.0.1:80
autoreload=yes 表示修改ldirectord.cf配置文件ldirectord自动加载,不用重启
logfile="/var/log/ldirectord.log"
quiescent=yes 如果真实服务器失败,ldirectord所采取的动作,注意如果主里设为yes,则必须在内核中修改下列文件:
echo "1" >/proc/sys/net/ipv4/vs/expire_quiescent_template
echo "1" >/proc/sys/net/ipv4/vs/expire_nodest_conn
echo "1" >/proc/sys/net/ipv4/vs/expire_nodest_conn
# Sample for an http virtual service
virtual= 192.168.1.135:80
real=(真实服务器IP1):80 gate
real=(真实服务器IP2):80 gate
real=192.168.2.4:80 gate
real=192.168.2.5:80 gate
fallback=127.0.0.1:80 gate 如果两台真实服务器都无效,则定向本机的lo地址
service=http 指定服务类型
request="lvstest.html" 检查真实服务器时用到的页面
receive="lvstest" 所请求页面内的内容
scheduler=rr 调度方法,rr表示循环调用
#persistent=600 tcp连接时间
#netmask=255.255.255.255
protocol=tcp 协议类型
checktype=negotiate ldirectord检测真实服务器的方式
checkport=80
request="lvstest.html"
receive="lvstest”
在http配置的根目录增加lvetest.html,文件内容是lvestest
在ftp配置的根目录增加lvetest.html,文件内容是lvestest
# /etc/init.d/heartbeat start 启动服务,两台可以同时启动,或者先启动主LVS是否启动了VIP地址
#tail -f /var/log/messages 同时查看日志是否正常启动
BUG修复否则启动失败,注释掉一下内容
#vi +3704 /usr/sbin/ldirectord
#use Mail::Send;
#
# &ld_log("emailalert: $subject");
##
# unless ($emailmsg = new Mail::Send Subject=>$subject, To=>$to_addr
# and $emailfh = $emailmsg->open
# and print $emailfh "Log-Message: $subject\n" .
## "Daemon-Status: " .
# &daemon_status_str() . "\n"
## and $emailfh->close) {
# &ld_log("failed to send email message\n");
# $status = 1;
# }
主从同时都启动情况下,测试主从是否可以连通,断开eth1 心跳线网卡,在window主机ping虚拟网卡IP地址,使用arp -a 看看IP地址对应的MAC地址,是否为主的MAC地址,从接管后主的VIP还会存在,在ping虚拟IP地址,检查MAC是否变成从的MAC地址。