一、先介绍几个软件:
ipvsadm:lvs的负载均衡调度是靠这个软件来实现的。
ldirectord:用这个软件可以自动检测后端服务器是否连接。如果网络down掉,直接在ipvsadm表里边把这个后端的权值变为0,代表不用这个后端。如果网络恢复,ipvsadm表中这个后端的权重又变为设置的值,代表可用。
heartbeat:做lvs的时候,调度器是一个瓶颈,会产生单点失败,做双机的时候用到heartbeat来实现两台调度器互为主备。但是heartbeat有可能会产生脑裂现象。
http://czmmiao.iteye.com/blog/1180851
keepalive:这个软件是用vrrp协议来实现双机,配置文件比较简单。
http://bbs.ywlm.net/thread-845-1-1.html
二、几个名词的解释:
脑裂:在“双机热备”高可用(HA)系统中,当联系2个节点的“心跳线”断开时,本来为一整 体、动作协调的HA系统,就分裂成为2个独立的个体。由于相互失去了联系,都以为是对方出了故障,2个节点上的HA软件像“裂脑人”一样,“本能”地争抢 “共享资源”、争起“应用服务”,就会发生严重后果:或者共享资源被瓜分、2边“服务”都起不来了;或者2边“服务”都起来了,但同时读写“共享存储”, 导致数据损坏(常见如数据库轮询着的联机日志出错)。
脑裂现象的解决:
1、串行电缆:被认为是比以太网连接安全性稍好些的连接方式,因为hacker无法通过串行连接运行诸如telnet、ssh或rsh类的程序,从而可以降低其通过已劫持的服务器再次侵入备份服务器的几率。但串行线缆受限于可用长度,因此主、备服务器的距离必须非常短。
2、以太网连接:使用此方式可以消除串行线缆的在长度方面限制,并且可以通过此连接在主备服务器间同步文件系统,从而减少了从正常通信连接带宽的占用。
vrrp协议:
这个网址很好的介绍了vrrp协议的工作过程和原理:http://bbs.ywlm.net/thread-790-1-1.html
三、几种软件的结合使用,建立高可用的lvs
1、单独用ipvsadm,实现负载均衡:
网络环境:
虚拟ip:192.168.0.90
调度器ip:192.168.0.184
后端1ip:192.168.0.185
后端2ip:192.168.0.186
调度器(192.168.0.184)上操作:
在调度器上安装ipvsadm: yum install ipvsadm
写ipvsadm启动脚本:
vim /usr/local/sbin/lvs-dr.sh
#!/bin/bash
#description:start LVS of DirectorServer
#mysql director vip.
MYSQL_VIP=192.168.0.90
MYSQL_RIP1=192.168.0.185
MYSQL_RIP2=192.168.0.186
logger $0 called with $1
case "$1" in
start)
# set squid vip
# /sbin/ipvsadm --set 30 5 60
/sbin/ifconfig eth0:0 $MYSQL_VIP broadcast $MYSQL_VIP netmask 255.255.255.255 up
/sbin/route add -host $MYSQL_VIP dev eth0:0
echo "1">/proc/sys/net/ipv4/ip_forward
#set LVS mysql
/sbin/ipvsadm -C
/sbin/ipvsadm -A -t $MYSQL_VIP:3306 -s wlc
/sbin/ipvsadm -a -t $MYSQL_VIP:3306 -r $MYSQL_RIP1:3306 -g -w 1
/sbin/ipvsadm -a -t $MYSQL_VIP:3306 -r $MYSQL_RIP2:3306 -g -w 1
touch /var/lock/subsys/ipvsadm >/dev/null 2>&1
;;
stop)
/sbin/ipvsadm -C
/sbin/ipvsadm -Z
ifconfig eth0:0 down
route del $MYSQL_VIP
rm -rf /var/lock/subsys/ipvsadm >/dev/null 2>&1
echo "ipvsadm stoped"
;;
status)
if [ ! -e /var/lock/subsys/ipvsadm ];then
echo "ipvsadm stoped"
exit 1
else
/sbin/ipvsadm
echo "ipvsadm OK"
fi
;;
*)
echo "Usage: $0 {start|stop|status}"
exit 1
esac
exit 0
ipvsadm主要选项的解释:
--set tcp tcpfin udp 设置连接超时值
-A --add-service 在内核的虚拟服务器表中添加一条新的虚拟服务器记录。也
就是增加一台新的虚拟服务器。
-C --clear 清除内核虚拟服务器表中的所有记录。
-t --tcp-service service-address 说明虚拟服务器提供的是tcp 的服务
-u --udp-service service-address 说明虚拟服务器提供的是udp
-a --add-server 在内核虚拟服务器表的一条记录里添加一条新的真实服务器
记录。也就是在一个虚拟服务器中增加一台新的真实服务器
-d --delete-server 删除一条虚拟服务器记录中的某条真实服务器记录
-r --real-server server-address 真实的服务器[Real-Server:port]
-w --weight weight 真实服务器的权值
-s --scheduler scheduler 使用的调度算法,有这样几个选项
rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,
-L|-l --list 显示内核虚拟服务器表
默认的调度算法是: wlc.
ipvsadm的启动和停止:
启动:/usr/local/sbin/lvs-dr.sh start
运行脚本之后可以运行service ipvsadm save,脚本中ipvsadm几个规则就被保存在/etc/sysconfig/ipvsadm文件中。之后再运行service ipvsadm stop的时候规则不会丢失,再启动ipvsadm的时候可以直接用service ipvsadm start。
/etc/sysconfig/ipvsadm.conf-config文件保存在ipvsadm在启动和停止的时候要做的操作。
停止:service ipvsadm stop 或者 /usr/local/sbin/lvs-dr.sh stop
在后端realserver上要执行的动作有两点:
1、 给调度器上指定的真实ip的网卡上配置虚拟ip
2、 把arp解析给关闭
写脚本如下:
vim /usr/local/sbin/realserver.sh
#!/bin/bash
# description: Config realserver lo and apply noarp
MYSQL_VIP=192.168.0.90
. /etc/rc.d/init.d/functions
case "$1" in
start)
ifconfig lo:0 $MYSQL_VIP netmask 255.255.255.255 broadcast $MYSQL_VIP up
/sbin/route add -host $MYSQL_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
sysctl -p >/dev/null 2>&1
echo "RealServer Start OK"
;;
stop)
ifconfig lo:0 down
route del $MYSQL_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
2、ldirectord的实现:
单独使用ipvsadm来实现的负载均衡,如果调度器和后端某台服务器不通,调度器不能及时发现,还去后端请求这台服务器,会导致请求不到而造成响应失败。ldirectord能够自动检测调度器和后端的网络状况,在后端某台服务器失效的情况下,自动把ipvsadm中记录这台服务器的权重变为0,如果恢复,又重新把权重变为设置的值。
查看ipvsadm的链接状况可以用命令:watch ipvsadm –L -n
ldirectord的安装和配置(调度上操作):
ldirectord是heartbeat带的一个软件,可以直接用yum安装:
yum install heartbeat-ldirectord
安装之后可以去查看ldirectod这个脚本调用的配置配置在哪儿位置放着:
vim /usr/sbin/ldirectord
可以看到这个服务器启动的时候默认用/etc/ha.d/或者/etc/ha.d/conf/这两个目录下的配置文件来启动。
在/etc/ha.d/conf/下建立ldirectord.cf,这个软件自带的有这个配置文件的模板,可以直接拷贝到这个目录下:
cp /usr/share/doc/heartbeat-ldirectord-2.1.4/ldirectord.cf /etc/ha.d/conf/
vim /etc/ha.d/conf/ldirectord.cf
# Global Directives
checktimeout=3
checkinterval=1
#fallback=127.0.0.1:80
autoreload=yes
logfile="/var/log/ldirectord.log"
logfile="local0"
#emailalert="[email protected]"
#emailalertfreq=3600
#emailalertstatus=all
quiescent=yes
# Sample for an http virtual service
virtual=192.168.0.90:3306
real=192.168.0.185:3306 gate 1
real=192.168.0.186:3306 gate 1
service=mysql
scheduler=rr
#persistent=600
#netmask=255.255.255.255
protocol=tcp
checktype=negotiate
checkport=3306
login="lvs"
passwd="123456"
database="mysql"
request="select * from user limit 1"
启动ldirectord:/usr/sbin/ldirectord start
此时可以查看ipvsadm表中的活动连接数:
watch ipvsdam –L –n
把186网卡down之后可以看到ipvsadm的连接数:
可以看到186的权值变为0
把186网卡重新启用,可以看到186的权值重新恢复成1。