实验环境 redhat6.5 2.6.32-431.el6.x86_64
keepalived-1.2.16版本
ipvsadm-1.26-2.el6.x86_64
所有的虚拟机 都 关闭防火墙和selinux 配置好了本地yum源
搭建要求是对LVS-DR模式的原理熟悉,先配置好LVS-DR所需的环境。这里的环境是配置VIP DIP DIP 在同一个网段,并在realserver的lo接口上做好了arp抑制。具体见后面的脚本
当keepalived和LVS结合时,注意不需要在director上对ipvsadm手工的做配置,切记。在keepalived的配置文件里会配置lvs的VIP,RIP。 所有的配置只在keepalived的配置文件中就可以了。之前是先做的LVS-DR模式 所以先配置了ipvsadm后修改keepalived.conf结果画蛇贴足,导致无法搭建成功。
本次实验中 是搭建web的高可用负载均衡
DR1 VIP:192.168.168.12 DIP:192.168.168.100
DR2 VIP: 192.168.168.12 DIP:192.168.168.107
realserver1 VIP : 192.168.168.12 RIP1: 192.168.168.102
realserver2 VIP: 192.168.168.12 RIP2:192.168.168.103
前提 :realserver1和realserver2已经安装了 httpd
********************首先搭建DR1 *********
1,软件的安装 DR1和DR2上安装 ipvsadm 和 keepalived
####################安装ipvsadm管理lvs#######################
首先lsmod查看是否支持lvs模块
root@dr100 ~ # lsmod | grep -i ip
ip_vs_rr 1420 1
ip_vs 125220 3 ip_vs_rr
可以看出支持 然后进入本地的yum源挂载目录安装ipvsadm (LVS已经编译到内核)
root@dr100 ~ # cd /mnt/Packages/
root@dr100 Packages # rpm -ivh ipvsadm-1.26-2.el6.x86_64.rpm
2.#######################然后安装keepalived####################
root@dr100 src # tar -zxvf keepalived-1.2.16.tar.gz
root@dr100 src # cd keepalived-1.2.16
root@dr100 keepalived-1.2.16 # ./configure --with-kernel-dir=/usr/src/kernels/2.6.32-431.el6.x86_64/
可能会有依赖性
root@dr100 keepalived-1.2.16 # yum install -y openssl-devel
root@dr100 keepalived-1.2.16 # ./configure --with-kernel-dir=/usr/src/kernels/2.6.32-431.el6.x86_64/ 将keepalived整合到内核当中
root@dr100 keepalived-1.2.16 # make && make install
root@dr100 keepalived-1.2.16 # echo $?
0
下来将keepalived的配置文件复制到对应的配置文件,方便配置。
root@dr100 keepalived-1.2.16 # cp /usr/local/etc/rc.d/init.d/keepalived /etc/init.d/
root@dr100 keepalived-1.2.16 # cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/
root@dr100 keepalived-1.2.16 # mkdir /etc/keepalived
root@dr100 keepalived-1.2.16 # cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/
root@dr100 keepalived-1.2.16 # cp /usr/local/sbin/keepalived /usr/sbin/
root@dr100 keepalived-1.2.16 # cd ~
#######################安装完毕进行配置#####################
root@dr100 keepalived-1.2.16 # cd ~
root@dr100 ~ # vim /etc/keepalived/keepalived.conf 主配置文件
root@dr100 ~ #
root@dr100 ~ # cat !$
cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc #设置报警邮件地址,可以设置多个,每行1个,
failover@firewall.loc #需开启邮件报警及本机的Sendmail服务。
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.168.12 #设置SMTP Server地址;
smtp_connect_timeout 30
router_id LVS_DEVEL
}
########VRRP Instance########
vrrp_instance VI_1 {
state MASTER #指定Keepalived的角色,MASTER为主机服务器,BACKUP为备用服务器
interface eth0 #BACKUP为备用服务器
virtual_router_id 51
priority 100 #定义优先级,数字越大,优先级越高,主DR必须大于备用DR。
advert_int 1
authentication {
auth_type PASS #设置验证类型,主要有PASS和AH两种
auth_pass 1111 #设置验证密码
}
virtual_ipaddress {
192.168.168.12 #设置主DR的虚拟IP地址(virtual IP),可多设,但必须每行1个
}
}
########Virtual Server########
virtual_server 192.168.168.12 80 { #注意IP地址与端口号之间用空格隔开
delay_loop 6 #设置健康检查时间,单位是秒
lb_algo rr #设置负载调度算法,默认为rr,即轮询算法,最优秀是wlc算法
lb_kind DR #设置LVS实现LB机制,有NAT、TUNN和DR三个模式可选
nat_mask 255.255.255.0
# persistence_timeout 1 #会话保持时间,单位为秒 实验要注释掉方便看出轮询
protocol TCP #指定转发协议类型,有TCP和UDP两种
real_server 192.168.168.102 80 { #定义realserver 的ip 地址和 端口
weight 1 #配置节点权值,数字越大权值越高
TCP_CHECK {
connect_timeout 3 #表示3秒无响应,则超时
nb_get_retry 3 #表示重试次数
delay_before_retry 3 #表示重试间隔
}
}
real_server 192.168.168.103 80 { #配置服务器节点,即Real Server2的public IP
weight 1 #配置节点权值,数字越大权值越高
TCP_CHECK {
connect_timeout 3 #表示3秒无响应,则超时
nb_get_retry 3 #表示重试次数
delay_before_retry 3 #表示重试间隔
}
}
}
配置完成
root@dr100 ~ # /etc/init.d/keepalived start
3. ##############DR1配置完成开始配置realserver1和realserver2################
realserver1 配置 使用脚本配置
root@realserver1 ~ # cat lvs.dr.sh
#!/bin/bash
vip=192.168.168.12
/etc/init.d/httpd start #启动apache 没有安装的请自己先安装
case $1 in
start)
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore #这四行是做arp抑制
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
ip addr add dev lo $vip
ip a | grep -w inet
echo "this is for start"
;;
stop)
echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore #恢复arp
echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
ip addr del dev lo $vip
ip a | grep -w inet
echo "this is for stop"
;;
*)
echo "plesase start or stop"
;;
esac
exit 0
root@realserver1 ~ # sh lvs.dr.sh start
root@realserver1 ~ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet 192.168.168.12/32 scope global lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:0b:b0:4e brd ff:ff:ff:ff:ff:ff
inet 192.168.168.102/24 brd 192.168.168.255 scope global eth0
inet6 fe80::20c:29ff:fe0b:b04e/64 scope link
valid_lft forever preferred_lft forever
root@realserver1 ~ # echo "real server 192.168.168.102" >/var/www/index.html
realserver2 同理
root@realserver2 ~ # cat lvs.dr.sh
#!/bin/bash
vip=192.168.168.12
/etc/init.d/httpd start
case $1 in
start)
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
ip addr add dev lo $vip
ip a | grep -w inet
echo "this is for start"
;;
stop)
echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
ip addr del dev lo $vip
ip a | grep -w inet
echo "this is for stop"
;;
*)
echo "plesase start or stop"
;;
esac
exit 0
root@realserver2 ~ # sh lvs.dr.sh start
root@realserver2 ~ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet 192.168.168.12/32 scope global lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:2a:85:bb brd ff:ff:ff:ff:ff:ff
inet 192.168.168.103/24 brd 192.168.168.255 scope global eth0
inet6 fe80::20c:29ff:fe2a:85bb/64 scope link
valid_lft forever preferred_lft forever
root@realserver1 ~ # echo "real server 192.168.168.103" >/var/www/index.html
4. #############realserver配置完成后 在DR1查看################
root@dr100 ~ # ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.168.12:80 rr
-> 192.168.168.102:80 Route 1 0 0
-> 192.168.168.103:80 Route 1 0 0
出现这个表明配置成功 可以将ipvsadm配置保存在文件中
root@dr100 ~ # ipvsadm-save > ipvsadm.txt 保存到文件ipvsadm.txt中
root@dr100 ~ # cat ipvsadm.txt
-A -t bogon:http -s rr
-a -t bogon:http -r bogon:http -g -w 1
-a -t bogon:http -r bogon:http -g -w 1
root@dr100 ~ # ipvsadm-restore < ipvsadm.txt 将文件导入到ipvsadm的设置中
5. ###################打开浏览器验证#################
打开浏览器访问VIP 192.168.168.12
F5 刷新
说明DR1已搭建成功 下面搭建DR2
**********************DR2的配置***************************
重复DR1中的ipvsadm和keepalived的安装,这里就不多说了
DR1和DR2的区别是 keepalived..conf 的配置 中的master改为backup 然后更改优先级就可以了。
root@dr107 ~ #
root@dr107 ~ # cat !$
cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc #设置报警邮件地址,可以设置多个,每行1个,
failover@firewall.loc #需开启邮件报警及本机的Sendmail服务。
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.168.12 #设置SMTP Server地址;
smtp_connect_timeout 30
router_id LVS_DEVEL
}
########VRRP Instance########
vrrp_instance VI_1 {
state BACKUP #指定Keepalived的角色,MASTER为主机服务器,BACKUP为备用服务器
interface eth0 #BACKUP为备用服务器
virtual_router_id 51
priority 50 #定义优先级,数字越大,优先级越高,主DR必须大于备用DR。
advert_int 1
authentication {
auth_type PASS #设置验证类型,主要有PASS和AH两种
auth_pass 1111 #设置验证密码 主从要一致
}
virtual_ipaddress {
192.168.168.12 #设置主DR的虚拟IP地址(virtual IP),可多设,但必须每行1个
}
}
########Virtual Server########
virtual_server 192.168.168.12 80 { #注意IP地址与端口号之间用空格隔开
delay_loop 6 #设置健康检查时间,单位是秒
lb_algo rr #设置负载调度算法,默认为rr,即轮询算法,最优秀是wlc算法
lb_kind DR #设置LVS实现LB机制,有NAT、TUNN和DR三个模式可选
nat_mask 255.255.255.0
# persistence_timeout 1 #会话保持时间,单位为秒 实验要注释掉方便看出轮询
protocol TCP #指定转发协议类型,有TCP和UDP两种
real_server 192.168.168.102 80 {
weight 1 #配置节点权值,数字越大权值越高
TCP_CHECK {
connect_timeout 3 #表示3秒无响应,则超时
nb_get_retry 3 #表示重试次数
delay_before_retry 3 #表示重试间隔
}
}
real_server 192.168.168.103 80 { #配置服务器节点,即Real Server2的public IP
weight 1 #配置节点权值,数字越大权值越高
TCP_CHECK {
connect_timeout 3 #表示3秒无响应,则超时
nb_get_retry 3 #表示重试次数
delay_before_retry 3 #表示重试间隔
}
}
}
然后开启keepalived
root@dr107 ~ # /etc/init.d/keepalived start
root@dr107 ~ # ipvsadm -Ln 查看
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.168.12:80 rr
-> 192.168.168.102:80 Route 1 0 0
-> 192.168.168.103:80 Route 1 0 0
##################都配置成功了,可以宕机检验了。#######################
****************************以下时网上找到的理论知识 *********************************************
1. LVS简介:
LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。章文嵩博士目前工作于阿里集团,主要从事集群技术、操作系统、对象存储与数据库的研究。(摘自《BAIDU百科》)
2. LVS集群的组成:
LVS服务器系统由三部分组成:
1)负载均衡层:
位于整个集群系统的最前端,避免单点故障一般最少由2台或2台以上负载调度器组成。
2)服务器群组层:
是一组真正运行应用服务器的机器组成,Real Server可以是Web、FTP、DNS、Mail 、视频等服务器中的一个或N个,每个Real Server之间通过高速的LAN/WAN相连接。为了节省宝贵的资源,在生产环境中,Director Server同时身兼Real Server的角色!
3)共享存储层:
为Real Server提供共享存储空间和内容一致性的存储区域。可以为磁盘阵列、Red Hat的GFS文件系统、Oracle的OCFS2文件系统等。
Director Server是整个LVS的核心!到目前为止,Director server只能安装在Linux、FreeBSD上,如果Linux内核是2.6及以上时,则已经内置了LVS的各个模块,不用作任何的设置就支持LVS功能。
Real Server服务器几乎为所有有系统平台,如:Windows、Linux、Solaris、AIX、BSD等系统平台。
常见的3中模式 还有第四种
1、NAT模式-网络地址转换
Virtualserver via Network address translation(VS/NAT)
这个是通过网络地址转换的方法来实现调度的。首先调度器(LB)接收到客户的请求数据包时(请求的目的IP为VIP),根据调度算法决定将请求发送给哪个后端的真实服务器(RS)。然后调度就把客户端发送的请求数据包的目标IP地址及端口改成后端真实服务器的IP地址(RIP),这样真实服务器(RS)就能够接收到客户的请求数据包了。真实服务器响应完请求后,查看默认路由(NAT模式下我们需要把RS的默认路由设置为LB服务器。)把响应后的数据包发送给LB,LB再接收到响应包后,把包的源地址改成虚拟地址(VIP)然后发送回给客户端。
大致可分为几个步骤
1)客户端请求数据,目标IP为VIP
2)请求数据到达LB服务器,LB根据调度算法将目的地址修改为RIP地址及对应端口(此RIP地址是根据调度算法得出的。)并在连接HASH表中记录下这个连接。
3)数据包从LB服务器到达RS服务器webserver,然后webserver进行响应。Webserver的网关必须是LB,然后将数据返回给LB服务器。
4)收到RS的返回后的数据,根据连接HASH表修改源地址VIP&目标地址CIP,及对应端口80.然后数据就从LB出发到达客户端。
5)客户端收到的就只能看到VIP\DIP信息。
NAT模式优缺点:
1、NAT技术将请求的报文和响应的报文都需要通过LB进行地址改写,因此网站访问量比较大的时候LB负载均衡调度器有比较大的瓶颈,一般要求最多之能10-20台节点
2、只需要在LB上配置一个公网IP地址就可以了。
3、每台内部的节点服务器的网关地址必须是调度器LB的内网地址。
4、NAT模式支持对IP地址和端口进行转换。即用户请求的端口和真实服务器的端口可以不一致。
2、TUN模式
virtual server via ip tunneling模式:采用NAT模式时,由于请求和响应的报文必须通过调度器地址重写,当客户请求越来越多时,调度器处理能力将成为瓶颈。为了解决这个问题,调度器把请求的报文通过IP隧道转发到真实的服务器。真实的服务器将响应处理后的数据直接返回给客户端。这样调度器就只处理请求入站报文,由于一般网络服务应答数据比请求报文大很多,采用VS/TUN模式后,集群系统的最大吞吐量可以提高10倍。
VS/TUN的工作,它和NAT模式不同的是,它在LB和RS之间的传输不用改写IP地址。而是把客户请求包封装在一个IP tunnel里面,然后发送给RS节点服务器,节点服务器接收到之后解开IP tunnel后,进行响应处理。并且直接把包通过自己的外网地址发送给客户不用经过LB服务器。
1)客户请求数据包,目标地址VIP发送到LB上。
2)LB接收到客户请求包,进行IP Tunnel封装。即在原有的包头加上IP Tunnel的包头。然后发送出去。
3)RS节点服务器根据IP Tunnel包头信息(此时就又一种逻辑上的隐形隧道,只有LB和RS之间懂)收到请求包,然后解开IP Tunnel包头信息,得到客户的请求包并进行响应处理。
4)响应处理完毕之后,RS服务器使用自己的出公网的线路,将这个响应数据包发送给客户端。源IP地址还是VIP地址。(RS节点服务器需要在本地回环接口配置VIP,做arp抑制)
3、DR模式(直接路由模式)
Virtual server via direct routing (vs/dr)
DR模式是通过改写请求报文的目标MAC地址,将请求发给真实服务器的,而真实服务器响应后的处理结果直接返回给客户端用户。同TUN模式一样,DR模式可以极大的提高集群系统的伸缩性。而且DR模式没有IP隧道的开销,对集群中的真实服务器也没有必要必须支持IP隧道协议的要求。但是要求调度器LB与真实服务器RS都有一块网卡连接到同一物理网段上,必须在同一个局域网环境。
DR模式是互联网使用比较多的一种模式。DR模式原理过程简述:
VS/DR模式的工作,它的连接调度和管理与NAT和TUN中的一样,它的报文转发方法和前两种不同。DR模式将报文直接路由给目标真实服务器。在DR模式中,调度器根据各个真实服务器的负载情况,连接数多少等,动态地选择一台服务器,不修改目标IP地址和目标端口,也不封装IP报文,而是将请求报文的数据帧的目标MAC地址改为真实服务器的MAC地址。然后再将修改的数据帧在服务器组的局域网上发送。因为数据帧的MAC地址是真实服务器的MAC地址,并且又在同一个局域网。那么根据局域网的通讯原理,真实复位是一定能够收到由LB发出的数据包。真实服务器接收到请求数据包的时候,解开IP包头查看到的目标IP是VIP。(此时只有自己的IP符合目标IP才会接收进来,所以我们需要在本地的回环借口上面配置VIP。另:由于网络接口都会进行ARP广播响应,但集群的其他机器都有这个VIP的lo接口,都响应就会冲突。所以我们需要把真实服务器的lo接口的ARP响应关闭掉。)然后真实服务器做成请求响应,之后根据自己的路由信息将这个响应数据包发送回给客户,并且源IP地址还是VIP。
DR模式小结:
1、通过在调度器LB上修改数据包的目的MAC地址实现转发。注意源地址仍然是CIP,目的地址仍然是VIP地址。
2、请求的报文经过调度器,而RS响应处理后的报文无需经过调度器LB,因此并发访问量大时使用效率很高(和NAT模式比)
3、因为DR模式是通过MAC地址改写机制实现转发,因此所有RS节点和调度器LB只能在一个局域网里面
4、RS主机需要绑定VIP地址在LO接口上,并且需要配置ARP抑制。
5、RS节点的默认网关不需要配置成LB,而是直接配置为上级路由的网关,能让RS直接出网就可以。
6、由于DR模式的调度器仅做MAC地址的改写,所以调度器LB就不能改写目标端口,那么RS服务器就得使用和VIP相同的端口提供服务。
LVS-DR+keepalived 搭建web高可用负载均衡
原文地址:http://19941018.blog.51cto.com/11889001/1926441