豆包ko 发表于 2018-12-29 11:13:06

LVS基础及LVS+Keepalived实现双主高可用负载均衡

LVS基础及LVS+Keepalived实现双主高可用负载均衡
  
  
  LB集群:
     (LoadBalancing)即负载均衡集群,其目的是为了提高访问的并发量及提升服务器的性能,其    实现方式分为硬件方式和软件方式。
  硬件实现方式:
        常用的有 F5公司的BIG-IP系列、A10公司的AX系列、Citrix公司的 NetScaler系列等
  软件实现方式:
    LVS工作于传输层、nginx工作于应用层、haproxy工作于传输层和应用层
  本文主要讲解LVS。


  一、什么是LVS ?
   1. LVS:(Linux Virtual Server)Linux虚拟服务,工作于前端调度器内核的netfilter模块上,根据请求报文的目标IP和目标PORT将其调度转发至后端的某主机,其转发是依赖于四层协议的特征进行转发的,因此需要在内核的TCP/IP协议栈进行过滤筛选,这样的过滤转发规则由系统管理员进行定义。

   2. LVS两段式组成:
     ipvsadm:用户空间的命令行工具,用于管理集群服务及集群服务上的主机(RS)。
     ipvs:工作与内核上的netfilter的INPUT钩子之上的程序,可根据用户定义的集群实现请求转发。
  

     工作原理图解如下:
  
http://s4.运维网.com/wyfs02/M02/80/E8/wKioL1dEUSzz1_iYAACiXSOxsXo585.png
  LVS集群专用术语:
         CIP:发送请求的客户端IP地址。
VIP:lvs调度器的IP地址,也是向客户端提供服务的IP地址。
DIP:lvs调度器与后端real server之间通信使用的IP地址。
RIP:提供真正服务的real server的IP地址。
vs:虚拟服务器,调度器,
rs: 后端提供真实服务的服务器

  3.LVS集群的类型:
  1)lvs-nat:
   多目标的DNAT,通过将请求报文中的目标地址和目标端口修改为挑选出的某RS的RIP和PORT实现转发
  2)lvs-dr:
     通过为请求报文的重新封闭一个MAC首部进行转发,源MAC是DIP所在接口的MAC,目标MAC是挑选出某RS的RIP所在接口的MAC地址;IP首部不会发生变化(CIPVIP)
  3)lvs-tun:
      不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而是原IP首部之外再封装一个IP首部(源IP为DIP,目标IP为挑选出的RS的RIP)
  4)lvs-fullnat:
     通过同时修改请求报文的源IP地址(CIP-->DIP)和目标IP地址(VIP-->RIP)进行转发

  4.LVS集群的调度算法(Scheduler):
        根据其调度时是否考虑后端主机的当前负载,可分为静态方法和动态方法两类
  
  静态算法:仅根据算法自身进行调度
http://s4.运维网.com/wyfs02/M00/80/E9/wKiom1dEUDmCTlfUAABGUf0_J2k228.png
  动态算法:根据算法及后端主机当前的负载状态进行调度
  http://s3.运维网.com/wyfs02/M01/80/E9/wKiom1dEUMLAhwYtAACIy4M0xgM140.png

  
  查看当前系统支持的算法:http://s5.运维网.com/wyfs02/M01/80/E8/wKioL1dEUgmSil0NAAAu6iGwXm8791.png
  

  
  5.ipvsadm管理工具用法
  

  管理集群:ipvsadm -A|E -t|u|f service_address [-s scheduler]
              A:增-E:修改
-t:tcp-u:udp-f:firewall mark
-s scheduler:调度算法,默认为wlc
ipvsadm -D-t|u|f service_address删除集群
  管理集群上的RS:
  ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]
  -a:增
  -e:改
  -r server-address :RS的地址;rip[:port]
  -g, gateway, dr,默认
  -i, ipip, tun
  -m, masquerade, nat
  -w weight
  

  查看:
  ipvsadm -L|l
  -n, --numeric:数字格式显示IP和PORT;
  --exact:精确值,不做单位换算;
  -c, --connection:显示IPVS连接;
  --stats:统计数据;
  --rate:速率;
  清空: ipvsadm-C:clear
  保存和重载:
  保存:
  ipvsadm -S > /PATH/TO/SOME_RULE_FILE
  ipvsadm-save > /PATH/TO/SOME_RULE_FILE
  

  重载:
  ipvsadm -R </PATH/TO/SOME_RULE_FILE
  ipvsadm-restore < /PATH/TO/SOME_RULE_FILE
  

  清空计数器:
  ipvsadm -Z [-t|u|f service-address]
  

  
   二、LVS-NAT工作模型及原理
  
  1.lvs-nat原理
     多目标的DNAT,通过将请求报文中的目标地址和目标端口修改为挑选出的某RS的RIP和PORT实现转发;
  

  (1)RIP和DIP必须在同一IP网络,且应该使用私有地址;RS的网络要指向DIP(保证响应报文必须经由VS);
  (2)请求报文和响应报文都经由Director转发,较高负载下,Director易于成为系统性能瓶颈;
  (3)支持端口映射;
  (4)VS必须是Linux,RS可以是任意OS

  2.lvs-nat测试
  
  测试环境:3台虚拟机
