十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
下文给大家带来基于LVS-DR+keepalived 是如何搭建web高可用负载均衡的,希望能够给大家在实际运用中带来一定的帮助,负载均衡涉及的东西比较多,理论也不多,网上有很多书籍,今天我们就用创新互联在行业内累计的经验来做一个解答。
创新互联专注骨干网络服务器租用10年,服务更有保障!服务器租用,成都服务器托管 成都服务器租用,成都服务器托管,骨干网络带宽,享受低延迟,高速访问。灵活、实现低成本的共享或公网数据中心高速带宽的专属高性能服务器。
实验环境 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:
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:
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:
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:
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高可用负载均衡的,如果大家还有什么地方需要了解的可以在创新互联行业资讯里查找自己感兴趣的或者找我们的专业技术工程师解答的,创新互联技术工程师在行业内拥有十几年的经验了。