LVS+Keepalived
LVSlvs是一个开源的软件,可以实现LINUX平台下的简单负载均衡。LVS是Linux Virtual Server的缩写,意思是Linux虚拟服务器。 目前有三种IP负 载均衡技术(VS/NAT、VS/TUN和VS/DR);八种调度算法(rr,wrr,lc,wlc,lblc,lblcr,dh,sh)。
Keepalived
Keepalived 是运行在lvs 之上,它的主要功能是实现真实机的故障隔离及负载均衡器间的失败 切换,提高系统的可用性
一、环境(一主两从,两从做集群)
Master:CentOS5.8 64位
MySQL 5.5.17
192.168.3.28
LVS-VIP:CentOS5.8 64位
ipvsadm-1.24.tar.gz, keepalived-1.1.19.tar.gz
192.168.3.119
Slave1/node1:CentOS5.8 64位
MySQL 5.5.17
192.168.3.108
Slave2/node2:CentOS5.8 64位
MySQL 5.5.17
192.168.3.74
二、部署
1、下载所需软件
http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24.tar.gz
http://www.keepalived.org/software/keepalived-1.1.19.tar.gz
2、安装LVS
――检查一下系统内核
安装之前,首先检查一下系统内核是否支持LVS的IPVS模块;自Linux 2.6开始,系统内核完全内置了LVS的各个模块。
# modprobe -l|grepipvs
/lib/modules/2.6.18-308.el5/kernel/net/ipv4/ipvs/ip_vs.ko
/lib/modules/2.6.18-308.el5/kernel/net/ipv4/ipvs/ip_vs_dh.ko
/lib/modules/2.6.18-308.el5/kernel/net/ipv4/ipvs/ip_vs_ftp.ko
/lib/modules/2.6.18-308.el5/kernel/net/ipv4/ipvs/ip_vs_lblc.ko
/lib/modules/2.6.18-308.el5/kernel/net/ipv4/ipvs/ip_vs_lblcr.ko
/lib/modules/2.6.18-308.el5/kernel/net/ipv4/ipvs/ip_vs_lc.ko
/lib/modules/2.6.18-308.el5/kernel/net/ipv4/ipvs/ip_vs_nq.ko
/lib/modules/2.6.18-308.el5/kernel/net/ipv4/ipvs/ip_vs_rr.ko
/lib/modules/2.6.18-308.el5/kernel/net/ipv4/ipvs/ip_vs_sed.ko
/lib/modules/2.6.18-308.el5/kernel/net/ipv4/ipvs/ip_vs_sh.ko
/lib/modules/2.6.18-308.el5/kernel/net/ipv4/ipvs/ip_vs_wlc.ko
/lib/modules/2.6.18-308.el5/kernel/net/ipv4/ipvs/ip_vs_wrr.ko
看到如上输出信息,则表明系统内核默认支持IPVS模块。
――安装依赖包
由于是源码包安装,所以编译时需要打上如下依赖包。
# rpm -q kernel-headers glibc-headers glibc-devel libgomp gcc libstdc++-devel gcc-c++
检查所需的依赖包是否安装,若未安装,则安装之。
# rpm -ivh kernel-headers-2.6.18-308.el5.x86_64.rpm
# rpm -ivh glibc-headers-2.5-81.x86_64.rpm
# rpm -ivh glibc-devel-2.5-81.*
# rpm -ivh libgomp-4.4.6-3.el5.1.*
# rpm -ivh gcc-4.1.2-52.el5.x86_64.rpm
# rpm -ivh libstdc++-devel-4.1.2-52.el5.*
# rpm -ivhgcc-c++-4.1.2-52.el5.x86_64.rpm
――编译安装
# tar zxvf ipvsadm-1.24.tar.gz
# cd ipvsadm-1.24
# make
# make install
安装后,执行# ipvsadm --help命令,若能看到帮助信息,则说明IPVS安装成功。
说明:Make编译期间,若提示“libipvs.h:14:23: error: net/ip_vs.h: No such file or directory”错误,则是由于编译程序找不到对应的内核造成,做个软连接即可:
# ln -s /usr/src/kernels/2.6.18-308.el5-x86_64/ /usr/src/linux
若/usr/src/kernels/目录下没有对应的内核文件,则是因为没有安装的kernel-devel包的缘故。
3、安装Keepalived
――安装依赖包
编译安装Keepalived,需要打上如下开发包,首先检查这些包是否安装,若未安装则安装值。
# rpm -q e2fsprogs-devel keyutils-libs-devellibsepol-devellibselinux-devel krb5-devel zlib-developenssl-devel
# rpm -ivh e2fsprogs-devel-1.39-33.el5.*
# rpm -ivh keyutils-libs-devel-1.2-1.el5.*
# rpm -ivh libsepol-devel-1.15.2-3.el5.*
# rpm -ivh libselinux-devel-1.33.4-5.7.el5.*
# rpm -ivh krb5-devel-1.6.1-70.el5.*
# rpm -ivh zlib-devel-1.2.3-4.el5.*
# rpm -ivh openssl-devel-0.9.8e-22.el5.*
――编译安装
# tar zxvf keepalived-1.1.19.tar.gz
# cd keepalived-1.1.19
# ./configure --sysconf=/etc/ --with-kernel-dir=/usr/src/kernels/2.6.18-308.el5-x86_64/
说明:
--sysconf :指定了Keepalived配置文件的安装路径,即/etc/Keepalived/Keepalived.conf;
--with-kernel-dri :指定使用内核源码中的头文件,即include目录,该参数很重要,只有使用LVS时才用此参数。
# make
# make install
# ln -s /usr/local/sbin/keepalived /sbin/
安装后,执行命令# keepalived –help,若看到帮助信息,说明Keepalived安装成功。
说明:若configure时通过--prefix指定安装路径,如/usr/local/keepalived,则需执行如下操作,目的是分别将Keeplalived的工具命令、配置文件、服务启动脚本拷贝到系统相应目录下。
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
4、配置Keepalived
Keepalived成功安装后,默认的配置文件为/etc/keepalived/keepalived.conf,一个完整的配置文件应包括:全局定义、vrrp实例定义、虚拟服务器定义三个部分,分别说明如下:
# vi keepalived.conf
! Configuration File for keepalived
#全局定义部分
global_defs {
notification_email {
907204401@qq.com #设置报警邮件地址,每行一个,可设置多个。注意,若要开启邮件报警,需开启本机sendmail服务
}
notification_email_fromkeepalived@localhost#设置邮件的发送地址
smtp_server 127.0.0.1 #设置smtp server地址
smtp_connect_timeout 30 #设置连接smtp server的超时时间
router_id MySQL_LVS #表示运行keepalived服务器的一个标识,发邮件时显示在邮件主题中的信息
}
#vrrp实例定义部分
vrrp_instance VI_1 {
state MASTER #指定keepalived的角色,MASTER表示为主服务器,BACKUP表示为备服务器
interface eth0 #指定HA监测网络的接口
virtual_router_id 51 #虚拟路由标识,是一个数字,同一个vrrp实例使用唯一的标识,即同一个vrrp_instance下,MASTER和BACKUP必须是一致的
priority 100 #定义优先级,数字越大,优先级越高。在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级
advert_int 1 #设定MASTER和BACKUP负载均衡器之间同步检查的时间间隔,单位:秒
authentication { #设定验证类型和密码
auth_type PASS #设定验证类型,主要有PASS和AH两种
auth_pass 1111 #设置验证密码,在一个vrrp_instance下,MASTER和BACKUP须使用相同密码
}
virtual_ipaddress { #设置虚拟IP地址,每行一个,可设置多个
192.168.3.40
}
}
#虚拟服务器定义部分
virtual_server 192.168.3.40 3306 { #设置虚拟服务器,指定虚拟IP和服务端口,IP与端口之间用空格隔开;本例Real Server用于运行MySQL从库,所以此处指定MySQL的服
#务端口:3306
delay_loop 6 #设置运行情况检查时间,单位:秒
lb_algo lc #设置负载调度算法,本例采用wlc,有4种常用算法:rr(轮询)、wrr(加权轮询)、lc(最少连接)、wlc(加权最少连接),本例采用lc算法。
lb_kind DR #设置LVS的负载均衡机制,有NAT,TUN,DR三种,本例采用DR调度模式,这是性能最好的。
nat_mask 255.255.255.0
#persistence_timeout 50 #会话保持时间,单位:秒。该选项对动态网页非常有用,为集群系统中的session共享提供了一个很好的解决方案。有了这个会话保持功能,
#用户的请求会一直分发到某个服务器节点,直到超过这个会话的保持时间。需要注意的是,这个会话保持时间是最大无响应超时时间,也就是说,
#用户在操作动态页面时,如果在50秒内没有执行任何操作,那么接下来的操作会被分发到另外节点,但如果用户一直在操作动态页面,则不受此时间限制。
protocol TCP #指定转发协议类型,有TCP和UDP两种
real_server 192.168.3.108 3306 { #配置服务节点1,需要指定real server的真实IP地址和端口,IP和端口之间用空格隔开
weight 100 #配置服务器节点的权值,权值大小用数字标识,数字越大,权值越高,设置权值的大小可以为不同性能的服务器分配不同的负载,
#如:为性能高的服务器设置较高的权 值,为性能较低的服务器设置相对较低的权值,以便合理利用和分配系统资源。
TCP_CHECK { #real server的状态检测设置部分,单位:秒
connect_timeout 3 #表示3秒无响应超时
nb_get_retry 3 #表示重试次数
delay_before_retry 3 #表示重试的间隔
}
}
real_server 192.168.3.74 3306 { #配置服务器节点2
weight 100
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
说明:在配置keepalived.conf时,需特别注意配置文件的语法格式,因为keepalived在启动时并不检测配置文件的正确性,即使没有配置文件,也可照样启动。缺省情况下,Keepalived启动时会查找/etc/keepalived/keepalived.conf配置文件。
5、编写脚本 lvs_real.sh
#!/bin/bash
# description: Config realserver
SNS_VIP=192.168.3.40
/etc/rc.d/init.d/functions
case "$1" in
start)
/sbin/ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP
/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
sysctl -p >/dev/null 2>&1
echo "RealServer Start OK"
;;
stop)
/sbin/ifconfig lo:0 down
/sbin/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"
;;
status)
islothere='/sbin/ifconfig lo:0 |grep $SNS_VIP'
if test -z "$islothere" ; then
echo "LVS_VIP is not Start for Real Server"
else
echo "LVS_VIP is Running on Real Server"
fi
;;
*)
echo "Usage: $0 {start|status|stop}"
exit 1
esac
配置完成后,为服务lvsrs添加可执行权限,然后就可启动或关闭lvsrs了。启动后,可通过ifconfig命令查看VIP是否成功添加;注意此时VIP即使成功添加,也是ping不通的。
6、开启服务
sh lvs_real.sh start
service keepalived start
这是就可以ping 通VIP了
7、拷贝lvs_real.sh 到每个节点
scp lvs_real.sh root@192.168.3.108:/etc/init.d
scp lvs_real.sh root@192.168.3.74:/etc/init.d
8、配置各项服务开启自动启动
lvs
cp /root/lvs_real.sh /etc/init.d/lvs_real.sh
vi /etc/init.d/lvs_real.sh
加入 # chkconfig: 2345 64 36
chkconfig --add lvs_real.sh
chkconfig lvs_real.sh on
chkconfig keepalived on
节点配置:
vi /etc/init.d/lvs_real.sh
加入 # chkconfig: 2345 64 36
chkconfig --add lvs_real.sh
chkconfig lvs_real.sh on
service iptables stop
chkconfig iptables off
三、测试
本方案是由一台负载调度器(Director Server)和两台Real Server组成的负载均衡集群,由LVS软件实现。正常情况下,用户请求通过VIP到达Director Server,然后由其根据负载均衡算法选择一台Real Server响应用户;当监测到某一台Real Server故障时,则将其剔除集群,不再提供服务,待恢复正常后,自动加入继续提供服务。
――负载均衡功能
在一台客户端机器上并发创建客户端连接,以模拟用户请求:
# mysqlslap -uroot -proot123 -h192.168.3.40 -P3306 --concurrency=100 --iterations=5 --create-schema='information_schema' --query='select count(*) from processlist;' --number-of-queries=10000 --debug-info
在此期间,查看两台Slave从库上的连接数:
# ipvsadm --list
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCPlocalhost:mysql lc persistent 50
-> localhost:mysql Route 100 48 154
-> localhost:mysql Route 100 1 0
# ipvsadm --list
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCPlocalhost:mysql lc persistent 50
-> localhost:mysql Route 100 49 253
-> localhost:mysql Route 100 1 0
# ipvsadm --list
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCPlocalhost:mysql lc persistent 50
-> localhost:mysql Route 100 61 341
-> localhost:mysql Route 100 1 0
# ipvsadm --list
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCPlocalhost:mysql lc persistent 50
-> localhost:mysql Route 100 32 370
-> localhost:mysql Route 100 1 0
从两台Slave从库上查询,每台从库均创建了多个连接,连接是动态变化的,所以连接数并不是绝对平均。
――故障转移功能
将node1上的MySQL实例关闭,模拟此节点故障,然后查看主Director Server上日志
# service mysql stop
Shutting down MySQL...
# tail /var/log/messages
Apr4 00:01:22 localhost Keepalived_healthcheckers: TCP connection to failed !!!
Apr4 00:01:22 localhost Keepalived_healthcheckers: Removing service from VS
日志显示,Keepalived检测到192.168.3.108:3306端口连接失败,则将其从VS 中剔除了;此时若再次连接MySQL,会发现所有连接均在192.168.3.74上。
将node1上的MySQL实例重新启动,模拟节点恢复,然后查看主Director Server上日志
# service mysql start
Starting MySQL..
# tail /var/log/messages
Apr4 00:06:52 localhost Keepalived_healthcheckers: TCP connection to success.
Apr4 00:06:52 localhost Keepalived_healthcheckers: Adding service to VS
可见,Real Server恢复后,Keepalived可立即监测到,此时自动将其添加到LVS集群中。
页:
[1]