fish3129 发表于 2018-12-29 12:50:42

LVS DR NAT keepalived

LVS
  LVS 架构
LVS是一个实现负载均衡集群的开源软件项目,LVS架构从逻辑上可分为调度层(Director)、server集群层(Real server)和共享存储层。
http://s3.运维网.com/wyfs02/M02/71/E3/wKiom1XZ5ZOjVVHEAAEp3YOrOYY406.jpg
  LVS-DR
DR(调度器将请求来的数据包的目标mac地址改为real server的mac地址,返回的时候也不经过调度器,直接返回给客户端),其实该过程就就是利用“以太网”通讯是通过mac地址的原理,从而让realserver将数据直接返回给目标地址,而不经过DR返回数据http://s3.运维网.com/wyfs02/M00/71/DF/wKioL1XZ58jxtt-oAAFCDduseQo883.jpg
  案例lvs-dr
  第一步:完成IP地址的配置以及网络配置
  第二步:安装相应软件
  在RS-1和RS-2上安装nginx,方便测试
  yum -y install nginx
  Director上安装ipvsadm
  yum -yinstall ipvsadm
  
  第三步:配置DR
  
  vim /usr/local/sbin/lvs_dr.sh
#! /bin/bash
echo 1 > /proc/sys/net/ipv4/ip_forward             #启动路由转发功能
ipv=/sbin/ipvsadm
vip=172.16.1.100
rs1=172.16.1.2
rs2=172.16.1.3
ifconfig eth1:0 $vipbroadcast $vip netmask 255.255.255.255 up
route add -host $vip dev eth1:0
$ipv -C                                       #清除ipvsadm的规则
$ipv -A -t $vip:80 -s wrr                          #加权轮训算法
  #-A 在内核的虚拟服务器表中添加一条新的虚拟服务器记录。也就是增加一台新的虚拟服务器。
  #-a
  #-s 表示使用的调度算法,有这样几个选项rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,默认的调度算法是: wlc
  #调度算法
  
$ipv -a -t $vip:80 -r $rs1:80 -g -w 1
$ipv -a -t $vip:80 -r $rs2:80 -g -w 1
  
  #-a 在内核虚拟服务器表的一条记录里添加一条新的真实服务器记录。也就是在一个虚拟服务器中增加一台新的真实服务器
  #-t 说明虚拟服务器提供的是tcp的服务 or
  #-r 真实的服务器[Real-Server:port]
  #-g 指定LVS 的工作模式为直接路由模式
  #-w 真实服务器的权值,如上的配置,两天服务器的权重一样,如访问两次服务,那么一次在rs1上,一次在rs2上。
  
  
  第四步:配置RS
  两台rs上:vim /usr/local/sbin/lvs_dr_rs.sh
#! /bin/bash
vip=172.16.1.100
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip lo:0
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore         #关闭ARP
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
  
  第五步:启动脚本
  然后director上执行: bash /usr/local/sbin/lvs_dr.sh
两台rs上执行: bash/usr/local/sbin/lvs_dr_rs.sh
  
  第六步:在RS-1和RS-2上配置用于测定的web页面,web.html
  
  RS-1上的配置: echo "rs1 web server" >/usr/share/nginx/html/web.html
  RS-2上的配置: echo "rs2 web server" >/usr/share/nginx/html/web.html
  
  注意:需启动nginx
  
  第7步:通过curl 172.16.1.100/web.html,其执行结果如下
  
http://s3.运维网.com/wyfs02/M02/71/E3/wKiom1XZ5dzRek7ZAAD-zOzxgbw291.jpg
  第8步:在DR上通过ipvsadm可以查看到如下的InActConn为7:7与其定义的 wrr调度方式一致。
http://s3.运维网.com/wyfs02/M00/71/DF/wKioL1XZ5_zRJCWoAACUeTk6SwA943.jpg
  
其中在这三种IP负载均衡的技术中,DR和TUN模式都需要在真实服务器上对arp_ignore和arp_announce参数进行配置,主要是实现禁止响应对VIP的ARP请求。
在lvs环境中,需要设定以下的参数
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/lo/arp_announce
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce

arp_ignore:定义对目标地址为本地IP的ARP询问不同的应答模式0
0 - (默认值): 回应任何网络接口上对任何本地IP地址的arp查询请求
1 - 只回答目标IP地址是来访网络接口本地地址的ARP查询请求
2 -只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内
3 - 不回应该网络界面的arp请求,而只对设置的唯一和连接地址做出回应
4-7 - 保留未使用
8 -不回应所有(本地地址)的arp查询

