linux 学习笔记-064-linux 集群架构-DR 模式搭建 LVS,Keepalived+LVS DR

发布于 2018-04-11  490 次阅读


LVS DR 模式搭建

NAT 模式更能节省公网 IP 资源

DR 模式,每台 RS 都需要公网 IP,这时为了节省公网 IP 资源,可以使用端口映射的方法来实现(此处不详说)

这里开始做 DR 模式搭建 LVS 的实验

01:

准备三台机器,分别是分发器,RS1,RS2,并给予三个 IP(此处分配的 IP 你可以把它当作公网 IP 地址),准备一个 vip

三个 IP:172.17.1.240(分发器)、172.17.1.242(RS1)、172.17.1.243(RS2)

VIP:172.17.1.244

02:

编辑分发器上的脚本并执行,无报错则正确

[root@am-01:~#] vim /usr/local/sbin/lvs_dr.sh

#! /bin/bash

echo 1 > /proc/sys/net/ipv4/ip_forward

ipv=/usr/sbin/ipvsadm

vip=172.17.1.244

rs1=172.17.1.242

rs2=172.17.1.243

ifdown eno16777736

ifup eno16777736

#清空之前设置虚拟网卡的缓存

ifconfig eno16777736:2 $vip broadcast $vip netmask 255.255.255.255 up

#注意网卡名称,给一个网卡设置虚拟网卡,名字为 eno16777736:2

route add -host $vip dev eno16777736:2

#添加网关

$ipv -C

$ipv -A -t $vip:80 -s wrr

$ipv -a -t $vip:80 -r $rs1:80 -g -w 1

$ipv -a -t $vip:80 -r $rs2:80 -g -w 1

#-g 表示 DR 模式

[root@am-01:~#] sh /usr/local/sbin/lvs_dr.sh

Determining if ip address 172.17.1.241 is already in use for device eno16777736...

03:

两台 RS 也需要编辑脚本

[root@am-02:~#] vim /usr/local/sbin/lvs_dr.sh

#/bin/bash

vip=172.17.1.244

ifdown lo

ifup lo

ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up

route add -host $vip lo:0

#把 vip 绑定在 lo 上,是为了实现 rs 直接把结果返回给客户端

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

#以下操作为更改 arp 内核参数,目的是为了让 rs 顺利发送 mac 地址给客户端

#参考文档 http://www.cnblogs.com/lgfeng/archive/2012/10/16/2726308.html

[root@am-02:~#] sh /usr/local/sbin/lvs_dr.sh
[root@am-03:~#] vim /usr/local/sbin/lvs_dr.sh

#/bin/bash

vip=172.17.1.244

ifdown lo

ifup lo

ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up

route add -host $vip lo:0

#把 vip 绑定在 lo 上,是为了实现 rs 直接把结果返回给客户端

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

#以下操作为更改 arp 内核参数,目的是为了让 rs 顺利发送 mac 地址给客户端

[root@am-03:~#] sh /usr/local/sbin/lvs_dr.sh

04:

检查是否都设置完成,主要检查是否都有 VIP 的地址 172.17.1.244

[root@am-01:~#] ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 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

       valid_lft forever preferred_lft forever

    inet6 ::1/128 scope host

       valid_lft forever preferred_lft forever

2: eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000

    link/ether 00:0c:29:08:ac:45 brd ff:ff:ff:ff:ff:ff

    inet 172.17.1.240/24 brd 172.17.1.255 scope global eno16777736

       valid_lft forever preferred_lft forever

    inet 172.17.1.244/32 brd 172.17.1.244 scope global eno16777736:2

       valid_lft forever preferred_lft forever

    inet 172.17.1.241/24 brd 172.17.1.255 scope global secondary eno16777736:0

       valid_lft forever preferred_lft forever

    inet6 fe80::20c:29ff:fe08:ac45/64 scope link

       valid_lft forever preferred_lft forever

3: ens36: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000

    link/ether 00:0c:29:08:ac:4f brd ff:ff:ff:ff:ff:ff

    inet 172.18.0.236/23 brd 172.18.1.255 scope global ens36

       valid_lft forever preferred_lft forever

    inet6 fe80::20c:29ff:fe08:ac4f/64 scope link

       valid_lft forever preferred_lft forever
[root@am-02:~#] route -n

Kernel IP routing table

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface

0.0.0.0         172.17.1.1      0.0.0.0         UG    100    0        0 eno16777736

172.17.1.0      0.0.0.0         255.255.255.0   U     100    0        0 eno16777736

172.17.1.244    0.0.0.0         255.255.255.255 UH    0      0        0 lo

[root@am-02:~#] ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 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

       valid_lft forever preferred_lft forever

    inet 172.17.1.244/32 brd 172.17.1.244 scope global lo:0

       valid_lft forever preferred_lft forever

    inet6 ::1/128 scope host

       valid_lft forever preferred_lft forever

2: eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000

    link/ether 00:0c:29:5f:c1:ea brd ff:ff:ff:ff:ff:ff

    inet 172.17.1.242/24 brd 172.17.1.255 scope global eno16777736

       valid_lft forever preferred_lft forever

    inet6 fe80::20c:29ff:fe5f:c1ea/64 scope link

       valid_lft forever preferred_lft forever
[root@am-03:~#] route -n

Kernel IP routing table

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface

0.0.0.0         172.17.1.1      0.0.0.0         UG    100    0        0 ens33

172.17.1.0      0.0.0.0         255.255.255.0   U     100    0        0 ens33

172.17.1.244    0.0.0.0         255.255.255.255 UH    0      0        0 lo

[root@am-03:~#] ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 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

       valid_lft forever preferred_lft forever

    inet 172.17.1.244/32 brd 172.17.1.244 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:70:38:3c brd ff:ff:ff:ff:ff:ff

    inet 172.17.1.243/24 brd 172.17.1.255 scope global ens33

       valid_lft forever preferred_lft forever

    inet6 fe80::20c:29ff:fe70:383c/64 scope link

       valid_lft forever preferred_lft forever

05:

实验,在你做实验的时候,你可能遇到测试不出来什么效果,但不用担心,这只是缓存问题,当并发量大的时候,效果就明显了

linux 学习笔记-064-linux 集群架构-DR 模式搭建 LVS,Keepalived+LVS DR

linux 学习笔记-064-linux 集群架构-DR 模式搭建 LVS,Keepalived+LVS DR

keepalived+lvs DR

把 keepalived 加入到 lvs 中的好处

01:当 lvs 的分发器挂了的时候,这个 lvs 架构就出问题了,但这时如果使用了 keepalived 做分发器的高可用,就能解决这个问题

02:lvs 并不智能,即使后端的 RS 挂了,还是会把请求分发过去,这时返回给用户的就是页面错误了,但使用了 keepalived 做分发器的高可用,keepalived 会自动识别后端 RS 是否正常,从而避免继续向其发送请求,那么就能解决这个问题

做实验

01:

keepalived 内置了 ipvsadm 的功能,所以不需要再安装 ipvsadm 包,也不用编写和执行那个 lvs_dir 的脚本

此处实验共四个 IP 地址

分发器(keepalived):172.17.1.240

RS1:172.17.1.242

RS2:172.17.1.243

VIP:172.17.1.244

02:

编辑 keepalived 配置文件并把 keepalived 启动起来

模版获取地址:https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D21Z/lvs_keepalived.conf?public=true

[root@am-01:~#] echo "" >/etc/keepalived/keepalived.conf

[root@am-01:~#] vim /etc/keepalived/keepalived.conf

vrrp_instance VI_1 {

    state MASTER

    #备用服务器上为 BACKUP

    interface eno16777736

    #绑定 vip 的网卡为 eno16777736,你的网卡可能不一样,这里需要你改一下

    virtual_router_id 51

    priority 100

    #备用服务器上为 90

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 123456

    }  

    virtual_ipaddress {

        172.17.1.244

    }  

}  

virtual_server 172.17.1.244 80 {

    delay_loop 10

    #(每隔 10 秒查询 realserver 状态)

    lb_algo wlc

    #(lvs 算法)

    lb_kind DR

    #(DR 模式)

    persistence_timeout 0

    #(同一 IP 的连接多少秒内被分配到同一台 realserver)

    protocol TCP

    #(用 TCP 协议检查 realserver 状态)

    real_server 172.17.1.242 80 {

        weight 100

        #(权重)

        TCP_CHECK {

        connect_timeout 10

        #(10 秒无响应超时)

        nb_get_retry 3

        delay_before_retry 3

        connect_port 80

        }

    }  

    real_server 172.17.1.243 80 {

        weight 100

        TCP_CHECK {

        connect_timeout 10

        nb_get_retry 3

        delay_before_retry 3

        connect_port 80

        }

     }

}

[root@am-01:~#] systemctl restart keepalived.service

[root@am-01:~#] ps -aux | grep keep

root       2686  0.0  0.1 120708  1400 ?        Ss   06:24   0:00 /usr/sbin/keepalived -D

root       2687  0.0  0.3 122904  3136 ?        S    06:24   0:00 /usr/sbin/keepalived -D

root       2688  0.0  0.2 122848  2516 ?        S    06:24   0:00 /usr/sbin/keepalived -D

root       2699  0.0  0.0 112676   980 pts/0    S+   06:24   0:00 grep --color=auto keep

03:

第一次测试

[root@am-01:~#] systemctl stop keepalived.service

[root@am-01:~#] ipvsadm -ln

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

#keepalived 关闭后,可以见到 ipvsadm 规则没了
[root@am-01:~#] systemctl start keepalived.service

[root@am-01:~#] ipvsadm -ln

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

TCP  172.17.1.244:80 wlc

  -> 172.17.1.242:80              Route   100    0          0        

  -> 172.17.1.243:80              Route   100    0          0

#keepalived 启动后,可以见到 ipvsadm 规则出现了

第二次测试

[root@am-03:~#] service nginx stop

Redirecting to /bin/systemctl stop nginx.service

#把 RS2 的 nginx 停止运行,模拟 down 机状态
[root@am-01:~#] ipvsadm -ln

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

TCP  172.17.1.244:80 wlc

  -> 172.17.1.242:80              Route   100    0          0     

#可以见到,RS2 的规则没了,这正如之前所说的,keepalived 能智能识别后端 nginx 是否 down 机

注意事项(我这没执行是因为之前的实验执行过了):

01:keepalived+lvs DR 架构,分发器上需要执行"echo 1 > /proc/sys/net/ipv4/ip_forward"

02:keepalived+lvs DR 架构,RS1 和 RS2 均都需要 lvs DR 的脚本 lvs_rs.sh

扩展

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