LVS DR模式 负载均衡服务搭建

最近在研究服务器负载均衡,阅读了网上的一些资料,发现主要的软件负载均衡方案有nginx(针对HTTP服务的负载均衡),LVS(针对IP层,MAC层的负载均衡)。LVS模式工作在网络层,且由内核实现负载转发,效率要比nginx高。

LVS负载均衡包含三种模式:

1. NAT模式(类似路由器,实现外网内网地址映射,负载均衡服务器修改请求包的源以及目的MAC地址和IP地址,发送给实际服务器;负载均衡服务器,修改响应包的源以及目的MAC地址和IP地址,发送给客户端。请求和响应报文都需要经过负载均衡服务器)

2. TUN模式(IP隧道,负载均衡服务器将外网传来的数据包封装在IP隧道中,传给实际服务器。实际服务器的响应直接发给客户端,而不需要经过负载均衡服务器。)

3. DR模式(负载均衡服务器和后端的实际服务器拥有相同的虚拟IP地址,负载均衡服务器收到响应包后,修改目的MAC地址发给实际服务器,实际服务器将响应包直接发给客户端,不需要经过负载均衡服务器)

搭建 LVS DR模式负载均衡服务

连接示意图如下:

LVS DR模式 负载均衡服务搭建

其中,负载均衡服务器的IP地址为 10.10.10.30/24 和 10.10.10.22/32(该IP地址是用户访问的IP地址), Real Server 1的IP地址为10.10.10.31/24, Real Server 2的IP地址为10.10.10.32/24,三者连接在同一个局域网中,且 RS1和 RS2的虚拟IP地址(可以在lo或者lo:0上设置该IP地址,即本地环回,这样该虚拟IP只对该机器本身可见,不会暴露在外部造成IP冲突)都设为负载均衡服务器的IP地址 dev-1. 

这样外部访问10.10.10.22时,会访问到负载均衡服务器,而负载均衡服务器选择某个实际服务器,比如RS1,然后将包的目的MAC地址修改为RS1的MAC地址,在将包送到局域网上。此时对于请求数据包来说,目的MAC地址为RS1的MAC地址,因此RS1会收到,RS1发现包的目的MAC为自身,且目的IP地址为10.10.10.22,也是自身的一个IP,于是就认为数据包是发到自己的,就开始进行处理。

一、安装http服务
1. 在RS1和RS2上分别安装httpd服务
2. 修改/etc/httpd/conf/httpd.conf 文件,进行相应的配置。
3. 启动httpd服务,并设置防火墙开放80端口

二、在负载均衡服务器上安装并配置ipvsadm
1. yum -y install ipvsadm
2. 设置实际ip和虚拟IP

ifconfig eth0 10.10.10.30/24
ifconfig eth0:0 10.10.10.22 netmask 255.255.255.255 #虚拟IP,暴露给外部

3. 设置负载转发

方式一,通过ipvsadm

systemctl start ipvsadm
ipvsadm -C
ipvsadm --set 30 5 60
#vip on load balancer
ipvsadm -A -t 10.10.10.22:80 -s wrr -p 20 #接受转发协议
ipvsadm -a -t 10.10.10.22:80 -r 10.10.10.31:80 -g -w 1 #增加转发目的地
ipvsadm -a -t 10.10.10.22:80 -r 10.10.10.32:80 -g -w 1 #增加转发目的地
ipvsadm -L -n

方式二,通过keepalived

vim /etc/keepalived/keepalived.conf 修改配置文件如下
global_defs { 
  notification_email { 
        skc361@163.com 
  } 
  notification_email_from sns-lvs@gmail.com 
  smtp_server 192.168.80.1 
  smtp_connection_timeout 30
  router_id LVS_DEVEL  # 设置lvs的id,在一个网络内应该是唯一的

vrrp_instance VI_1 { 
    state MASTER  #指定Keepalived的角色,MASTER为主,BACKUP为备         
    interface eth0  #指定Keepalived的角色,MASTER为主,BACKUP为备
    virtual_router_id 51  #虚拟路由编号,主备要一致
    priority 100  #定义优先级,数字越大,优先级越高,主DR必须大于备用DR   
    advert_int 1  #检查间隔,默认为1s
    authentication { 
        auth_type PASS 
        auth_pass 1111 
    } 
    virtual_ipaddress { 
        10.10.10.22  #定义虚拟IP(VIP)为10.10.10.22,可多设,每行一个
    } 

# 定义对外提供服务的LVS的VIP以及port
virtual_server 10.10.10.22 80 { 
    delay_loop 6 # 设置健康检查时间,单位是秒                   
    lb_algo wrr # 设置负载调度的算法为wlc                 
    lb_kind DR # 设置LVS实现负载的机制,有NAT、TUN、DR三个模式 
    nat_mask 255.255.255.0               
    persistence_timeout 0         
    protocol TCP                 
    real_server 10.10.10.31 80 {  # 指定real server1的IP地址
        weight 3  # 配置节点权值,数字越大权重越高             
        TCP_CHECK { 
        connect_timeout 10       
        nb_get_retry 3 
        delay_before_retry 3 
        connect_port 80 
        } 
    } 
    real_server 10.10.10.32 80 {  # 指定real server2的IP地址
        weight 3  # 配置节点权值,数字越大权重越高 
        TCP_CHECK { 
        connect_timeout 10 
        nb_get_retry 3 
        delay_before_retry 3 
        connect_port 80 
        } 
    } 
}
 
启动keepalived服务
systemctl start keepalived

三、设置实际服务器的网卡

ifconfig lo:0 10.10.10.22 netmask 255.255.255.255 #即设置虚拟IP地址,该IP地址绑定在环回网卡上,不会对外暴露

四、设置实际服务器的内核参数

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/a5681033d8ea9b4538943a57912babef.html