arp_announce:对网络接口上,本地IP地址的发出的,ARP回应,作出相应级别的限制: 确定不同程度的限制,宣布对来自本地源IP地址发出Arp请求的接口
0 - (默认) 在任意网络接口(eth0,eth1,lo)上的任何本地地址
1 -尽量避免不在该网络接口子网段的本地地址做出arp回应. 当发起ARP请求的源IP地址是被设置应该经由路由达到此网络接口的时候很有用.此时会检查来访IP是否为所有接口上的子网段内ip之一.如果改来访IP不属于各个网络接口上的子网段内,那么将采用级别2的方式来进行处理.
2 - 对查询目标使用最适当的本地地址.在此模式下将忽略这个IP数据包的源地址并尝试选择与能与该地址通信的本地地址.首要是选择所有的网络接口的子网中外出访问子网中包含该目标IP地址的本地地址. 如果没有合适的地址被发现,将选择当前的发送网络接口或其他的有可能接受到该ARP回应的网络接口来进行发送.

  三、调度算法
LVS主要的调度算法
轮询调度-加权轮询调度-最小连接调度-加权最小连接调度-基于局部性的最少连接-
带复制的基于局部性的最少连接-目标地址散列调度-源地址散列调度

1:轮询算法(RR)就是按依次循环的方式将请求调度到不同的服务器上,该算法最大的特点就是实现简单。轮询算法假设所有的服务器处理请求的能力都是一样的,调度器会将所有的请求平均分配给每个真实服务器
2:加权轮询算法(WRR)主要是对轮询算法的一种优化与补充,LVS会考虑每台服务器的性能,并给每台服务器添加一个权值,如果服务器A的权值为1,服务器B的权值为2,则调度到服务器B的请求会是服务器A的两倍。权值越高的服务器,处理的请求越多。
3:最小连接调度算法(LC)将把请求调度到连续数量最小的服务器上,
4:加权最小连接算法(WLC)则是给每台服务器一个权值,调度器会尽可能保持服务器连接数量与权值之间的平衡
5:基于局部性的最少连接调度算法(lblc)是请求数据包的目标IP地址的一种调度算法,该算法先根据请求的目标IP地址寻找最近的该目标IP地址所有使用的服务器,如果这台服务器依然可用,并且用能力处理该请求,调度器会尽量选择相同的服务器,否则会继续选择其他可行的服务器。
6:带复杂的基于局部性最少的连接算法(lblcr)激励的不是一个目标IP与一台服务器之间的连接记录,他会维护一个目标IP到一组服务器之间的映射关系,防止单点服务器负责过高
7:目标地址散列调度算法(DH)也是根据目标IP地址通过散列函数将目标IP与服务器建立映射关系,出现服务器不可用或负载过高的情况下,发往该目标IP的请求会固定发给该服务器。
8:源地址散列调度算法(SH)与目标地址散列调度算法类似,但它是根据源地址散列算法进行静态分配固定的服务器资源

LVS+keeplived
ipvsadm的缺陷是不能判断realserver是否存活,从而导致数据还是会根据dr的调度,发送到存在问题的服务器上。而keepalived就存在检查机制,一单检测到realserver出现故障,就在ipvsadm的表中删除映射关系,从而保证数据的有效性。
keepalived会根据keepalived的配置,自动完成dr的配置,不用单独配置ipvsadm。
http://s3.运维网.com/wyfs02/M01/71/DF/wKioL1XZ6BuxjVmDAAEAFzku-Uw044.jpg
  本实验主要针对master进行配置,用于测试是否可以完成负载
  注意:前面虽然我们已经配置过一些操作,但是下面我们使用keepalived操作和之前的操作是有些冲突的,所以若是之前配置过DR,请首先做如下操作:dr上执行:

ipvsadm -C
ifconfig eth1:0down
  
  第一步:安装keepalived
  yum install-y keepalived
  
  第二步:安装好后,编辑配置文件