Director主机(两张网卡)IP:
         外网:172.18.123.14
         内网:192.168.100.254
         RS1主机IP:192.168.100.20
RS2主机IP:192.168.100.21
        注:Director内网ip及RS主机网卡均设置为仅主机模式,RS主机的网关需指向192.168.100.254,安装apache服务且处于开启状态。
  1).在Director主机上安装ipvsadm并配置集群服务。

http://s1.运维网.com/wyfs02/M01/80/E8/wKioL1dEUpXw-6DzAAA6hNDtHVo761.png
   2).测试
http://s1.运维网.com/wyfs02/M01/80/E8/wKioL1dEUpaQkr6VAAAdlzLQHe0101.png
http://s1.运维网.com/wyfs02/M02/80/EA/wKiom1dEUaOhBzIhAAAOQwVLM-w697.pnghttp://s3.运维网.com/wyfs02/M02/80/E8/wKioL1dEUpfiveZKAAAPANQzoMk016.png
  

  三、LVS-DR工作模型及原理
  
  1.lvs-dr:
        Direct Routing:通过为请求报文的重新封闭一个MAC首部进行转发,源MAC是DIP所在接口的MAC,目标MAC是挑选出某RS的RIP所在接口的MAC地址;IP首部不会发生变化(CIPVIP);
  

  1)确保前端路径器将目标IP为VIP的请求报文发往Director:
     解决方案:
    在路由器上静态绑定VIP和Director的MAC地址;
    禁止RS响应VIP的ARP请求,禁止RS的VIP进行通告
               (a) arptables
          (b) 修改RS的内核参数,并把VIP绑定lo的别名上;
            arp_ignore, arp_announce
  2)RS的RIP可以使用私有地址,也可以使用公网地址;

  3)RS跟Director必须在同一物理网络;RS的网关必须不能指向DIP;
  4)请求报文必须由Directory调度,但响应报文必须不能经由Director;
  5)不支持端口映射;
  6)RS可以使用大多的OS;
  http://s1.运维网.com/wyfs02/M01/80/EA/wKiom1dEVF3C_5KbAAGk2w5pzY4049.png
  2.lvs-dr测试
  
  测试环境(CentOS 7)在director上安装ipvsadm
  
     Director:
        DIP:172.18.123.14
VIP:172.18.123.15
     RS1:
RIP:172.18.123.50
VIP:172.18.123.15
     RS2:
RIP:172.18.123.51
        VIP:172.18.123.15
  

  

  1.关闭RS1、RS2的arp响应:分别在RS1和RS2主机上执行以下命令
  http://s2.运维网.com/wyfs02/M01/80/E8/wKioL1dEVabjv5PUAAAdCDAjZ2s828.png
  2.分别在三台主机上配置VIP;

  在Directorhttp://s2.运维网.com/wyfs02/M02/80/EA/wKiom1dEVNaA9i6JAABWg15KySk822.png
  分别在RS1及RS2上设置VIP
  http://s5.运维网.com/wyfs02/M02/80/EA/wKiom1dEVUuhj3AgAAB50qPaIV0001.png
  3.增加路由
  在Director:
  http://s4.运维网.com/wyfs02/M02/80/E8/wKioL1dEVm2QsIOdAAAkmHGwHog296.png

  RS1及RS2:
  http://s3.运维网.com/wyfs02/M00/80/EA/wKiom1dEVabxXZJZAAAjFQe-YCw189.png
  
  4.在Director上添加集群列表
  http://s2.运维网.com/wyfs02/M00/80/E8/wKioL1dEVs-BmgrgAAA2OxDwxG4023.png
  
  5.测试
