LVS+keepalived-DR模式

柔情痞子 提交于 2020-03-05 06:40:55

 下面一张图 其实就是企业的集群架构图  结合前面的技术加上今天的lvs+keepalived负载均衡nginxde技术就可以搭建出来  前面的实验累积一起就是这张图 只不过她的web服务器比我们实验的机器要多 其实理论是一样的 那么结合以前的实验 今天咱们可以做一个完整的网络图

 

集群图大概上这样的 ,但是条件有限我这里就开3台机器 其实还要加一台lvs从,防止主挂机可以切到从上面,vs从就不做了,后面会给大家一些配置文件,其实从和主一样,就是keepalived的优先级不一样,下面有lvs从的配置文件 安装和主一样.

实验环境:(环境大家可以参照其它笔记搭建)

192.168.1.120   lvs+keepalived负载nginx服务器(主)

192.168.1.116   nginx负载均衡服务器

192.168.1.118   nginx负载均衡服务器

192.168.1.117   lap+tomcat1+tomcat2 WEB服务器(一般每台web服务器只配一个网站 tomcat可以配置多个)

192.168.1.18    mysql主也是keepalived

(这里我们用5台就可以演示出来 当然你的机器好的话 也可以把咱们前面两台数据库和两台web服务器都可以开起来 也可以在配置一台lvs从,这样效果更明显)

 今天的内容是lvs+keepalived 来负载前端nginx服务器  做到这里那么我们上一张的nginx+keepalived 就可以不用了 如果说你们公司就两台nginx服务器 那么nginx+keepalived就可以的,但是 一旦nginx服务器多的话 keepalived没有使用的价值了,今天的lvs+keepalived就是来解决前端多台nginx负载均衡的问题。。。。。。。。。。。。

 

LVS 简单工作原理:用户请求LVS VIP,LVS根据转发方式和算法,将请求转发给后端服务器,后端服务器接受到请求,返回给用户。对于用户来说,看不到WEB后端具体的应用。

LVS转发方式有三种,分别是NAT、DR、TUN模式,常用算法:RR、LC、WRR、WLC模式等(RR为轮询模式,LC为最少连接模式)

 

假如下面就是1.116和1.118的nginx负载均衡的网站 两个网站是一样的要怎么不用访问这两台nginx的ip  lvs可以解决负载nginx( 前端两台nginx  后端两台web服务器+两台数据库)这里条件有限就在两台nginx上配置两个一样的网站。 

步骤1.

  • LVS环境安装配置192.168.1.120

下载LVS所需软件ipvsadm-1.2.4.tar.gz软件,编译安装:

wget -c  

http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24.tar.gz 

ln -s /usr/src/kernels/2.6.*  /usr/src/linux  //IPVS模块编译进内核里,需要做软连接

(这里写的是自己机器的内内核 这里记住如果内核Tab不出来, 那么我们就安装内核扩展包 yum –y install kernel kernel-devel)

yum -y install gcc* openssl openssl-devel

tar xzvf ipvsadm-1.24.tar.gz &&cd ipvsadm-1.24 && make && make install

 

(下面的黄色标记的公司一般不会用这种方式来做 下面的keepalived的配置可以来完成)

LVS安装完毕之后,需要进行配置,配置的步骤有两步,第一步为定义端口服务,第二步为添加realserver后端服务。

ipvsadm -A -t 192.168.1.199:80 -s rr

ipvsadm -a -t 192.168.1.199:80 -r 192.168.1.116 -g -w 2

ipvsadm -a -t 192.168.1.199:80 -r 192.168.1.118 -g -w 2

可以用脚本自动部署:server_lvs.sh

#!/bin/bash

SNS_VIP=192.168.1.199

SNS_RIP1=192.168.1.116

SNS_RIP2=192.168.1.118

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

. /etc/rc.d/init.d/functions

function IPVSADM(){

/sbin/ipvsadm --set 30 5 60

/sbin/ifconfig eth0:0 $VIP broadcast $VIP netmask 255.255.255.255 up

/sbin/route add -host $SNS_VIP dev eth0:0

/sbin/ipvsadm -A -t $SNS_VIP:80 -s wlc -p 120

/sbin/ipvsadm -a -t $SNS_VIP:80 -r $SNS_RIP1:80 -g -w 1

/sbin/ipvsadm -a -t $SNS_VIP:80 -r $SNS_RIP2:80 -g -w 1

/etc/init.d/ipvsadm save

}

