系统版本及各软件版本预备

IP 角色

服务器配置

# cat /etc/centos-release
CentOS Linux release 7.9.2009 (Core)
 

说明
192.168.11.98/23 nginx worker 1
#rpm -qi nginx
Name        : nginx
Epoch       : 1
Version     : 1.16.1
 

nginx工作机

realserver

192.168.11.99/23 nginx worker2 #rpm -qi nginx
Name        : nginx
Epoch       : 1
Version     : 1.16.1
 

nginx工作机、

realserver

192.168.11.100/23 nginx worker3
# rpm -qi nginx
Name        : nginx
Epoch       : 1
Version     : 1.16.1
 

nginx工作机

realserver

192.168.11.101/23 LVS Master + keepalived Name        : keepalived
Version     : 1.3.5
Release     : 19.el7
Architecture: x86_64

调度器主服务器

virtualserver

192.168.10.173/23 LVS BACKUP + keepalived Name        : keepalived
Version     : 1.3.5
Release     : 19.el7
Architecture: x86_64

调度器热备

virtualserver

其他预备工作:

每台集群机器上安装 net-tools.

安装epel-release库

yum install  epel-release net-tools

工作机和调度器安装

1)在三个nginx服务器上分别安装nginx

yum instlal nginx -y

2)在二台调度器上安装keepalived

yum install keepalived

lvs模块是系统默认自带的,通过下述命令 查询,可以看到ip_vs模块

[root@master2 ~]# lsmod  |grep vs
ip_vs_rr               12600  1
ip_vs                 145458  3 ip_vs_rr
nf_conntrack          139264  1 ip_vs
libcrc32c              12644  3 xfs,ip_vs,nf_conntrack

 各角色的配置

调度器上的配置,这里注意的是我们使用DR模式作为lvs的转发模式,这样最大程度的降低调度器的网络消耗。DR模式的解析在文章最后,请仔细阅读。

调度机器上配置如下文件,根据文件里的说明修改并在二台调度器上都需要。

cat <<EOF >/etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
    router_id  LVS_DEVEL
   vrrp_skip_check_adv_addr
!这个要注释,允许VIP对外提供服务
#   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
! 注意,主服务器上设置为MASTER,备份服务器上,为BACKUP,都要大写
    state BACKUP 
! 这个网卡界面名称,要填写你自己的物理网卡的名称
    interface eth0
!同一个主备,这个数值要一模一样
    virtual_router_id 54
! 特别注意,主服务器(MASTER)的优先级必须大于备服务器(BACKUP)上的优先级
    priority 90
!vrrp的通信间隔
    advert_int 1
!验证都不要修改
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
!提供对外服务的虚拟IP,VIP,由网络管理员给你提供,至少保证这个地址没人使用
        192.168.11.161
    }
}

virtual_server 192.168.11.161 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    protocol TCP
persistence_timeout 0
    real_server 192.168.11.98 80 {
    weight 1
    TCP_CHECK {
       connect_timeout 10
       retry 3
       delay_before_retry 3
       connect_port 80
       }
    }
     real_server 192.168.11.99 80 {
     weight 1
     TCP_CHECK {
       connect_timeout 10
       retry 3
       delay_before_retry 3
       connect_port 80
       }
     }
     real_server 192.168.11.100 80 {
     weight 1
     TCP_CHECK {
       connect_timeout 10
       retry 3
       delay_before_retry 3
       connect_port 80
       }
      }
     }

在工作机器上修改nginx的首页,为了查看轮询的效果,三台机器上都需要执行。

ip a |grep -o -E '([0-9]+\.)+[0-9]+/[0-9]+' |grep -v 127.0.0.1 >/usr/share/nginx/html/index.html

三台woker机器上启动nginx

systemctl start nginx
systemctl enable nginx

在其他的linux机器上进行测试,nginx正常工作。

[root@pcserver ~]# curl http://192.168.11.100
192.168.11.100/23
[root@pcserver ~]# curl http://192.168.11.99
192.168.11.99/23
[root@pcserver ~]# curl http://192.168.11.98
192.168.11.98/23

 根据DR模式的原来,需要在realserver,工作机上,安装如下脚本,禁止realserver响应关于VIP的请求。

[root@localhost ~]# cat <<EOF >~/bom/arpctl.sh
VIP=192.168.11.161
. /etc/init.d/functions
case "$1" in
start)
/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
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
echo "LVS RealServer Start OK"
;;
stop)
/sbin/ifconfig lo:0 down
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
echo "LVS RealServer Stoped OK"
;;
*)
echo "Usage: $0 (start|stop)"
exit 1
esac
EOF

三台nginx(realserver) 启动脚本,为调度器调度过来的数据做好准备。

~/bin/arpctl.sh start

在三台realserver ,查看lo:0的地址是否绑定了VIP,结果是3台都已经绑定了VIP