http://s1.运维网.com/wyfs02/M01/80/EA/wKiom1dEVhKQwUFSAAAqhhgRYHU043.pnghttp://s1.运维网.com/wyfs02/M01/80/E8/wKioL1dEVwWxisw-AAAquRQPTT0743.png
注:arp响应限制
  1)arp_ignore:
  定义对目标地址为本地IP的ARP询问不同的应答模式0
  0 - (默认值): 回应任何网络接口上对任何本地IP地址的arp查询请求
  1 - 只回答目标IP地址是来访网络接口本地地址的ARP查询请求
  2 -只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内
  3 - 不回应该网络界面的arp请求,而只对设置的唯一和连接地址做出回应
  4-7 - 保留未使用
  8 -不回应所有(本地地址)的arp查询
  
  2)arp_announce:
  对网络接口上,本地IP地址的发出的,ARP回应,作出相应级别的限制: 确定不同程度的限制,宣布对来自本地源IP地址发出Arp请求的接口
  0 - (默认) 在任意网络接口(eth0,eth1,lo)上的任何本地地址
  1 -尽量避免不在该网络接口子网段的本地地址做出arp回应. 当发起ARP请求的源IP地址是被设置应该经由路由达到此网络接口的时候很有用.此时会检查来访IP是否为所有接口上的子网段内ip之一.如果改来访IP不属于各个网络接口上的子网段内,那么将采用级别2的方式来进行处理.
  2 - 对查询目标使用最适当的本地地址.在此模式下将忽略这个IP数据包的源地址并尝试选择与能与该地址通信的本地地址.首要是选择所有的网络接口的子网中外出访问子网中包含该目标IP地址的本地地址. 如果没有合适的地址被发现,将选择当前的发送网络接口或其他的有可能接受到该ARP回应的网络接口来进行发送.
  

  
  四、基于Keepalived实现lvs双主高可用集群及部署应用
  
  1.实验拓扑结构图
  
http://s2.运维网.com/wyfs02/M02/80/E9/wKioL1dEZOnguo7HAADtsl8AKaM048.png
  
  2.部署环境
http://s2.运维网.com/wyfs02/M01/80/EA/wKiom1dEV6uihMMbAAA-loZf2X4450.png
  3.安装软件
   1)保证LVS1及LVS2时间同步,并能够通信,并在两台主机上安装keepalived及ipvsadm
  http://s4.运维网.com/wyfs02/M01/80/EA/wKiom1dEWAmRf3VpAAASoXeXvtg027.png

  2)配置LVS1的keepalived.conf
  ! Configuration File for keepalived
  
  global_defs {
     notification_email {
                 root@localhost
     }
     notification_email_from zzpp@zp.com
     smtp_server 127.0.0.1
     smtp_connect_timeout 30
     router_id MY_LVS
  }
  
  vrrp_instance VI_1 {
      state MASTER
      interface eno16777736
      virtual_router_id 123
      priority 100
      advert_int 1
      authentication {
        auth_type PASS
        auth_pass abcdef
      }
      virtual_ipaddress {
        172.18.123.22
      }
  }
  
  vrrp_instance VI_2 {
      state BACKUP
      interface eno16777736
      virtual_router_id 223
      priority 98
      advert_int 1
      authentication {
        auth_type PASS
        auth_pass abcdef
      }
      virtual_ipaddress {
        172.18.123.23
      }
  }
  
  virtual_server 172.18.123.22 80 {
      delay_loop 6
      lb_algo rr
      lb_kind DR
      protocol TCP
  
      real_server 172.18.123.50 80 {
        weight 1
        HTTP_GET {
              url {
              path /
              }
              connect_timeout 3
              nb_get_retry 3
              delay_before_retry 3
        }
      }
  
      real_server 172.18.123.51 80 {
        weight 1
        HTTP_GET {
              url {
              path /
              }
              connect_timeout 3
              nb_get_retry 3
              delay_before_retry 3
        }
      }
  }
  
  virtual_server 172.18.123.23 80 {
      delay_loop 6
      lb_algo rr
      lb_kind DR
      protocol TCP
  
      real_server 172.18.123.50 80 {
        weight 1
        HTTP_GET {
              url {
              path /
              }
              connect_timeout 3
              nb_get_retry 3
              delay_before_retry 3
        }
      }
  
      real_server 172.18.123.51 80 {
        weight 1
        HTTP_GET {
              url {
              path /
              }
              connect_timeout 3
              nb_get_retry 3
              delay_before_retry 3
        }
      }
  }
  

  3) scp LVS1的keepalived.conf到LVS2的/etc/keepalived/下,并修改下述标识内容,其他内容不变。
  
  vrrp_instance VI_1 {
      state BACKUP
      interface eno16777736
      virtual_router_id 123
      priority 98
      advert_int 1
      authentication {
        auth_type PASS
        auth_pass abcdef
      }
      virtual_ipaddress {
        172.18.123.22
      }
  }
  
  vrrp_instance VI_2 {
      state MASTER
      interface eno16777736
      virtual_router_id 223
      priority 100
      advert_int 1
      authentication {
        auth_type PASS
        auth_pass abcdef
      }
      virtual_ipaddress {
        172.18.123.23
      }
  }
  
  
  4)在RS1及RS2上安装httpd、php及php-mysql
  