case "$1" in

start)

IPVSADM

echo "-----------------------------------------------------"

/sbin/ipvsadm -Ln

touch /var/lock/subsys/ipvsadm > /dev/null 2>&1

;;

stop)

/sbin/ipvsadm -C

/sbin/ipvsadm -Z

ifconfig eth0:0 down >>/dev/null 2>&1

route del $SNS_VIP >>/dev/null 2>&1

rm -rf /var/lock/subsys/ipvsadm > /dev/null 2>&1

echo "ipvsadm stopped!"

;;

status)

if [ ! -e /var/lock/subsys/ipvsadm ]

then

echo "ipvsadm stopped!"

exit 1

else

echo "ipvsadm started!"

fi

;;

*)

echo "Usage: $0 {start | stop | status}"

exit 1

esac

exit 0

参数说明:

-A 增加一台虚拟服务器地址。

-t  虚拟服务器提供的是tcp服务。

-s  使用的调度算法

-a  在虚拟服务器中增加一台后端真实服务器。

-r  指定真实服务器地址。

-m 设置当前转发方式为NAT模式;-g为直接路由模式;-i  模式为隧道模式

-w 后端真实服务器的权重。

ipvsadm -D -t 192.168.1.199:80

ipvsadm -d -t 10.143.130.106:80 -r 10.143.130.107:80

查看LVS转发列表命令为:ipvsadm –Ln

 我们会发现,如果这台LVS发生突发情况,down机了,那后端所有的应用程序都访问不了。如何避免这种问题呢,这里需要用到故障切换,也就是如果有一台备用的LVS就好了,主down了,自动切换到从,怎么实现这个需求,接下来讲解的keepalived软件就是专门用来做故障检测及切换的。

需要注意一点,如果使用了keepalived.conf配置,就不需要再执行ipvs –A命令去添加均衡的realserver命令了,所有的配置都会在keepalived.conf里面,一个配置文件搞定所有,即只需要安装ipvs模块。

步骤2.

  • Keepalived安装配置

官方下载keepalived相应稳定版本:

cd /usr/src ;wget -c  http://www.keepalived.org/software/keepalived-1.1.15.tar.gz 

tar -xzvf keepalived-1.1.15.tar.gz &&cd keepalived-1.1.15 && ./configure && make && make install

(这里的keepalived安装不需要编译内核了 和前面mysql+keepalived安装方法不一样了 因为我们安装lvs的时候已经定义了)

 

这里编译出错 就安装yum install popt-devel)

安装完毕,配置keepalived服务为系统服务。

DIR=/usr/local/

cp $DIR/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/ && cp $DIR/etc/sysconfig/keepalived /etc/sysconfig/ && mkdir -p /etc/keepalived && cp $DIR/sbin/keepalived /usr/sbin/

 

MASTER上/etc/keepalived/目录创建keepalived.conf配置文件,并写入如下内容:

! Configuration File for keepalived

global_defs {

   notification_email {

      wgkgood@163.com

   }

   notification_email_from wgkgood@163.com

   smtp_server 127.0.0.1

   smtp_connect_timeout 30

   router_id LVS_DEVEL

}

# VIP1

vrrp_instance VI_1 {

    state BACKUP

    interface eth0

    lvs_sync_daemon_inteface eth0

    virtual_router_id 51

    priority 100

    advert_int 5

    nopreempt

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.1.199   

    }

}

virtual_server 192.168.1.199 80 {

    delay_loop 6    

    lb_algo wrr    

    lb_kind DR   

#    persistence_timeout 60    

    protocol TCP         

    real_server 192.168.1.116 80 {

        weight 100        

        TCP_CHECK {

        connect_timeout 10

        nb_get_retry 3

        delay_before_retry 3

        connect_port 80

        }

    }

    real_server 192.168.1.118 80 {

        weight 100

        TCP_CHECK {

        connect_timeout 10

        nb_get_retry 3

        delay_before_retry 3

        connect_port 80      

        }

    }

}

以上就是keepalived的配置文件 记住上面的vip的ip要保证没有被使用 这里是两台nginx服务器 如果还有多个nginx服务器就在配置文件里面添加real_server 对应的配置段

下面可以看到我们的lvs+keepalived配置成功

 

 

