• lvs+keepalived+nginx


    一、简介

    lvs是一款用于四层负载均衡的工具。所谓的四层负载均衡,对应的是网络七层协议,常见的如HTTP协议是建立在七层协议上的,而lvs作用于四层协议上,也即:传输层,网络层,数据链路层和物理层。这里的传输层主要协议有TCP和UDP协议,也就是说lvs主要支持的方式是TCP和UDP。也正是因为lvs是处于四层负载均衡上的,因而其处理请求的能力比常见的服务器要高非常多,比如nginx的请求处理就是建立在网络七层上的,lvs的负载均衡能力是nginx的十倍以上。在特大型网站中,应用服务器是可以横向扩容的,而nginx是不支持横向扩容的

    lvs是一款负载均衡工具,因而如果我们结合lvs和nginx,那么就可以通过部署多台nginx服务器,通过lvs的负载均衡能力,将请求均衡的分发到各个nginx服务器上,再由nginx服务器分发到各个应用服务器,这样,我们就实现了nginx的横向扩展了。由于nginx本质上也是一款应用服务器,因而其也有可能宕机,因而这里结合keepalived就可以实现nginx的故障检测和服务切换。也就是说,通过keepalived+lvs+nginx,我们实现了nginx的高可用集群模式。

    二、调度器和负载均衡策略

    lvs有两个概念,就是调度器和负载均衡策略,所谓的调度器指的是lvs将会以何种方式处理请求和响应数据,其主要有三种调度器

    • Virtual Server via Network Address Translation(VS/NAT):这种方式的主要原理是,用户发送请求到虚拟ip上后,lvs会根据负载均衡算法选择一个目标处理服务,然后将请求报文中的目标ip地址修改为计算得到的目标服务器,并且发送给该服务器。对于响应的报文,调度器会将目标服务器返回的响应数据中的源地址修改为虚拟ip地址。通过这种方式,对客户端而言,其形式上面向的是一台服务器。不过这种方式的缺点在于,所有的响应数据都需要通过调度器,如果请求量比较大的情况下,那么调度器就会成为整个系统的瓶颈。
    • Virtual Server via IP Tunneling(VS/TUN):这种方式主要解决的就是VS/NAT中,响应数据会经过调度器的问题。同VS/NAT一样 ,调度器还是会接收请求的数据,并且将报文中的目标ip修改为目标服务的ip,但是在目标服务处理完数据之后,其会直接将响应报文中的源ip修改为虚拟ip,然后将请求发送给客户端。通过这种方式,响应数据就由各个目标服务进行了处理,而无需通过调度器进行返回,这种方式会大大提高系统的吞吐量,而且由于一般请求报文比响应报文小很多,调度器也只需要处理请求报文,那么系统的整体负载将会被均摊到各个服务器上。
    • Virtual Server via Direct Routing(VS/DR):这种方式相对于VS/TUN,其主要区别在于,VS/TUN是将请求报文中的ip地址修改为目标服务的ip地址,而VS/DR则是直接将请求报文中的MAC地址修改为目标地址,这种方式效率会更高,因为VS/TUN中的ip地址最终还是需要转换为MAC地址来发送数据的

    三、示例

    1. 准备工作

    1. VMware;
    2. 4台CentOs7虚拟主机:192.168.0.6,192.168.0.7,192.168.0.8,192.168.0.9
    3. 系统服务:LVS, Keepalived
    4. Web服务器:nginx
    5. 集群搭建:LVS DR模式

    2. 安装配置

    1. 两台服务器安装lvs+keepalived:192.168.0.6,192.168.0.7

       # 安装ipvs
       sudo yum install ipvsadm
       # 安装keepalived
       sudo yum install keepalived
      
    2. keepalived配置

    192.168.0.6,192.168.0.7 一主MASTER一从BACKUP

    文件位置/etc/keepalived/keepalived.conf

    从服务器配置内容一样, 只是其state和priority参数不同

          state BACKUP
          priority 150 #比主服务器该值小一点即可
    
            	#keepalived.conf配置内容
    	# Global Configuration
    	global_defs {
    	  lvs_id director1  # 指定lvs的id
    	}
    	
    	# VRRP Configuration
    	vrrp_instance LVS {
    	  state MASTER	# 指定当前节点为master节点
    	  interface ens33	# 这里的ens33是网卡的名称,通过ifconfig或者ip addr可以查看
    	  virtual_router_id 51	# 这里指定的是虚拟路由id,master节点和backup节点需要指定一样的
    	  priority 151	# 指定了当前节点的优先级,数值越大优先级越高,master节点要高于backup节点
    	  advert_int 1	# 指定发送VRRP通告的间隔,单位是秒
    	  authentication {
    	    auth_type PASS	# 鉴权,默认通过
    	    auth_pass 123456	# 鉴权访问密码
    	  }
    	
    	  virtual_ipaddress {
    	    192.168.0.20 # 指定了虚拟ip
    	  }
    	
    	}
    	
    	# Virtual Server Configuration - for www server
    	# 后台真实主机的配置
    	virtual_server 192.168.0.20  80 {
    	  delay_loop 1	# 健康检查的时间间隔
    	  lb_algo rr	# 负载均衡策略,这里是轮询
    	  lb_kind DR	# 调度器类型,这里是DR
    	  persistence_time 0	# 指定了持续将请求打到同一台真实主机的时间长度
    	  protocol TCP	# 指定了访问后台真实主机的协议类型
    	
    	  # Real Server 1 configuration
    	  # 指定了真实主机1的ip和端口
    	  real_server 192.168.0.8 80 {
    	    weight 1	# 指定了当前主机的权重
    	    TCP_CHECK {
    	      connection_timeout 10	# 指定了进行心跳检查的超时时间
    	      nb_get_retry 3	# 指定了心跳超时之后的重复次数
    	      delay_before_retry 3	# 指定了在尝试之前延迟多长时间
    	    }
    	  }
    	
    	  # Real Server 2 Configuration
    	  real_server 192.168.0.9 80 {
    	    weight 1	# 指定了当前主机的权重
    	    TCP_CHECK {
    	      connection_timeout 10	# 指定了进行心跳检查的超时时间
    	      nb_get_retry 3	# 指定了心跳超时之后的重复次数
    	      delay_before_retry 3	# 指定了在尝试之前延迟多长时间
    	    }
    	  }
    	}
    
    1. 另外两台:安装nginx

       # 安装nginx
       sudo yum install nginx
      
    2. 安装ngxin的服务器需要写一个脚本(配置虚拟ip)

      lvs调度器是DR模式,这种模式下,对客户端的响应是真实服务器直接返回给客户端的,而真实服务器需要将响应报文中的源ip修改为虚拟ip:192.168.0.20

       #lvsrs.sh 名称自定义 ,注意需要可执行权限 
      
       #!/bin/bash
       ifconfig lo:0 192.168.0.20 netmask 255.255.255.255 broadcast 192.168.0.20 up
       route add -host 192.168.0.20 dev lo:0
       
       echo "0" > /proc/sys/net/ipv4/ip_forward
       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
       
       exit 0
      
    3. 注意防火墙开放端口或关闭防火墙,四台服务器需要相互可以访问ping

    四、运行

    1. 启动keepalived

      systemctl start keepalived

    2. 启动nginx和lvsrs.sh脚本

       #启动nginx
       nginx
       #运行脚本,也可以做成启动服务启动
       ./lvsrs.sh
      

    五、测试

    1、 查看映射消息:ipvsadm -ln

    	[root@localhost keepalived]# ipvsadm -ln
    	IP Virtual Server version 1.2.1 (size=4096)
    	Prot LocalAddress:Port Scheduler Flags
    	  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
    	TCP  192.168.0.20:80 rr
    	  -> 192.168.0.8:80               Route   1      0          0         
    	  -> 192.168.0.9:80               Route   1      0          0  
    	#出现这个说明基本配置成功了
    
    1. 访问:http://172.16.28.120

    结果:192.168.0.8,192.168.0.9两台nginx会交替访问

    备注:可能会一直访问其中一台,刷新多次才会访问另一台

    补充:作业调度算法

    Round-Robin Scheduling          							轮循调度        (rr)
    Weighted Round-Robin Scheduling 							加权轮循调度	(wrr)
    Least-Connection Scheduling     							最少连接调度
    Weighted Least-Connection Scheduling   						加权最少连接调度
    Locality-Based Least-Connection Scheduling 					基于位置的最小连接调度
    Locality-Based Least-Connection with Replication Scheduling 具有复制调度的基于位置的最少连接
    Destination Hashing Scheduling   							目标哈希调度
    Source Hashing Scheduling									源哈希调度
    Shortest Expected Delay Scheduling							最短预期延迟调度
    Never Queue Scheduling           							永不排队调度
    
    固定调度算法:rr,wrr,dh,sh
    动态调度算法:wlc,lc,lblc,lblcr
  • 相关阅读:
    20145222黄亚奇《Java程序设计》第4周学习总结
    20145222黄亚奇《Java程序设计》第3周学习总结
    20145222黄亚奇《Java程序设计》第2周学习总结
    CodeForces
    2020 Multi-University Training Contest 3 1008 Triangle Collision
    Educational Codeforces Round 92 (Rated for Div. 2) E. Calendar Ambiguity
    2020 Multi-University Training Contest 3 1006 X Number
    2020 Multi-University Training Contest 3 1004 Tokitsukaze and Multiple
    2020 Multi-University Training Contest 2 1007 In Search of Gold
    2020 Multi-University Training Contest 1 1009 Leading Robots
  • 原文地址:https://www.cnblogs.com/laoyin666/p/12920389.html
Copyright © 2020-2023  润新知