Keepalived+LVS_DR双主架构

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Keepalived+LVS_DR双主架构相关的知识,希望对你有一定的参考价值。

一:环境介绍

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.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 {

        [email protected]

}

   notification_email_from [email protected]

   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 {

        [email protected]

}

   [email protected]

   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/all/arp_ignore

 echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore

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

 echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce

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漂移前:

技术分享

技术分享

ip漂移后:

技术分享

技术分享

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

 service stop keepalived

技术分享

技术分享

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

systemctl stop  nginx

技术分享

技术分享


由此我们发现即使一台高可用负载均衡器的主机宕机了,我们依然可以通过另外一个ip进行wab访问,体现了高可用的实用性,当后端的一台web服务器宕机,lvs调度器将客户端请求按设置的权重分别向后端的服务器实现调度,可以根据健康检测状况调度到健康的web服务器上。



以上是关于Keepalived+LVS_DR双主架构的主要内容,如果未能解决你的问题,请参考以下文章

keepalived实现mysql双主架构

mysql-双主+keepalived高可用架构

Nginx+Keepalived双主架构实现

keepalived+双主架构部署

keepalived双主模式实现nginx高可用及LNAMMP架构

高可用集群架构Keepalived双主热备