Lvs从上安装lvs和主安装是一样的  keepalived上配置如下就行了  我这里就不演示了:

如上配置文件,红色标记的地方需要注意,state状态主服务器设置MASTER,从设置为BACKUP,优先级备机设置比MASTER小,例如设置90,使用TCP端口检测。

LVS BACKUP服务器写入如下配置,需要注意的是客户端的配置要修改优先级及状态:

! Configuration Filefor keepalived

global_defs {

  notification_email {

   wgkgood@163.com

  }

  notification_email_from wgkgood@163.com

  smtp_server 127.0.0.1

  smtp_connect_timeout 30

  router_id LVS_DEVEL

}

# VIP1

vrrp_instance VI_1 {

  state BACKUP

  interface eth0

  lvs_sync_daemon_inteface eth0

  virtual_router_id 51

  priority 90

  advert_int 5

  authentication {

    auth_type PASS

    auth_pass 1111

  }

  virtual_ipaddress {

    192.168.1.199

  }

}

virtual_server 192.168.1.199 80 {

  delay_loop 6

  lb_algo wrr

  lb_kind DR

# persistence_timeout 60

  protocol TCP

  real_server 192.168.1.116 80 {

    weight 100

    TCP_CHECK {

    connect_timeout 10

    nb_get_retry 3

    delay_before_retry 3

    connect_port 80

    }

}

  real_server 192.168.1.118 80 {

    weight 100

    TCP_CHECK {

    connect_timeout 10

    nb_get_retry 3

    delay_before_retry 3

    connect_port 80

    }

  }

}

如上设置,LVS 主备配置完毕,接下来需要在realserver配置LVS VIP,为什么要在realserver绑定VIP呢?

客户端访问director的VIP,director接收请求,将通过相应的算法将请求转发给相应的realserver。在转发的过程中,会修改请求包的目的mac地址,目的ip地址不变。

Realserver接收请求,并直接响应客户端。这时便出现一个问题,director此时与realserver位于同一个网络中,当director直接将请求转发给realserver时,realserver检测到该请求包的目的ip是vip而并非自己,便会丢弃,而不会响应。为了解决这个问题,所以需要在所有Realserver上都配上VIP。

 

为什么一定要配置在lo接口上呢?

realserver上的lo口配置VIP,这样限制了VIP不会在物理交换机上产生MAC地址表,从而避免IP冲突。

客户端nginx服务器上启动Realserver.sh脚本内容:

#!/bin/sh

#LVS Client Server

VIP=192.168.1.199 (这里的vip 要和lvs上的keepalived配置文件里面的vip是一样的)

case  $1  in                                                                                                                                                                                                                                                    

start)                                                                                                                                                                                                                                            

    ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP

    /sbin/route add -host $VIP dev lo:0

    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

    sysctl -p >/dev/null 2>&1

    echo "RealServer Start OK"

    exit 0

;;                                                                                                                                                                                                                                         

stop)

    ifconfig lo:0 down

    route del $VIP >/dev/null 2>&1

    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 "RealServer Stoped OK"

    exit 1

;;

*)

    echo "Usage: $0 {start|stop}"

;;

esac

在客户端nginx服务器都要执行上面的脚本 执行方式如下 两台nginx都是一样在lo上绑定虚拟ip 两台都要指定 有多少nginx服务器就指定多少

 

  

这是我们来做个验证  就是把其中一台nginx服务关掉看看有什么效果:

 

这里我们会发现那台nginx服务关掉了 lvs就会从路由表里面把它踢出去   当然nginx再起来的时候lvs就会自动把它加入路由表里面

接下来就是验证的时候了 在验证前我们要先把一些服务器添加到开机自动启动,

chkconfig --add keepalived

chkconfig keepalived on

  1. lvs上 我们要保证开机自动启动keepalived执行命令: echo "/etc/init.d/keepalived restart">>/etc/rc.local 
  2. 在客户端nginx服务器上保证vip开机自动添加 执行命令:echo "sh /root/realserver.sh start" >> /etc/rc.local
  3. 客户端nginx服务器保证开机启动nginx服务执行命令:echo "/usr/local/nginx/sbin/nginx">>/etc/rc.local

 

接下来我们域名解析在Windows上hosts文件里 ,访问网站看到如下效果,说明我们成功了。

 

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