prollerweg 发表于 2015-11-20 07:57:19

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 {
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]
查看完整版本: LVS+Keepalived