LVS+Keepalived



LVS
       lvs是一个开源的软件,可以实现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 {
 [email protected]        #设置报警邮件地址,每行一个,可设置多个。注意,若要开启邮件报警,需开启本机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 [email protected]:/etc/init.d
scp lvs_real.sh [email protected]:/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
TCP  localhost:mysql lc persistent 50
  -> localhost:mysql              Route   100    48         154      
  -> localhost:mysql              Route   100    1          0        
[root@localhost ~]# ipvsadm --list
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  localhost:mysql lc persistent 50
  -> localhost:mysql              Route   100    49         253      
  -> localhost:mysql              Route   100    1          0        
[root@localhost ~]# ipvsadm --list
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  localhost:mysql lc persistent 50
  -> localhost:mysql              Route   100    61         341      
  -> localhost:mysql              Route   100    1          0        
[root@localhost ~]# ipvsadm --list
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  localhost:mysql lc persistent 50
  -> localhost:mysql              Route   100    32         370      
  -> localhost:mysql              Route   100    1          0 

从两台Slave从库上查询,每台从库均创建了多个连接,连接是动态变化的,所以连接数并不是绝对平均。

――故障转移功能
将node1上的MySQL实例关闭,模拟此节点故障,然后查看主Director Server上日志
[root@localhost ~]# service mysql stop
Shutting down MySQL...                                     [  OK  ]

[root@node1 ~]# tail /var/log/messages
Apr  4 00:01:22 localhost Keepalived_healthcheckers: TCP connection to [192.168.3.108:3306] failed !!!
Apr  4 00:01:22 localhost Keepalived_healthcheckers: Removing service [192.168.3.108:3306] from VS [192.168.3.40:3306]


日志显示,Keepalived检测到192.168.3.108:3306端口连接失败,则将其从VS [192.168.3.40:3306]中剔除了;此时若再次连接MySQL,会发现所有连接均在192.168.3.74上。
将node1上的MySQL实例重新启动,模拟节点恢复,然后查看主Director Server上日志
[root@localhost ~]# service mysql start
Starting MySQL..                                           [  OK  ]

[root@node1 ~]# tail /var/log/messages
Apr  4 00:06:52 localhost Keepalived_healthcheckers: TCP connection to [192.168.3.108:3306] success.
Apr  4 00:06:52 localhost Keepalived_healthcheckers: Adding service [192.168.3.108:3306] to VS [192.168.3.40:3306]

可见,Real Server恢复后,Keepalived可立即监测到,此时自动将其添加到LVS集群中。


发布了46 篇原创文章 · 获赞 30 · 访问量 9万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章