一:环境介绍

1.操作系统:

centos6.9和7.3,censtos6用作keepalived调度,centos7用作realserver

2.服务安装:

keepalived-1.2.13-5.el6_6.x86_64

nginx-1.10.2-1.el7.x86_64

mariadb-5.5.52-1.el7.x86_64

php-fpm-5.4.16-42.el7.x86_64

以上都是yum仓库安装

3.实验环境

关闭selinux,关闭iptables,时间同步

二:原理及拓扑图

1.lvs概念

lVSLinux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。主要是工作在内核中,通过其他工具配置调用,只认识IP地址和端口。例如ipvsadm,但是在本案例中,keepalived完全可以代理ipvsadm调用lvs

1.VRRPVirtual Router Redundancy Protocol虚拟路由冗余协议)

可以认为是实现路由器高可用的协议,简单的说,当一个路由器故障时可以由另一个备份路由器继续提供相同的务。

VRRP根据优先级来确定虚拟路由器中每台路由器的角色(Master路由器或Backup路由器) VRRP优先级的取值范围为0255(数值越大表明优先级越高),可配置的范围是1254,优先级0为系统保留给路由器放弃Master位置时使用,255则是系统保留给IP地址拥有者使用。优先级越高,则越有可能成为Master路由器。当两台优先级相同的路由器同时竞争Master时,比较接口IP地址大小,接口地址大者当选为Master

2.keepalived简介

Keepalived 是一个基于VRRP协议来实现的LVS服务高可用方案,可以利用其来避免单点故障。一个LVS服务会有2台服务器运行Keepalived,一台为主服务器(MASTER),一台为备份服务器(BACKUP),但是对外表现为一个虚拟IP,主服务器会发送特定的消息给备份服务器,当备份服务器收不到这个消息的时候,即主服务器宕机的时候,备份服务器就会接管虚拟IP,继续提供服务,从而保证了高可用性。KeepalivedVRRP的完美实现。

3.lvs_dr

直接路由,LVS默认模式,应用最广泛,通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目标IP/PORT均保持不变。

工作原理:DR和REAL SERVER都使用同一个IP对外服务。但只有DR对ARP请求进行响应,所有REAL SERVER对本身这个IP的ARP请求保持静默。也就是说,网关会把对这个服务IP的请求全部定向给DR,而DR收到数据包后根据调度算法,找出对应的 REAL SERVER,把目的MAC地址改为REAL SERVER的MAC并发给这台REAL SERVER。这时REAL SERVER收到这个数据包,则等于直接从客户端收到这个数据包无异,处理后直接返回给客户端。由于DR要对二层包头进行改换,所以DR和REALSERVER之间必须在一个广播域,也可以简单的理解为在同一台交换机上。

需要注意的是:

第一:确保client能够直接访问web服务器。因为在LVS-DR模式下web服务器回复client的时候,是直接回复给client的,不需要经过LVS,所以web服务器必须能够和client的网络互通。

第二,lvs服务器和web-server他们必须在同一个网段内,因为LVS转发包的时候,是直接修改了包目标的MAC地址,直接扔给了rs,基于MAC地址的修改是活动在OSI二层数据链路层的,工作在数据链路层的网络设备就是交换机了,所以必须在一个交换机下面,也就是一个局域网内。

第三为啥抑制real-server的ARP,是这样的,我们在DR模式要更改web-server的ARP的模式,arp_ignore为1是说只回答目标IP地址是来访网络接口本地地址的ARP查询请求,我们都在回环接口上配置了一个VIP,当arp模式更改以后,那么如果有谁在请求VIP的mac地址时,那么那些web-server就会回答arp广播报文了,只有lvs才会,如果没有更改arp模式,那么大家都喊我是VIP,这就乱套了。

4.拓扑图


三:keepalived配置

1.安装keepalived

yum install keepalived -y

2.高可用的ipvs双主集群配置

