上篇记录了keepalive的安装和双机热备的实现,今天记录下lvs负载均衡的配置搭建(DR模式--Direct Routing)
1、安装ipvsadm
下载ipvsadm,下载时需注意对应自己的内核版本。
ipvsadm下载网址:http://www.linuxvirtualserver.org/software/
本文使用的是FC8系统,内核版本2.6.23.1,对应ipvsadm版本1.24。
安装时需要Linux内核源码,如果安装系统时没有安装源码,需要再下载内核源码。本文使用的内核是linux-2.6.23.1.tar.bz2。把内核解压到/usr/src/linux-2.6.23.1。下面开始
编译安装:(centos默认就已经安装)
建立内核快捷方式:ln -s /usr/src/linux-2.6.23.1 /usr/src/linux
解压ipvsadm:
tar zxvf ipvsadm-1.24.tar.gz
安装ipvsadm:
cd ipvsadm-1.24
make
make install
安装完成后,下一步我们开始配置IPVS
2、配置keepalive
主要就是修改conf,增加virtual_server模块:
virtual_server 192.168.0.200 80 <pre name="code" class="plain">virtual_server 192.168.0.200 22
virtual_server 192.168.0.200 6379 分别是HTTP、ssh、redis的端口,都是TCP 的(UDP还没实验)
! Configuration File for keepalived global_defs { notification_email { [email protected] } notification_email_from [email protected] smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id LVS_DEVEL } vrrp_instance lnmp { state MASTER #默认master,其它director机器改为<span><span> BACKUP</span></span> interface eth0 virtual_router_id 100 priority 170 advert_int 5 track_interface { eth0 } authentication { auth_type PASS auth_pass 123456 } virtual_ipaddress { 192.168.0.200 eth0 } virtual_server 192.168.0.200 80 { delay_loop 6 //隔6秒查询 lb_algo wrr //lvs算法 lb_kind DR //(Direct Route) persistence_timeout 60 //同一IP的连接60秒内被分配到同一台realserver inhibit_on_failure //当web挂掉的时候,前面请求的用户,可以继续打开网页,但是后面的请求不会调度到挂掉的web上面。 protocol TCP //用TCP协议检查realserver状态 real_server 192.168.0.157 80 { weight 3 //权重 TCP_CHECK { connect_timeout 10 //10秒无响应超时 nb_get_retry 3 delay_before_retry 3 } } real_server 192.168.0.162 80 { weight 1 TCP_CHECK { connect_timeout 10 nb_get_retry 3 delay_before_retry 3 } } virtual_server 192.168.0.200 22 { delay_loop 6 //隔6秒查询 lb_algo wrr //lvs算法 lb_kind DR //(Direct Route) persistence_timeout 60 //同一IP的连接60秒内被分配到同一台realserver inhibit_on_failure //当web挂掉的时候,前面请求的用户,可以继续打开网页,但是后面的请求不会调度到挂掉的web上面。 protocol TCP //用TCP协议检查realserver状态 real_server 192.168.0.157 22 { weight 3 //权重 TCP_CHECK { connect_timeout 10 //10秒无响应超时 nb_get_retry 3 delay_before_retry 3 } } real_server 192.168.0.162 22 { weight 1 TCP_CHECK { connect_timeout 10 nb_get_retry 3 delay_before_retry 3 } } virtual_server 192.168.0.200 6379 { delay_loop 6 //隔6秒查询 lb_algo wrr //lvs算法 lb_kind DR //(Direct Route) persistence_timeout 60 //同一IP的连接60秒内被分配到同一台realserver inhibit_on_failure //当web挂掉的时候,前面请求的用户,可以继续打开网页,但是后面的请求不会调度到挂掉的web上面。 protocol TCP //用TCP协议检查realserver状态 real_server 192.168.0.157 6379 { weight 3 //权重 TCP_CHECK { connect_timeout 10 //10秒无响应超时 nb_get_retry 3 delay_before_retry 3 } } real_server 192.168.0.162 6379 { weight 1 TCP_CHECK { connect_timeout 10 nb_get_retry 3 delay_before_retry 3 } } }
有几个地方解释一下:
state MASTER :表示是主服务器
priority 101 : 主的权重要高于从
virtual_ipaddress :对外提供的虚拟IP
lb_algo rr : LVS有8种调度算法:
轮叫(Round Robin)
调度器通过"轮叫"调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而不管服务器上实际的连接数和系统负载。
加权轮叫(Weighted Round Robin)
调度器通过"加权轮叫"调度算法根据真实服务器的不同处理能力来调度访问请求。这样可以保证处理能力强的服务器处理更多的访问流量。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。
最少链接(Least Connections)
调度器通过"最少连接"调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用"最小连接"调度算法可以较好地均衡负载。
加权最少链接(Weighted Least Connections)
在集群系统中的服务器性能差异较大的情况下,调度器采用"加权最少链接"调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。
基于局部性的最少链接(Locality-Based Least Connections)
"基于局部性的最少链接" 调度算法是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。该算法根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器 是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用"最少链接"的原则选出一个可用的服务 器,将请求发送到该服务器。
带复制的基于局部性最少链接(Locality-Based Least Connections with Replication)
"带复制的基于局部性最少链接"调度算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。它与LBLC算法的不同之处是它要维护从一个 目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。该算法根据请求的目标IP地址找出该目标IP地址对应的服务 器组,按"最小连接"原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器,若服务器超载;则按"最小连接"原则从这个集群中选出一 台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的 程度。
目标地址散列(Destination Hashing)
"目标地址散列"调度算法根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。
源地址散列(Source Hashing)
"源地址散列"调度算法根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空
lb_kind :LVS的3种包转发模式:
protocol TCP: 采用TCP/UDP协议
real_server: 物理服务器
3、配置lvs
1)开启路由转发
# vi /etc/sysctl.conf
net.ipv4.ip_forward = 1
# sysctl -p
2)在Director上新增一个IP(192.168.0.200),命名为eth0:1(用lo也行),作为Virtual IP,否则会丢弃数据包。
ifconfig eth0:1 192.168.0.200 broadcast 192.168.0.200 netmask 255.255.255.255 up
或者更完善一点用脚本
VIP = 192.168.0.200 /etc/rc.d/init.d/functions case $1 in start) echo "Start Realserver" /sbin/ifconfig eth0:1 $vip broadcast $vip netmask 255.255.255.255 up echo "1" > /proc/sys/net/ipv4/conf/eth0/arp_ignore echo "2" > /proc/sys/net/ipv4/conf/eth0/arp_announce echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce ;; stop) echo "Stop Realserver" /sbin/ifconfig eth0:1 down echo "0" > /proc/sys/net/ipv4/conf/eth0/arp_ignore echo "0" > /proc/sys/net/ipv4/conf/eth0/arp_announce echo "0" > /proc/sys/net/ipv4/conf/all/arp_ignore echo "0" > /proc/sys/net/ipv4/conf/all/arp_announce ;; *) echo "Usage: $0 (start | stop)" exit 1 esac
ifconfig 看看是否有设备eth0:1了
3)在ipvsadm配置
创建一个配置脚本,方便在多台Director机器(安装有keepalive)上进行配置,
#vi lvsdr.sh
#!/bin/bash VIP=192.168.0.200 #虚拟IP ,对外提供,所有director使用统一的 RIP1=192.168.0.157 RIP2=192.168.0.162 #realserver有几个,这里配几个 /sbin/rc.d/init.d/functions #报不存在,不知道原因 case "$1" in start) echo "start LVS of DirectorServer" #Set the Virtual IP Address /sbin/ifconfig eth0:1 $VIP broadcast $VIP netmask 255.255.255.0 up /sbin/route add -host $VIP dev eth0:1 #Clear IPVS Table /sbin/ipvsadm -C #Set Lvs /sbin/ipvsadm -A -t $VIP:80 -s wrr #增加服务 HTTP /sbin/ipvsadm -a -t $VIP:80 -r $RIP1:80 -g #增加服务的真实服务器记录 /sbin/ipvsadm -a -t $VIP:80 -r $RIP2:80 -g /sbin/ipvsadm -A -t $VIP:22 -s wrr #增加服务 SSH /sbin/ipvsadm -a -t $VIP:22 -r $RIP1:22 -g /sbin/ipvsadm -a -t $VIP:22 -r $RIP2:22 -g /sbin/ipvsadm -A -t $VIP:6379 -s wrr #增加服务 Redis /sbin/ipvsadm -a -t $VIP:6379 -r $RIP1:6379 -g /sbin/ipvsadm -a -t $VIP:6379 -r $RIP2:6379 -g #Run Lvs /sbin/ipvsadm ;; stop) echo "Close LVS Directorserver" /sbin/ifconfig eth0:1 down /sbin/ipvsadm -C ;; *) echo "Usage0{start|stop}" exit 1 esac
查看调用情况:
ipvsadm -L --stats 或 ipvsadm -ln
几点说明一下:
-C:清除虚拟内核服务器表中记录
-A: 添加虚拟服务器
-s:使用的调度算法,有这样几个选项rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,默认的调度算法是:wlc
-a:-add-server 在内核虚拟服务器表的一条记录里添加一条新的真实服务器记录。也就是在一个虚拟服务器中增加一台新的真实服务器
-r: 真实的服务器
-g:--gatewaying 指定LVS 的工作模式为直接路由模式(也是LVS 默认的模式)
4、配置HTTP服务业面
#vi /var/www/html/index.html
内容:<h1>WEB1 / 192.168.0.157</h1>
备注:不同的realServer把内容中的IP对应改一下
5、启动服务
service keepalived restart ./lvsdr.sh start因为配置里有时间设置,以及网络协商, 有时可能需要等一会才能生效
然后就测试吧!!!
如果连不通,请查看iptables、selinx
//参考:
http://jingpin.jikexueyuan.com/article/27180.html
http://www.myexception.cn/vsts/440810.html
http://blog.csdn.net/beyondlpf/article/details/17963907
http://www.it165.net/admin/html/201305/1274.html
http://www.tuicool.com/articles/jaeY7nA
http://blog.chinaunix.net/uid-26893610-id-3196774.html
http://www.cnblogs.com/mchina/archive/2012/08/27/2644391.html