[root@localhost ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    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.11.161/32 brd 192.168.11.161 scope global lo:0
       valid_lft forever preferred_lft forever
    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 group default qlen 1000
    link/ether 52:54:00:15:64:21 brd ff:ff:ff:ff:ff:ff
    inet 192.168.11.98/23 brd 192.168.11.255 scope global noprefixroute dynamic eth0
       valid_lft 69556sec preferred_lft 69556sec
    inet6 fe80::a765:59fe:8a92:3b37/64 scope link tentative noprefixroute dadfailed
       valid_lft forever preferred_lft forever
    inet6 fe80::df5a:35c0:aa9b:7863/64 scope link noprefixroute
       valid_lft forever preferred_lft forever

 在二台调度器上启用keepalived

systemctl start keepalived && systemctl enable keepalived

在主调度器上,通过如下命令看VIP是否有显示

[root@localhost ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    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: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 52:54:00:15:64:24 brd ff:ff:ff:ff:ff:ff
    inet 192.168.11.101/23 brd 192.168.11.255 scope global noprefixroute dynamic eth0
       valid_lft 73920sec preferred_lft 73920sec
    inet 192.168.11.161/32 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::a765:59fe:8a92:3b37/64 scope link noprefixroute
       valid_lft forever preferred_lft forever

停掉主调度器上的keepalived,到备机(192.168.10.173)去检查,发现VIP已经漂移。

如果没有漂移

1)检查主上的优先级是否大于备上的优先级

2)virutal_router_id 是不是相同,如果不同,改成相同

3) VIP是否已经被网络上的其他机器使用。重启主调度器上的keepalived, 运行如下程序看DR 下rr调度的结果。

[root@pcserver ~]# for i in 1 2 3 4 5 6 ; do curl 192.168.11.161; done
192.168.11.99/23
192.168.11.98/23
192.168.11.100/23
192.168.11.99/23
192.168.11.98/23
192.168.11.100/23

 轮询正确。高可用及负载均衡实现。

DR模式(直接路由模式:Virtual Server via Direct Routing) 

  DR模式是通过改写请求报文的目标MAC地址,将请求发给真实服务器的,而真实服务器响应后的处理结果直接返回给客户端用户。同TUN模式一样,

DR模式可以极大的提高集群系统的伸缩性。而且DR模式没有IP隧道的开销,对集群中的真实服务器也没有必要必须支持IP隧道协议的要求。但是要求

度器LB与真实服务器RS都有一块网卡连接到同一物理网段上,必须在同一个局域网环境。DR模式是互联网使用比较多的一种模式。

  DR模式原理图:

  

  LVS-DR数据流向图

  

 DR模式原理过程简述:

    如下图:当客户端请求VIP时,会将请求先发给Director(调度器),调度器发现请求的是一组集群服务,根据调度算法将这一请求转发给RealServer,

注意在转发的过程中,仅仅是修改了数据报文中的MAC地址,所以这也是为什么我们要求DR和RS必须在同一个物理网络内,就是为了保证可以通过修改MAC

地址而进行数据报文的转发。当RealServer处理请求,响应数据,发送响应数据给客户端,按理说此时的数据包的源IP为RIP,目标IP为CIP,虽然能找到客户端,

但是客户端是不收该数据包的,因为并没有请求该RIP ,现在的做法就是进行IP欺骗,即就是修改源 IP 为 VIP,但是不可以将VIP设置在出口网卡上,否则会响

应客户端的arp request,造成client/gateway arp table紊乱,以至于整个load balance都不能正常工作。要在lo接口上配置VIP,并将此 VIP 屏蔽,但是出去时候

的数据包被路由转换,转换后的 IP不再是 VIP,所以要重新设置路由。

  另外关于各服务器网络的配置,首先每个服务有一个独立网卡即可。在DR上将DIP配置eth0上,将VIP配置在网络别名上,这样是为了以后调度器做高可用

方便VIP做IP地址飘移。在各RS上同样需要配置好VIP,这样个RS就可以直接响应Client,而不需要再经过DR,但是一个物理网络之内是不允许有多个同名IP的,

所以需要修改RS的内核参数,并且将VIP配置在LO上,让其保留VIP但是不允许对外进行广播,这样从RS出去的报文源地址就是VIP,当然这需要从真实的物理

网卡出去,所以必须加一条路由,让访问VIP的数据包请求,对其响应的是配置了VIP的网卡,这样响应出去的报文源地址就是VIP,可以被Client接受。

2.下面对LVS-DR的配置参数 


在如上图的VS/DR应用模型中(所有机器都在同一个物理网络),所有机器(包括Director和RealServer)都使用了一个额外的IP地址,即VIP。

  当一个客户端向VIP发出一个连接请求时,此请求必须要连接至Director的VIP,而不能是RealServer的,因为LVS的主要目标就是要Director负责

调度这些连接请求至RealServer的。因此,在Client发出至VIP的连接请求后,只能由Director将其MAC地址响应给客户端(也可能是直接与Director连

接的路由设备),而Director则会相应的更新其ipvsadm table以追踪此连接,而后将其转发至后端的RealServer之一。



点赞(1)