http://s5.运维网.com/wyfs02/M02/80/E8/wKioL1dEWf6gDCxWAAAVU1DAS9Y829.png
  准备测试页
http://s5.运维网.com/wyfs02/M02/80/EA/wKiom1dEWQyy5yEzAAAmnDEFejk045.png
  配置内核及VIP,运行下面脚本:bash
  #!/bin/bash
  #
  VIP1=172.18.123.22
  VIP2=172.18.123.23
  interface1="lo:0"
  interface2="lo:1"
  
  case $1 in
  start)
  echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
  echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
  echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
  echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
  

  ifconfig $interface1 $VIP1 broadcast $VIP1 netmask 255.255.255.255 up
  route add -host $VIP1 dev $interface1
  ifconfig $interface2 $VIP2 broadcast $VIP2 netmask 255.255.255.255 up
  route add -host $VIP2 dev $interface2
  ;;
  stop)
  

  echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
  echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
  echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
  echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
  ifconfig $interface1 down
  ifconfig $interface2 down
  ;;
  status)
  ififconfig lo:0 | grep $VIP1 &> /dev/null && ifconfig lo:1 | grep $VIP2&> /dev/null;then
  echo "ipvs is running"
  else
  echo "ipvs is stopped"
      fi
  ;;
  *)
  echo "Usage: `basename $0` {start|stop|status}"
  exit 1
  esac
  查看Rs主机的ip信息:
  http://s5.运维网.com/wyfs02/M00/80/E8/wKioL1dEWmKSVWCCAABA3EEm_Hg045.png
  
  5)测试,启动LVS1及LVS2主机上的keepalived服务,查看两节点的ip信息及ipvs规则
  http://s5.运维网.com/wyfs02/M02/80/E8/wKioL1dEWpvAND_vAABb8SG4TdA493.png
  http://s3.运维网.com/wyfs02/M01/80/E8/wKioL1dEWxmglLdGAABalGxXwX0238.png
  通过浏览器访问172.18.123.22及172.18.123.23
  
http://s4.运维网.com/wyfs02/M00/80/E9/wKioL1dEW2aSsbebAAA-jHBM0TY725.pnghttp://s4.运维网.com/wyfs02/M00/80/EA/wKiom1dEWnSz-bdGAAA9rE9W-Vk163.png
http://s4.运维网.com/wyfs02/M01/80/EA/wKiom1dEWnTjsJulAAA-6u-6YlQ909.pnghttp://s4.运维网.com/wyfs02/M01/80/E9/wKioL1dEW2eyo9P9AAA_qJgEaEM719.png
  停掉LVS2的keepalived服务,查看LVS1的ip及测试访问均正常。
  http://s1.运维网.com/wyfs02/M00/80/E9/wKioL1dEW7rhCo_yAABl1GYOYOk755.png
  6)在SQL1主机上安装Mariadb数据库,并授权用户
  http://s1.运维网.com/wyfs02/M01/80/EA/wKiom1dEWvSxWMBiAAAjC0ctcLM195.png
  在两台RS上配置测试是否连通Mariadb
  http://s5.运维网.com/wyfs02/M02/80/E9/wKioL1dEXBCgDRw8AAAdyFxDieo862.png
  http://s3.运维网.com/wyfs02/M00/80/EA/wKiom1dEW0-hPN-cAAA6HVjH3Nk407.png
  四、部署phpwind
  1.在RS1及RS2主机上下载phpwind_v9.0.1.141223_utf8.zip,解压到/var/www/html目录下,更改解压后目录的属主属组为apache用户
  http://s1.运维网.com/wyfs02/M02/80/E9/wKioL1dEXGzDSJrRAAAyIvcMVck313.png
  

  
  出现下述错误,安装php-xml即可
  http://s1.运维网.com/wyfs02/M02/80/EA/wKiom1dEXHbimrqvAABIXirU5NI173.png
  

  安装成功
  http://s3.运维网.com/wyfs02/M00/80/EA/wKiom1dEXJfjm5uyAABZN_dNE7g446.png
  测试OK。
  
http://s1.运维网.com/wyfs02/M01/80/EA/wKiom1dEXBXzF9CTAAA8GQAiotY039.png
http://s2.运维网.com/wyfs02/M01/80/E9/wKioL1dEXQnDNZS7AAA6waR8kNk763.png
  


  

  

  


  

  

  

  

  


  


  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  



页: [1]
查看完整版本: LVS基础及LVS+Keepalived实现双主高可用负载均衡