zpjx 发表于 2018-12-30 10:19:50

负载均衡(LVS DR模式搭建,DR只用一个公网ip,Keepalived+LVS DR)

一、LVS DR模式搭建

准备工作
三台机器:
分发器,dir:192.168.52.100
rs1:192.168.52.101(网关改回来,之前nat模式改成100)
rs2: 192.168.52.102(网关改回来,之前nat模式改成100)
vip:192.168.52.200   (这个虚拟ip需要绑定在每台机器上)


分发器dir上:
# iptables -F
# vim /usr/local/sbin/lvs.dr.sh
#! /bin/bash
echo 1 > /proc/sys/net/ipv4/ip_forward
ipv=/usr/sbin/ipvsadm
vip=192.168.52.200
rs1=192.168.52.101
rs2=192.168.52.102
#注意这里的网卡名字
ifdown ens33
ifup ens33
ifconfig ens33:2 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip dev ens33: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
# sh /usr/local/sbin/lvs.dr.sh
成功断开设备 'ens33'。
成功激活的连接(D-Bus 激活路径:/org/freedesktop/NetworkManager/ActiveConnection/1)


rs1:192.168.52.101和rs2:192.168.52.102都执行以下脚本
# vim /usr/local/sbin/lvs_rs.sh
#/bin/bash
vip=192.168.52.200
#把vip绑定在lo上,是为了实现rs直接把结果返回给客户端
ifdown lo
ifup lo
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip lo:0
#以下操作为更改arp内核参数,目的是为了让rs顺利发送mac地址给客户端
#参考文档www.cnblogs.com/lgfeng/archive/2012/10/16/2726308.html
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
# sh /usr/local/sbin/lvs_rs.sh


测试:DR模式是没有办法用浏览器显著的看出结果,也不能用rs1,rs2访问,因为vip绑定在lo上,他们会默认访问自己,最好的办法就是从新开启一个虚拟机,ip设置在同一网段,用curl查看。
  二、DR模式只用一个IP实现
  