1.节点一的配置:

global_defs {

   notification_email {

        root@localhost

}

   notification_email_from root@magedu.com

   smtp_server 172.0.0.1

   smtp_connect_timeout 30

   router_id LVS_KEEPALIVED

}

vrrp_instance VI_1 {

    state MASTER

    interface eth1

    virtual_router_id 10

    priority 100

    advert_int 1

#nopreempt

   authentication {

     auth_type PASS

     auth_pass magedu

    }

    virtual_ipaddress {

        172.17.250.200

}

}

virtual_server 172.17.250.200 80 {

    delay_loop 6

    lb_algo wrr

    lb_kind DR

    nat_mask 255.255.255.255

    persistence_timeout 50

    protocol TCP

    real_server 172.17.252.78  80 {

        weight 1

            connect_timeout 3

            nb_get_retry 3

            delay_before_retry 3

        }

    real_server 172.17.110.110  80 {

        weight 1

            connect_timeout 3

            nb_get_retry 3

            delay_before_retry 3

        }

}

vrrp_instance VI_2 {

    state BACKUP

    interface eth1

    virtual_router_id 20

    priority 98

    advert_int 1

   #nopreempt

    authentication {

        auth_type PASS

        auth_pass magedu

    }

    virtual_ipaddress {

        172.17.250.250

}

}

virtual_server 172.17.250.250 443 {

    delay_loop 6

    lb_algo wrr

    lb_kind DR

    nat_mask 255.255.255.255

    persistence_timeout 50

    protocol TCP

    real_server 172.17.252.78  443 {

        weight 1

            connect_timeout 3

            nb_get_retry 3

            delay_before_retry 3

        }

    real_server 172.17.110.110 443 {

        weight 1

            connect_timeout 3

            nb_get_retry 3

            delay_before_retry 3

        }

}

第二步:节点二的配置

global_defs {

   notification_email {

        root@localhost

}

   notification_email_fromroot@magedu.com

   smtp_server 172.0.0.1

   smtp_connect_timeout 30

   router_id LVS_KEEPALIVED

}

 

vrrp_instance VI_1 {

    state BACKUP

    interface eth0

    virtual_router_id 10

    priority 98

    advert_int 1

 # nopreempt

    authentication {

        auth_type PASS

        auth_pass magedu

    }

    virtual_ipaddress {

        172.17.250.200

}

}

virtual_server 172.17.250.200 80 {

    delay_loop 6

    lb_algo wrr

    lb_kind DR

    nat_mask 255.255.255.255

    persistence_timeout 50

    protocol TCP

    real_server172.17.252.78  80 {

        weight 1

            connect_timeout3

            nb_get_retry 3

            delay_before_retry 3

        }

    real_server172.17.110.110  80 {

        weight 1

            connect_timeout3

            nb_get_retry 3

           delay_before_retry 3

        }

}

vrrp_instance VI_2 {

    state MASTER

    interface eth0

    virtual_router_id 20

    priority 100

    advert_int 1

 #   nopreempt

    authentication {

        auth_type PASS

    auth_pass magedu

    }

    virtual_ipaddress {

        172.17.250.250

}

}

virtual_server 172.17.250.250 443 {

    delay_loop 6

    lb_algo wrr

    lb_kind DR

    nat_mask 255.255.255.255

    persistence_timeout 50

    protocol TCP

    real_server172.17.252.78  443 {

        weight 1

            connect_timeout3

            nb_get_retry 3

           delay_before_retry 3

        }

    real_server 172.17.110.110  443 {

        weight 1

            connect_timeout3

            nb_get_retry 3

           delay_before_retry 3

        }

}

四:realserver配置

我的realserv服务器实现的小米电子网站,所以就不过多介绍了,用的是lnmp的架构,80端口和443端口分别代表不同的虚拟ip访问的不同站点,互为主备。

1.nginx加密的步骤如下

