您的位置:首页 > 数据库 > MySQL

LVS+Keepalived

2014-04-04 15:41 274 查看

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

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集群中。


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  MySQL LVS+Keepalived