http://s1.运维网.com/images/20180131/1517410192711048.jpg
  在前面加一个路由器,原理就是让 路由器把所有的80端口请求都分给VIP,分发器再分给每个web服务器,而web服务器处理完请求后跟客户连接就不走分发器了,直接通过路由器去外网了,这样就实现了只用一个公网IP也能用DR模式
  先从内网找了三台服务器分别是:
  192.168.1.166 web1
  192.168.1.167 web2
  192.168.1.160 分发器
  192.168.1.169 VIP
  192.168.1.1   路由器内网ip(网关) 路由器是随便找的一台tplink adal路由器,凑合着测试用的
  211.83.113.119 路由器的WAN口IP (随便蒙的,重复莫怪)
  先安装ipvsadm 直接yum install ipvsadm就行了,不多说
  分发器上的设置
  global_defs {
  notification_email {
  ufo@xman.com
  }
  notification_email_from Alexandre.Cassen@firewall.loc
  smtp_server smtp.qq.com
  smtp_connect_timeout 30
  router_id LVS_DEVEL
  }
  vrrp_sync_group VG1 {
  group{
  VI_1
  }
  }
  vrrp_instance VI_1 {
  state MASTER
  interface eth0
  virtual_router_id 51
  priority 100
  advert_int 1
  authentication {
  auth_type PASS
  auth_pass 33210
  }
  virtual_ipaddress {
  192.168.1.169
  }
  virtual_server 192.168.1.169 80 {
  delay_loop 6
  lb_algo rr
  lb_kind DR
  protocol TCP
  real_server 192.168.1.166 80 {
  weight 1
  inhibit_on_failure
  TCP_CHECK {
  connect_timeout 5
  nb_get_retry 3
  delay_before_retry 3
  connect_port 80
  }
  }
  real_server 192.168.1.167 80 {
  weight 1
  inhibit_on_failure
  TCP_CHECK {
  connect_timeout 5
  nb_get_retry 3
  delay_before_retry 3
  connect_port 80
  }
  }
  配置文件写完了,然后就是
  mkdir /etc/keepalived#系统默认会到这里去找配置文件
  cp /usr/local/keepalive/etc/keepalived/keepalived.conf /etc/keepalived/
  cp /usr/local/keepalive/etc/rc.d/init.d/keepalived /etc/init.d/
  cp /usr/local/keepalive/etc/sysconfig/keepalived /etc/sysconfig/
  cp /usr/local/keepalive/sbin/keepalived /bin/ #将可执行程序放入sbin 或者 bin目录里
  vim /etc/sysctl.conf
  net.ipv4.ip_forward = 1
  保存退出 后执行sysctl -p
  route add defaule gw 192.168.1.1 把路由内网地址添加为默认网关
  web服务器设置
  两台web服务器也要修改 /etc/sysctl.conf 修改内容如下
  vim /etc/sysctl.conf
  # LVS
  net.ipv4.conf.all.arp_ignore = 1
  net.ipv4.conf.all.arp_announce = 2
  net.ipv4.conf.lo.arp_ignore = 1
  net.ipv4.conf.lo.arp_announce = 2
  sysctl -p
  之后还要增加vip
  ifconfig lo:1 192.168.1.169 netmask 255.255.255.255 别忘了加到rc.local里面
  route add defaule gw 192.168.1.1 把路由内网地址添加为默认网关
  路由器设置
  路由器的设置没什么好说的,除了上网设置以外还要做一个端口映射,就是把80端口映射到 vip上也就是192.168.1.169
  现在启动keepalived吧
  /etc/init.d/keepalived start
  开始的时候比较慢,大概1分钟后系统日志里面出现下面这条记录就OK了
  avahi-daemon: Registering new address record for 192.168.1.169 on eth0
  我们访问一下 http://211.83.113.119
  我把我们的应用程序放到了上面跑了一下,呵呵测试成功
  ipvsadm -L -n
  IP Virtual Server version 1.2.1 (size=4096)
  Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port         Forward Weight ActiveConn InActConn
  TCP192.168.1.169:80 rr
  -> 192.168.1.166:80             Route   1      5          6
  -> 192.168.1.167:80             Route   1      3          9
  后来遇到了一个问题,由于这套应用处在一个大网站的后台,所以大部分的请求都来自同一个IP地址,而有一部分程序需要给每个连接做session粘滞,
  这样我就不能用lvs 的-p参数来设置ip粘滞时间,如果用lvs的粘滞时间的话大部分的请求都将分给同一台web服务器(注意:这里是session粘滞而不是IP粘滞),
  lvs可做不到这点,怎么办呢?
  在cu论坛上询问后得知有很多朋友做过类似的项目,他们的解决办法是 将session共享,共享到什么地方就有很多选择了
  我们是把所有web服务器的php session都给memcached ,这样你不管分发器把 ip连接分给哪个web服务器都不会有问题了,配置方法很简单,就在php的配置文件内
  增加一条语句就可以了,不过前提你需要装好memcache模块
  
  ; Handler used to store/retrieve data.
  session.save_handler = memcache
  session.save_path = "tcp://192.168.1.161:11213"
  


  

三、keepalived + LVS DR

1.完整架构需要两台分发器(角色为dir),两台dir上要安装keepalived软件,目的是实现高可用,但keepalived本身也有负载均衡的功能,所以当一台分发器宕机后,不会影响工作,本次实验装一台Keeplived
2.keepalived内置了ipvsadm的功能,所以不需要暗转ipvsadm包,也不用编写和执行dir上的脚本,但是两台rs上的脚本还是要编写和执行的。
3.keepalived有一个较好的功能,如果后台一台rs宕机,便不会再把请求发送过去。
4.在进行实验之前,需要执行2条命令,把之前ipvsadm规则清空掉,重新加载网卡,把之前设置的vip清空掉。
# ipvsadm -C
# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port         Forward Weight ActiveConn InActConn
# systemctl restart network


配置:
编写dir上keepalived的配置文件如下:
vrrp_instance VI_1 {
    #备用服务器上为 BACKUP
    state MASTER
    #绑定vip的网卡为ens33,你的网卡可能不一样
    interface ens33
    virtual_router_id 51
    #备用服务器上为90
    priority 100
    advert_int 1
    authentication {
      auth_type PASS
      auth_pass aminglinux
    }
   #设置vip
    virtual_ipaddress {
      192.168.52.200
    }
}
virtual_server 192.168.52.200 80 {
    #(每隔10秒查询realserver状态)
    delay_loop 10
    #(lvs 算法)
    lb_algo rr
    #(DR模式)
    lb_kind DR
    #(同一IP的连接60秒内被分配到同一台realserver)
    persistence_timeout 60
    #(用TCP协议检查realserver状态)
protocol TCP
    real_server 192.168.52.101 80 {
      #(权重)
      weight 100
      TCP_CHECK {
      #(10秒无响应超时)
      connect_timeout 10
      nb_get_retry 3
      delay_before_retry 3
      connect_port 80
      }
    }
    real_server 192.168.52.102 80 {
      weight 100
      TCP_CHECK {
      connect_timeout 10
      nb_get_retry 3
      delay_before_retry 3
      connect_port 80
      }
   }
}


配置两台rs的配置文件如下:
rs1:192.168.52.101和rs2:192.168.52.102都执行以下脚本
# vim /usr/local/sbin/lvs_rs.sh
#/bin/bash
vip=192.168.52.200
#把vip绑定在lo上,是为了实现rs直接把结果返回给客户端
ifdown lo
ifup lo
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip lo:0
#以下操作为更改arp内核参数,目的是为了让rs顺利发送mac地址给客户端
#参考文档www.cnblogs.com/lgfeng/archive/2012/10/16/2726308.html
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
# sh /usr/local/sbin/lvs_rs.sh


测试:在dir上启动keepalived,查看Ipvsadm的规则。和LVS DR模式一样,需要配置一台同网段的虚拟机测试,浏览器看不出结果。
# systemctl start keepalived
# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port         Forward Weight ActiveConn InActConn
TCP192.168.52.200:80 rr persistent 60
-> 192.168.52.101:80            Route   100    0          0
-> 192.168.52.102:80            Route   100    0          0



页: [1]
查看完整版本: 负载均衡(LVS DR模式搭建,DR只用一个公网ip,Keepalived+LVS DR)