63.LVS DR搭建 keepalived+LVS DR

ⅰ亾dé卋堺 提交于 2019-12-10 07:11:51

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

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!