lvs+keepalived+httpd构建高可用负载均衡集群

前言介绍:负载均衡集群是 load balance 集群的简写,翻译成中文就是负载均衡集群。常用的负载均衡开源软件有nginx、lvs、haproxy,商业的硬件负载均衡设备F5、Netscale。这里主要是学习 LVS 并对其进行了详细的总结记录

LB集群的架构和原理很简单,就是当用户的请求过来时,会直接分发到Director Server上,然后它把用户的请求根据设置好的调度算法,智能均衡地分发到后端真正服务器(real server)上。为了避免不同机器上用户请求得到的数据不一样,需要用到了共享存储,这样保证所有用户请求的数据是一样的。

LVS原理

1. 当用户向负载均衡调度器(Director Server)发起请求,调度器将请求发往至内核空间
2. PREROUTING链首先会接收到用户请求,判断目标IP确定是本机IP,将数据包发往INPUT链
3. IPVS是工作在INPUT链上的,当用户请求到达INPUT时,IPVS会将用户请求和自己已定义好的集群服务进行比对,如果用户请求的就是定义的集群服务,那么此时IPVS会强行修改数据包里的目标IP地址及端口,并将新的数据包发往POSTROUTING链
4. POSTROUTING链接收数据包后发现目标IP地址刚好是自己的后端服务器,那么此时通过选路,将数据包最终发送给后端的服务器

LVS组成

LVS 由2部分程序组成,包括 ipvs 和 ipvsadm。

1.ipvs(ip virtual server):一段代码工作在内核空间,叫ipvs,是真正生效实现调度的代码。
2. ipvsadm:另外一段是工作在用户空间,叫ipvsadm,负责为ipvs内核框架编写规则,定义谁是集群服务,而谁是后端真实的服务器(Real Server)

LVS相关术语:

1. DS:Director Server。指的是前端负载均衡器节点。
2. RS:Real Server。后端真实的工作服务器。
3. VIP:向外部直接面向用户请求,作为用户请求的目标的IP地址。
4. DIP:Director Server IP,主要用于和内部主机通讯的IP地址。
5. RIP:Real Server IP,后端服务器的IP地址。
6. CIP:Client IP,访问客户端的IP地址。

lvs三种工作模式和8中调度算法

(3钟模式):Tun NAT DR

(8中算法):轮叫调度 rr;加权轮叫 wrr;最少链接 lc;加权最少链接 wlc;基于局部性的最少连接调度算法 lblc;复杂的基于局部性最少的连接算法 lblcr;目标地址散列调度算法 dh;源地址散列调度算法 sh;

最常用:RR  WLC 

RR:这种算法是最简单的,就是按依次循环的方式将请求调度到不同的服务器上,该算法最大的特点就是简单。轮询算法假设所有的服务器处理请求的能力都是一样的,调度器会将所有的请求平均分配给每个真实服务器,不管后端 RS 配置和处理能力,非常均衡地分发下去。

WLC:这个算法会根据后端 RS 的连接数来决定把请求分发给谁,比如 RS1 连接数比 RS2 连接数少,那么请求就优先发给 RS1

