18.11 LVS DR模式搭建
18.12 keepalived + LVS DR
扩展
haproxy+keepalived http://blog.csdn.net/xrt95050/article/details/40926255
nginx、lvs、haproxy比较 http://www.csdn.net/article/2014-07-24/2820837
keepalived中自定义脚本 vrrp_script http://my.oschina.net/hncscwc/blog/158746
lvs dr模式只使用一个公网ip的实现方法 http://storysky.blog.51cto.com/628458/338726
18.11 LVS DR模式搭建:
在实际的生产环境中用的最多的就是DR模式。
NAT模式用的也不是很多,因为有一个瓶颈(10台机器以内的网站规模,访问量不是很大的情况下,可以使用NAT,好在他节省公网IP资源。)。对于小企业来讲公网IP还是要花钱的,所以用的IP少的话还是占优势的。
但是反过来讲用这种DR模式,用了几十台服务器或者以上,你每一台都要配置一个公网IP。这个就是很浪费IP资源的。尤其是现在公网IP越来越珍惜,实际上还有一种方案,就是搭建一个内部的LVS。就是全部都用内网,包括VIP也用内网。然后公网做一个映射就可以了。公网ip的80端口映射到内网的VIP的80端口。
DR模式搭建 – 准备工作:
~1.三台机器
~2.分发器,也叫调度器(简写为dir)
208.128
我们只需要一个网卡,一个IP。把133的网段作为一个公网IP。(NAT模式里我们把它作为内网,现在把它作为公网)
~3.rs1
208.130
~4.rs2
208.133
~5.vip
所有的机器都要绑定这个VIP
133.200
DR模式搭建:
~1.
dir上编写脚本 vim /usr/local/sbin/lvs_dr.sh //内容如下
#! /bin/bash
echo 1 > /proc/sys/net/ipv4/ip_forward #打开端口转发
ipv=/usr/sbin/ipvsadm #这是他的变量,以下也是
vip=192.168.208.200
rs1=192.168.208.132
rs2=192.168.208.133
#注意这里的网卡名字
ifdown ens33 相当于重启一下。会把之前命令行设置的IP清空掉。是因为如果再一次执行这个脚本,就不会重复的设置这个IP了
ifup ens33
ifconfig ens33:2 $vip broadcast $vip netmask 255.255.255.255 up #这是绑定VIP的命令
#ifconfig ens33:2 $vip ifconfig这个命令是可以给一个网卡设置虚拟网卡的。以上虚拟网卡的额名字叫ens33:2
#broadcast $vip broadcast是设置IP的命令
#route add -host $vip dev ens33:2 #添加网卡
$ipv -C #下面就是LVS ADM的规则。-C清空规则
$ipv -A -t $vip:80 -s rr #下面跟设置NAT模式是一样的
$ipv -a -t $vip:80 -r $rs1:80 -g -w 1 #-g就是DR模式
$ipv -a -t $vip:80 -r $rs2:80 -g -w 1
~2.
两台rs上也编写脚本 vim /usr/local/sbin/lvs_rs.sh//内容如下
#/bin/bash
vip=192.168.133.200 #需要的VIP
#把vip绑定在lo上,是为了实现rs直接把结果返回给客户端
ifdown lo
ifup lo
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip lo:0 #增加一个路由
#以下操作为更改arp内核参数,目的是为了让rs顺利发送mac地址给客户端
#参考文档www.cnblogs.com/lgfeng/archive/2012/10/16/2726308.html
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
~3.
分别在dir上和两个rs上执行这些脚本
~4.
测试
实例:
DR模式搭建 – 准备工作:
我们先把两台的rs机器的网关改回来(之前设置成了01的IP)
DR模式搭建:
[root@axinlinux-01 ~]# vim /usr/local/sbin/lvs_dr.sh #一样要写一个DR模式的脚本
#! /bin/bash
echo 1 > /proc/sys/net/ipv4/ip_forward
ipv=/usr/sbin/ipvsadm
vip=192.168.208.200
rs1=192.168.208.130
rs2=192.168.208.133
#注意这里的网卡名字
ifdown ens33
ifup ens33
ifconfig ens33:2 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip dev ens33:2
$ipv -C
$ipv -A -t $vip:80 -s rr
$ipv -a -t $vip:80 -r $rs1:80 -g -w 1
$ipv -a -t $vip:80 -r $rs2:80 -g -w 1
[root@axinlinux-01 network-scripts]# sh /usr/local/sbin/lvs_dr.sh #阿鑫执行到这一步的时候,报错了。是之前电脑重装系统后设置的IP,还是在之前的网卡(ens33:1)。删掉就好了
[root@axinlinux-02 network-scripts]# vi /usr/local/sbin/lvs_rs.sh #02也要设置脚本
#/bin/bash
vip=192.168.133.200
#把vip绑定在lo上,是为了实现rs直接把结果返回给客户端
ifdown lo
ifup lo
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip lo:0
#以下操作为更改arp内核参数,目的是为了让rs顺利发送mac地址给客户端
#参考文档www.cnblogs.com/lgfeng/archive/2012/10/16/2726308.html
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
[root@axinlinux-03 ~]# vim /usr/local/sbin/lvs_dr.sh #03也要设置脚本
#/bin/bash
vip=192.168.133.200
#把vip绑定在lo上,是为了实现rs直接把结果返回给客户端
ifdown lo
ifup lo
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip lo:0
#以下操作为更改arp内核参数,目的是为了让rs顺利发送mac地址给客户端
#参考文档www.cnblogs.com/lgfeng/archive/2012/10/16/2726308.html
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
[root@axinlinux-02 ~]# route -n #查看是否有208.200的路由。要先sh一下这个脚本才可以
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.208.2 0.0.0.0 UG 100 0 0 ens33
192.168.208.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
192.168.208.200 0.0.0.0 255.255.255.255 UH 0 0 0 lo
[root@axinlinux-02 ~]# ip add #查看是否设定了208.200这个IP
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet 192.168.208.200/32 brd 192.168.208.200 scope global lo:0
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:0d:d6:92 brd ff:ff:ff:ff:ff:ff
inet 192.168.208.130/24 brd 192.168.208.255 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe0d:d692/64 scope link
valid_lft forever preferred_lft forever
[root@axinlinux-04 ~]# route -n #因为之前的03有点问题。又重新高了个04来替代
[root@axinlinux-04 ~]# ip add
以上检查无误。脚本代表已执行
测试:浏览器访问
还是有缓存,在浏览器上看不出来。在linux上curl也不好使的,因为在dir本机上绑定了VIP,访问的话不就是访问他自己吗,这肯定就不对啦。rs上也绑定了VIP,不能访问这个VIP。最好的方法是在开一个虚拟机,设置成同一个网段
那么会有一个疑问,平时客户访问不都是在浏览器上访问吗,这样起不了负载均衡的作用啊。其实不用担心,当访问量达到一定程度时,他更定是能负载均衡的。
还有一点,咱们现在这个客户端IP是一样的,那就一个IP在访问,更定会有特殊的原因,导致一直请求到一台机器上去。缓存也好最终得不到我们想要的结果。当访问量很大的时候,自然就能起到均衡的作用
我们可以看看这个:
[root@axinlinux-01 ~]# 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.208.200:80 rr 活动的连接 不活动的连接
-> 192.168.208.130:80 Route 1 1 0
-> 192.168.208.134:80 Route 1 0 1
正常的话,访问量很大额时候,互动和不活动的连接都是1:1的效果
!!总结:LVS无论是NAT模式、DR模式、IPtunnel模式都是仅仅一个脚本就搞定了。不过需要注意的是,修改内核参数、打开端口转发这些千万不要忘。还有,NAT很关键的一点,必须要更改rs的网关为dir的内网IP!!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
18.12 keepalived + LVS DR:
再来看keepalived怎么直线负载均衡的功能。在之前我们说过,keepalived内置了LVS功能,那他是怎么内置的呢,怎么实现的呢,我到底用不用再去安装ipvsadm呢。
先来分析一下,为什么需要keepalived,把keepalived加入到LVS来。目的是什么呢。两个原因:
1.(分发器做高可用)
LVS有一个很关键的角色,就是分发器。那如果分发器宕机,那所有的访问都会被终止。因为我们的入口全部在dir上(在这个分发器上)。所以我们要把这个分发器做一个高可用。之前我们讲了用keepalived可以做高可用,所以keepalived放在这就很完美。并且他有负载均衡的作用。
2.(rs宕机不分发)
如果我们在使用LVS,没有其他额外的操作的话。其中我把一个rs关机,他是会出问题的(当分发到这个关掉的rs上,就会显示无法连接)。那就是说LVS并不聪明,即使后端的一个rs宕机,他同样的也会把请求转发过去。那我们keeplived出现就是为了解决这个问题。当我们后面的这个rs宕机,他也能保证服务正常提供,当请求分发过来的时候,他能自动检测到后面的rs已经宕机,那这时候就不会把请求转发到宕机的rs上去了
~1.完整架构需要两台服务器(角色为dir)分别安装keepalived软件,目的是实现高可用。但本次实验为节省资源,就用一个keepalived去搭建负载均衡的功能,所以本次实验可以只安装一台keepalived
~2.keepalived内置了ipvsadm的功能,所以不需要再安装ipvsadm包,也不用编写和执行那个lvs_dir的脚本
~3.三台机器分别为:
dir(安装keepalived)133.130
rs1 208.130
rs2 133.134
vip是208.200
~4.编辑keepalived配置文件 vim /etc/keepalived/keepalived.conf//内容请到https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D21Z/lvs_keepalived.conf 获取
需要更改里面的ip信息
~5.执行ipvsadm -C 把之前的ipvsadm规则清空掉
因为之前我们设置过这个虚拟IP。-ln可以看一下
~6.systemctl restart network 可以把之前的vip清空掉
~7.systemctl keepalived start 启动keepalived
~7.两台rs上,依然要执行/usr/local/sbin/lvs_rs.sh脚本
~8.keepalived有一个比较好的功能,可以在一台rs宕机时,不再把请求转发过去
测试
实例:
[root@axinlinux-01 ~]# vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
#备用服务器上为 BACKUP
state MASTER
#绑定vip的网卡为ens33,你的网卡和阿铭的可能不一样,这里需要你改一下
interface ens33
virtual_router_id 51
#备用服务器上为90
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass aminglinux
}
virtual_ipaddress {
192.168.208.200 #修改我们设定的VIP
}
}
virtual_server 192.168.208.200 80 { #这里的VIP也要修改
#(每隔10秒查询realserver状态)
delay_loop 10 # 检测realserver是否正常。通过这个参数去控制他的频率
#(lvs 算法)
lb_algo wlc #算法,到权重的最小链接
#(DR模式)
lb_kind DR #选择模式,如果是NAT就写NAT
#(同一IP的连接60秒内被分配到同一台realserver)
persistence_timeout 0 #这个我们可以不用60,可以改为0
#(用TCP协议检查realserver状态)
protocol TCP
real_server 192.168.208.130 80 { #这个就是rs是谁。端口如果监听的是8080,就写8080
#(权重)
weight 100
TCP_CHECK {
#(10秒无响应超时)
connect_timeout 10 #设置他的超时时间
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.208.134 80 { #这个是rs2。端口如果监听的是8080,就写8080
weight 100
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
[root@axinlinux-01 ~]# systemctl start keepalived.service
[root@axinlinux-01 ~]# ps aux |grep keepalived
[root@axinlinux-01 ~]# ip add
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:87:42:24 brd ff:ff:ff:ff:ff:ff
inet 192.168.208.128/24 brd 192.168.208.255 scope global ens33
valid_lft forever preferred_lft forever
inet 192.168.208.200/32 brd 192.168.208.200 scope global ens33:2 再看看有没有VIP
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe87:4224/64 scope link
valid_lft forever preferred_lft forever
[root@axinlinux-01 ~]# ipvsadm -C 清空以前设定的IP
[root@axinlinux-01 ~]# systemctl restart network
[root@axinlinux-01 ~]# ip add #可以看到没有那个VIP了
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:87:42:24 brd ff:ff:ff:ff:ff:ff
inet 192.168.208.128/24 brd 192.168.208.255 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe87:4224/64 scope link
valid_lft forever preferred_lft forever
[root@axinlinux-01 ~]# ipvsadm -ln #可以看到就没有规则了
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
两台rs要sh一下/usr/local/sbin/lvs_rs.sh的脚本
[root@axinlinux-01 ~]# systemctl start keepalived
[root@axinlinux-01 ~]# ps aux |grep keepalived
[root@axinlinux-01 ~]# ipvsadm -ln #要等一下才可以。因为设定了10的检测间隔
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.208.200:80 wlc
-> 192.168.208.130:80 Route 100 0 0
-> 192.168.208.134:80 Route 100 0 0
[root@axinlinux-04 ~]# systemctl stop nginx #我们把一台rs关掉(关掉核心nginx即可)
[root@axinlinux-04 ~]# ps aux |grep nginx
root 1475 0.0 0.0 112676 988 pts/0 S+ 23:40 0:00 grep --color=auto nginx
[root@axinlinux-01 ~]# ipvsadm -ln #然后回到分发器上看一下。结果04没有了,这说明keeplaved有自动把宕机的rs踢出的功能
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.208.200:80 wlc
-> 192.168.208.130:80 Route 100 0 0 #这只要看不到了,就说明把它踢掉了
[root@axinlinux-04 ~]# systemctl start nginx #在把它启动。还能把它加回来
[root@axinlinux-04 ~]# ps aux |grep nginx
[root@axinlinux-01 ~]# 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.208.200:80 wlc
-> 192.168.208.130:80 Route 100 0 0
-> 192.168.208.134:80 Route 100 0 0
还是无法测试负载均衡的效果。因为浏览器缓存等的关系。访问量越大越均衡
[root@axinlinux-01 ~]# 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.208.200:80 wlc
-> 192.168.208.130:80 Route 100 1 1
-> 192.168.208.134:80 Route 100 0 2
来源:oschina
链接:https://my.oschina.net/u/3866149/blog/2032973