mkdir /usr/local/nginx/conf -p  --建立一个存放加密文件的目录

cd /usr/local/nginx/conf/

openssl genrsa -des3 -out server.key 1024  --创建服务器私钥会让你输入一个口令

openssl req -new -key server.key -out server.csr  --创建签名请求的证书csr

 cp server.keyserver.key.org

openssl rsa -in server.key.org -out server.key  --加载ssl支持nginx的时候使用私钥除去必须的口令

openssl x509 -req -days 365 -in server.csr -signkey server.key-out server.crt  --标志证书使用上述私钥和csr

2.主要修改配置文件如下:

让站点兼容80端口和443端口

    server {

        listen       80;

        listen     443 ssl;

        server_name  xiaomi.magedu.com;

        root /data/web;

        #charset koi8-r;

        ssl_certificate      /usr/local/nginx/conf/server.crt;

       ssl_certificate_key /usr/local/nginx/conf/server.key;

}

3.修改内核参数:

dr模型中,各主机上均需要配置VIP,解决地址冲突的方式有三种:

(1) 在前端网关做静态绑定;

(2) 在各RS使用arptables;

(3) 在各RS修改内核参数,来限制arp响应和通告的级别;

限制响应级别:arp_ignore

 0:默认值,表示可使用本地任意接口上配置的任意地址进行响应;

 1: 仅在请求的目标IP配置在本地主机的接收到请求报文接口上时,才给予响应;

限制通告级别:arp_announce

 0:默认值,把本机上的所有接口的所有信息向每个接口上的网络进行通告;

 1:尽量避免向非直接连接网络进行通告;

 2:必须避免向非本网络通告。

#配置本地回环网卡路由

echo "1">/proc/sys/net/ipv4/conf/lo/arp_ignore

#1  只回答目标IP地址是来访网络接口本地地址的ARP查询请求

echo "2">/proc/sys/net/ipv4/conf/lo/arp_announce

#2 对查询目标使用最适当的本地地址.在此模式下将忽略这个IP数据包的源地址并尝试选择与能与该地址通信的本地地址.

echo "1">/proc/sys/net/ipv4/conf/all/arp_ignore

echo "2">/proc/sys/net/ipv4/conf/all/arp_announce

#关闭arp应答

1: 仅在请求的目标IP配置在本地主机的接收到请求报文的接口上时,才给予响应

2:必须避免将接口信息向非本网络进行通告

4.配置回环网卡和路由:

ifconfig lo:0 172.17.250.200 broadcast 172.17.250.200 netmask255.255.255.255 up

route add -host 172.17.250.200 lo:0

ifconfig lo:1 172.17.250.250 broadcast 172.17.250.250 netmask255.255.255.255 up

route add -host 172.17.250.250 lo:1

五:测试

1.启动服务

ip漂移前:

74ead1b0e73826a3f9737f8e9bbbd2ed.png

c4e370fb2626f7180868adb599fde91d.png

ip漂移后:

36461d47333a5a196e368ffb0ec22c33.png

2e35d7ca27f8f9b7ea9d038751ee395d.png

2.模拟一台keepalived服务器宕机

 service stop keepalived

e927de362baf03a2403723c4a30a36c6.png

829b111d83152feb2527d280728cc7c8.png

3.模拟一台web服务宕机:

systemctl stop  nginx

0bac8405742123f72f12ff2f84458bda.png

d5c73d79c843b8f1caa4ede792074008.png


4.实验总结

由此我们发现即使一台高可用负载均衡器的主机宕机了,我们依然可以通过另外一个虚拟ip进行wab访问,体现了高可用的实用性,Keepalived检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web 服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。lvs只是能够负载均衡,为后端的web服务器分流,降低web负载,加上keepalived就能够实现高可用负载均衡,而且主主模式也能够避免主备模式一台调度器完全被压榨的状态,可以为客户端提供更高效的服务。