这个算法比 lc 多了一个权重的概念。(LVS具体介绍看连接:

https://blog.csdn.net/Ki8Qzvka6Gz4n450m/article/details/79119665)

 

本文介绍DR模型:

1、实验环境

4台节点

 

  • Keepalived1 + lvs1(Director1):192.168.163.135

  • Keepalived2 + lvs2(Director2):192.168.163.136

  • Real server1:192.168.163.140

  • Real server2:192.168.163.141

  • VIP:192.168.163.88

一.安装LVS

1:下载RPM软件包 http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.26-1.src.rpm

2:安装 rpm -ivh ipvsadm-1.26-1.src.rpm 包

3:yum install ipvsadm 安装软件

4:执行  ipvsadm   看是否有下面输出说明安装成功

5:执行命令 lsmod|grep ip_vs 检查当前加载的内核模块,看是否存在 ip_vs 模块

注 1、只有执行 ipvsadm 以后,才会在内核加载 ip_vs 模块

修改系统参数vi /etc/sysctl.conf 修改:

net.ipv4.ip_forward = 1 #原来是0,需要改成1,启用路由转发功能

net.ipv4.conf.all.send_redirects = 0 #新增,为了避免网络内的ARP解析出现异常,应该关闭linux内核的ICMP重定向参数响应。 net.ipv4.conf.default.send_redirects = 0 #新增

net.ipv4.conf.eth0.send_redirects = 0 #新增,如果有多个网卡启用,都需关闭

使用 sysctl -p 命令使上述参数设置立即生效

LVS调优

增大LVS并发连接量 在/etc/modprobe.d/目录下添加文件ip_vs.conf,内容为: options ip_vs conn_tab_bits=20

然后在命令行里输入以下命令即生效: modprobe -r ip_vs service ipvsadm restart

通过ipvsadm -Ln 查看得知(size = 4096 )变成 (size = 1048576)

二。安装Keepalived(主备都要安装)

1.安装环境: yum install kernel-devel kernel-headers openssl-devel openssl popt popt-devel gcc gcc-c++ -y

2.下载安装keepalived-*.tar.gz(官网地址:http://www.keepalived.org/download.html,主备都要安装)

可直接YUM 安装。

查看LVS调度状态及各服务器接收请求数:ipvsadm -Ln查看

查看Keepalived状态,可以通过查看主备系统日志/var/log/messages

三:LVS服务端:LVS+KEEPALIVED 结合使用的:直接在配置文件配置就行了:

主服务器:

[root@node03 keepalived]# cat keepalived.conf
! Configuration: command not found
global_defs {  
   notification_email {  
     root@localhost  
   }  
   notification_email_from root@localhost  
   smtp_server localhost  
   smtp_connect_timeout 30  
   router_id  NodeA  

 
 
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.163.88
    }
}
 
virtual_server 192.168.163.88 80 { 
   delay_loop 6                  
   lb_algo rr                     
   lb_kind DR                     
   nat_mask 255.255.255.0           
   persistence_timeout 0           
   protocol TCP                    
   real_server 192.168.163.143 80 {   
       weight 1                      
        HTTP_GET {
            url { 
              path /index.jsp
              digest d56cb3910a67c34951a4341aea30ecda
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }       
   }
   real_server 192.168.163.140 80 {    
       weight 1
        HTTP_GET {
            url { 
              path /index.jsp
              digest d56cb3910a67c34951a4341aea30ecda
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }        
   }
}

备服务器:

[root@node04 keepalived]# cat keepalived.conf 
! Configuration File for keepalived
 
global_defs {  
   notification_email {  
     root@localhost  
   }  
   notification_email_from root@localhost  
   smtp_server localhost  
   smtp_connect_timeout 30  
   router_id  NodeA  

 
 
vrrp_instance VI_1 {
    state backup
    interface eth0
    virtual_router_id 51
    priority 96
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.163.88
    }
}
 
virtual_server 192.168.163.88 80 { 
   delay_loop 6                  
   lb_algo rr                     
   lb_kind DR                     
   nat_mask 255.255.255.0           
   persistence_timeout 0           
   protocol TCP                    
   real_server 192.168.163.143 80 {   
       weight 1                      
        HTTP_GET {
            url { 
              path /index.jsp
              digest d56cb3910a67c34951a4341aea30ecda
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }       
   }
   real_server 192.168.163.140 80 {    
       weight 1
        HTTP_GET {
            url { 
              path /index.jsp
              digest d56cb3910a67c34951a4341aea30ecda
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }        
   }
}

配置文件解析

vrrp_instance VI_1 :定义名

virtual_server 192.168.163.88 80   : 这里配置虚拟服务器 (192.168.163.88 为虚拟IP, 监听80端口)客户端就访问这个地址。

delay_loop :健康检查时间间隔,单位是秒。

lb_algo :负载均衡调度算法,互联网应用常使用 wlc 或 rr。

lb_kind :负载均衡转发规则。一般包括 DR,NAT,TUN3 种,在我的方案中,都使用DR 的方式。

persistence_timeout. :会话保持时间,单位是秒。这个会话是网络7层传输协议中的(第三层)会话。比如我们把它设置为60,那么客户端60秒内访问LVS虚拟服务器的请求都会被转到到同1个后台服务器节点。如果设置为0,那么每次请求都会根据配置的调度情况进行分发。

转发协议 protocol. 一般有 tcp 和 udp 两种。实话说,我还没尝试过 udp 协议类的转发。

real_server 192.168.163.140 80  : 这里配置真实服务器的地址与端口。

weight 1  :权重,不解释了。一般都是机器性能好的高一些,低的小一些。

HTTP_GET:配置健康检查

url { 
        path /index.jsp  健康检查的页面
        digest 625eddd79c61cf84c71c0c17448f8093  根据页面计算出的MD5的值,这个值一定不能随便写,不然keepliv
}

下面说一下如何计算digest 

我的keepalived的安装目录在 /usr/local/keepalive/

进入到/usr/bin/

./genhash -s 192.168.1.107 -p 8080 -u /index.jsp

通过上诉命令计算digest  然后写到配置文件上就可以了。
connect_timeout 5   :连接超时时间
nb_get_retry 3        :重连次数
delay_before_retry 3  :重连间隔时间
connect_port 8080        :检测端口

keepalived的2个节点执行如下命令,开启转发功能

# echo 1 > /proc/sys/net/ipv4/ip_forward

两台rs:

[root@node02 keepalived]# cat lvs_br_rs.sh 
#!/bin/bash

ipv=/sbin/ipvsadm

vip=192.168.163.88
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

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

两节点启动httpd服务:systemctl start httpd

验证

访问http://192.168.163.88:80   

1.关闭主keeplived服务,自动切换,依旧访问。

2关闭140的httpd服务,依旧访问143的服务。

3.根据RR算法,1:1访问后端服务。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(Linux)