vim /etc/keepalived/keepalived.conf #建议备份keepalived.conf的原始配置
  
  vrrp_instance VI_1 {
    state MASTER                  #备用服务器上为 BACKUP
    interface eth1
    virtual_router_id 51
    priority 100                  #备用服务器上为90
    advert_int 1
    authentication {
      auth_type PASS
      auth_pass 1111
    }
    virtual_ipaddress {
      192.168.0.200
      }
}
virtual_server 192.168.0.200 80 {
    delay_loop 6               #(每隔10秒查询realserver状态)
    lb_algo wlc                  #(lvs 算法)
    lb_kind DR                  #(Direct Route)
    persistence_timeout 60      #(同一IP的连接60秒内被分配到同一台realserver)
    protocol TCP                  #(用TCP协议检查realserver状态)

    real_server 192.168.0.116 80 {
      weight 100               #(权重)
      TCP_CHECK {
      connect_timeout 10       #(10秒无响应超时)
      nb_get_retry 3
      delay_before_retry 3
      connect_port 80
      }
    }
real_server 192.168.0.117 80 {
      weight 100
      TCP_CHECK {
      connect_timeout 10
      nb_get_retry 3
      delay_before_retry 3
      connect_port 80
      }
   }
}
  
  第三步:DR和RS的其他配置
  以上为主director的配置文件,从director的配置文件只需要修改
state MASTER-> state BACKUP
priority 100 -> priority 90
配置完keepalived后,需要开启端口转发(主从都要做):
echo 1 > /proc/sys/net/ipv4/ip_forward
  最后,两个director上启动keepalived服务(先主后从):
/etc/init.d/keepalived start
另外,需要注意的是,启动keepalived服务会自动生成vip和ipvsadm规则,不需要再去执行上面提到的/usr/local/sbin/lvs_dr.sh 脚本。
  
  然后,两个rs上执行 /usr/local/sbin/lvs_dr_rs.sh脚本(如上所示的lvs DR配置的rs脚本)
  
  第四步:关闭192.168.0.117的eth1网口,如下所示,表示keepalived的切换过程
http://s3.运维网.com/wyfs02/M01/71/E3/wKiom1XZ5hPgdWVVAAFQ2gc7O2I830.jpg

三、LVS-NAT
如下图所示,当192.168.0.111访问realserver提供的服务时,会将请求发送给DR,DR根据其调度算法,确定是将该请求发送给realserver1还是realserver2,当realserver收到该请求后,会将回应信息发送给DR,再由DR回应给192.168.0.111。这就是LVS-NAT的一个工作原理。
http://s3.运维网.com/wyfs02/M02/71/DF/wKioL1XZ6DqAI23VAAC3Apofebo344.jpg
  案例:
  需求:三台服务器一台作为director, 两台作为real server
       Director 有一个外网ip (192.168.0.115) 和一个内网ip(172.16.1.1), 两个real server上只有内网ip(172.16.1.2)和(172.16.1.3) 并且需要把两个real server的内网网关设置为director的内网ip(172.16.1.1)。
  
  第一步:配置IP和网络信息
  略……
  第二步:DR上的配置如下脚本(命名为lvs_nat.sh)
  #! /bin/bash
  # director 服务器上开启路由转发功能:
  echo 1 > /proc/sys/net/ipv4/ip_forward
  # 关闭icmp的重定向
  echo 0 >/proc/sys/net/ipv4/conf/all/send_redirects
  echo 0 >/proc/sys/net/ipv4/conf/default/send_redirects
  echo 0 > /proc/sys/net/ipv4/conf/eth1/send_redirects
  echo 0 > /proc/sys/net/ipv4/conf/eth2/send_redirects
  # director 设置nat防火墙
  iptables -t nat -F
  iptables -t nat -X
  iptables -t nat -A POSTROUTING -s172.16.1.0/24-j MASQUERADE
  # director设置ipvsadm
  IPVSADM='/sbin/ipvsadm'
  $IPVSADM -C
  $IPVSADM -A -t 192.168.0.200:80 -swrr
  $IPVSADM -a -t 192.168.0.200:80 -r172.16.1.2:80 -m -w 1
  $IPVSADM -a -t 192.168.0.200:80 -r172.16.1.3:80 -m -w 1
  第三步:运行lvs_nat.sh脚本
  sh lvs_nat.sh
  第四步:安装nginx,在目录的html目录下,配置如下内容(测试使用),并启动nginx
  rs1上: echo "rs1 server" >/usr/share/nginx/html/index.html
rs2上: echo "rs2server" >/usr/share/nginx/html/index.html
  第五步:测试结果
http://s3.运维网.com/wyfs02/M02/71/E3/wKiom1XZ5jWRWLNdAACKU2pliQQ226.jpg
  




页: [1]
查看完整版本: LVS DR NAT keepalived