LVS负载均衡DR模型单机以及高可用实践

一:部署DR模式单机
主机分布:
192.128.232.12 LVS01
192.128.232.13 RS01
192.128.232.15 RS02
192.128.232.16 VIP

1、负载均衡集群类型
负载均衡技术类型:基于 4 层负载均衡技术、基于 7 层负载均衡技术
负载均衡实现方式:硬件负载均衡设备、软件负载均衡
硬件负载均衡产品:F5 、深信服 、Radware
软件负载均衡产品: LVS(Linux Virtual Server)、 Haproxy、Nginx、Ats(apache traffic server)

2、LVS 就是一个四层(传输层)负载均衡器,支持 TCP/UDP 的负载均衡
三层结构:负载调度器、服务器池、共享存储。
架构对象:
  VS:Virtual Server,也称为 Director,负载均衡服务器
  RS:Real Server,真正的服务器,集群中各节点
  VIP:Director 向外部提供服务的 IP
  DIP:Director 向内部与 RS 通信的 IP
  RIP:真实服务器的 IP
  CIP:客户端的 IP

3、LVS四种工作模式
LVS-NAT(NAT模式)
原理:
   客户端发送请求数据包到负载均衡器(CIP->VIP),负载均衡器改装数据包发送到服务器(CIP->RIP),
服务端处理后返回数据包给负载均衡器(RIP->CIP),负载均器再进行数据包改装后返回给客户端(VIP->CIP),
完成负载,该种模式无论流量进来还是出去都要经过负载均衡器。

LVS-DR(直接路由模式)
原理:
  DR模式的实现需要RS绑定LVS的vip,且保证该vip只是单个RS内部可见,对外不可见。一个请求打到负载均衡器(CIP->VIP),
LVS 只需要将网络帧的 MAC 地址修改为某一台 RS 的 MAC,然后把该包转发到相应的RS处理,RS收到LVS转发过来的包,链路层
发现MAC是自己的,到网络层,发现IP也是自己的(事先关联的LVS的ip),于是包被合法接收,响应时RS则直接向客户端返回,不再经过LVS。
DR模式流量不再经过lvs,且返回可以直接返回给客户端,只需要经过lvs一次,因此DR模式是性能最好的一种模式。

4、LVS 负载均衡算法

静态负载均衡
   rr(round robin,轮询 )
   wrr(weight round robin,加权轮询)
   sh(source hashing,源地址 HASH)
   dh(destination hashing,目标地址 HASH)

动态负载均衡
lc(leash-connection,最少连接 )
简单算法:active * 256 + inactive (谁的小选谁)

wlc(加权最少连接)
简单算法:(active * 256 + inactive) / weight(谁的小选谁)

sed(最少期望延迟)
简单算法:(active + 1) * 256 / weight (谁的小选谁)

nq(never queue,永不排队)
LBLC(基于局部性的最少连接 )
LBLCR(基于局部性的带复制功能的最少连接)

6.部署DR模式,LVS节点
[root@lvs01 ~]# vi /etc/sysctl.conf 
net.ipv4.ip_forward = 1
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.lo.send_redirects = 0
net.ipv4.conf.eth0.send_redirects = 0

[root@lvs01 ~]# sysctl -p


7. 配置lvs负载均衡器vip网络子接口(lvs01),要跟lvs主机的ip同一个网段,
  也可以写个网卡配置文件,这样就不会因为机器重启,而vip不见了
[root@lvs01 ~]# ifconfig eth0:0 192.128.232.16/24 

# 配置lvs的转发策略
# 安装ipvsadm
[root@lvs01 ~]# yum -y install ipvsadm

# 配置LVS入口规则(采用轮询机制 rr ),IP为新创建的 eth0:0 对应ip
[root@lvs01 ~]# ipvsadm -A -t 192.128.232.16:80 -s rr

#配置出口规则(192.128.232.13,192.128.232.15 分别是RS01、RS02的ip,-w 表示权重为1, -g 表示DR模式)
[root@lvs01 ~]# ipvsadm -a  -t 192.128.232.16:80  -r  192.128.232.13:80 -g -w 1
[root@lvs01 ~]# ipvsadm -a  -t 192.128.232.16:80  -r  192.128.232.15:80 -g -w 1

#保存ipvs的策略配置
[root@lvs01 ~]# ipvsadm-save > /etc/sysconfig/ipvsadm

#验证策略
[root@lvs01 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.128.232.16:80 rr
  -> 192.128.232.13:80            Route   1      0          0         
  -> 192.128.232.15:80            Route   1      0          0         
  
8.在RS两台主机上
# 修改arp协议(arp_ignore、arp_announce)
[root@RS01 ~]# echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore 
[root@RS01 ~]# echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce 
[root@RS01 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore 
[root@RS01 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce 

# 设置隐藏vip(RS01\RS02)
[root@RS01 ~]# ifconfig lo:0 192.128.232.16 netmask 255.255.255.255

9.两台RS01、RS02安装httpd
# RS01
[root@RS01 ~]# yum -y install httpd
[root@RS01 ~]# echo "web1:192.128.232.13" > /var/www/html/index.html 

# RS02
[root@RS02 ~]# yum -y install httpd
[root@RS02 ~]# echo "web2:192.128.232.15" > /var/www/html/index.html 

# 两台RS01、RS02启动httpd服务
[root@RS01 ~]# systemctl restart httpd
[root@RS01 ~]# systemctl enable httpd

10.在192.128.232.11主机上测试
[root@master01 nginx-1.20.2]# elinks --dump http://192.128.232.16
   web2:192.128.232.15
[root@master01 nginx-1.20.2]# elinks --dump http://192.128.232.16
   web1:192.128.232.13
[root@master01 nginx-1.20.2]# elinks --dump http://192.128.232.16
   web2:192.128.232.15
[root@master01 nginx-1.20.2]# elinks --dump http://192.128.232.16
   web1:192.128.232.13
[root@master01 nginx-1.20.2]# elinks --dump http://192.128.232.16
   web2:192.128.232.15

11.查看LVS,
[root@master02 ~]# ipvsadm -Lnc
IPVS connection entries
pro expire state       source             virtual            destination
TCP 01:56  FIN_WAIT    192.128.232.11:56218 192.128.232.16:80  192.128.232.13:80
TCP 01:53  FIN_WAIT    192.128.232.11:56210 192.128.232.16:80  192.128.232.13:80
TCP 01:55  FIN_WAIT    192.128.232.11:56214 192.128.232.16:80  192.128.232.13:80
TCP 01:57  FIN_WAIT    192.128.232.11:56220 192.128.232.16:80  192.128.232.15:80
TCP 01:03  FIN_WAIT    192.128.232.11:56208 192.128.232.16:80  192.128.232.15:80
TCP 01:02  FIN_WAIT    192.128.232.11:56206 192.128.232.16:80  192.128.232.13:80

注解:
source: 客户端ip
virtual: vip
destination:RS服务器ip

二:keepalived的部署高可用
主机分布:
192.128.232.11 LVS01,nginx
192.128.232.12 LVS02,nginx
192.128.232.13 RS01,httpd
192.128.232.15 RS02,httpd
192.128.232.16 VIP

1.操作步骤
1. 二台LVS主机都安装keepalived,nginx

[root@localhost ~]# yum -y install keepalived ipvsadm nginx

[root@localhost ~]# vi /etc/sysctl.conf 
net.ipv4.ip_forward = 1
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.lo.send_redirects = 0
net.ipv4.conf.eth0.send_redirects = 0

[root@localhost ~]# sysctl -p

2. 监控业务脚本进行判断,迁移vip,
###本测试以nginx服务的80端口作为测试触发判断
[root@localhost ~]# cat /etc/keepalived/check_port.sh 
#!/bin/bash
#使用方法:
#在keepalived的配置文件中
#vrrp_script check_port {#创建一个vrrp_script脚本,检查配置
#    script "/etc/keepalived/check_port.sh 80" #配置监听的端口
#    interval 2 #检查脚本的频率,单位(秒)
#}
CHK_PORT=$1
if [ -n "$CHK_PORT" ];then
         PORT_PROCESS=`ss -lnt|awk -F':' '{print $2}'|awk '{print $1}'|grep "^$CHK_PORT$"|wc -l`
        echo $PORT_PROCESS
        if [ $PORT_PROCESS -eq 0 ];then
                echo "Port $CHK_PORT Is Not Used,End."
                systemctl stop keepalived 
        fi
else
        echo "Check Port Cant Be Empty!"
fi

[root@localhost ~]# chmod +x /etc/keepalived/check_port.sh

3.keepalived配置文件
a. 主机192.128.232.11的配置
[root@localhost ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
   router_id 192.128.232.11    #主从节点要不一样,路由id。表示自己是这个组唯一标识。
}
vrrp_script chk_nginx {
    script "/etc/keepalived/check_port.sh 80"
    interval 2
    weight -20
}
vrrp_instance VI_1 {    #组播的组名,主从一定要一样,表示同一个组。
    state MASTER    # 设置当前节点为master。
    interface eth0      #对应主机的网卡名称
    virtual_router_id 251   #id号要一致
    priority 100
    advert_int 1
    nopreempt     #当优先级高的主机宕机后,再次恢复时,不会抢夺vip,防止业务频繁切换。
    unicast_peer {        #写上其他安装keepalived主机的ip
        192.128.232.12
    }
    authentication {
        auth_type PASS
        auth_pass 11111111
    }
    track_script {
         chk_nginx
    }
    virtual_ipaddress {
        192.128.232.16   #vip
    }
}

b. 主机192.128.232.12的配置
[root@localhost ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
   router_id 192.128.232.12
}
vrrp_script chk_nginx {
    script "/etc/keepalived/check_port.sh 80"
    interval 2
    weight -20
}
vrrp_instance VI_1 {
    state BACKUP   #设置当前节点为backup。
    interface eth0
    virtual_router_id 251
    priority 95
    advert_int 1
    nopreempt
    unicast_peer {
        192.128.232.11
    }
    authentication {
        auth_type PASS
        auth_pass 11111111
    }
    track_script {
         chk_nginx
    }
    virtual_ipaddress {
        192.128.232.16
    }
}

4.两台lvs机器启动顺序,先启nginx,后启keepalived服务
[root@localhost ~]# systemctl start nginx
[root@localhost ~]# systemctl enable nginx
[root@localhost ~]# systemctl start keepalived
[root@localhost ~]# systemctl enable keepalived

5.两台lvs主机配置nginx转发
server支持的parameters如下:
  weight=number 
    设置权重,默认为1。
  max_conns=number 
    给当前server设置最大活动链接数,默认为0表示没有限制。
  max_fails=number 
    对后端服务器连续监测失败多少次就标记为不可用。
  fail_timeout=time 
    在经历了max_fails次后端服务器检测失败后,暂停服务的时间,默认为10秒。
        max_fails可以和fail_timeout一起使用。
  backup 
    设置为备份服务器,当所有服务器不可用时将重新启用次服务器。
  down 
    表示当前的server暂时不参与负载均衡。
  resolve 
    当server定义的是主机名的时候,当A记录发生变化会自动应用新IP而不用重启Nginx。
  hash KEY consistent;
    基于指定key做hash计算,使用consistent参数,将使用ketama一致性hash算法,适用于后端是Cache服务器(如varnish)时使用,consistent定义使用一致性hash运算,一致性hash基于取模运算。所谓取模运算,就是计算两个数相除之后的余数,比如10%7=3, 7%4=3
  hash $request_uri consistent; 
    基于用户请求的uri做hash
  ip_hash;
    源地址hash调度方法,基于的客户端的remote_addr(源地址)做hash计算,以实现会话保持。
        当IP进行重复访问时会被指定到上次访问的服务器,可以解决动态网站session共享问题
  least_conn;
    最少连接调度算法,优先将客户端请求调度到当前连接最少的后端服务器。    
   keepalive:
        限制空闲长连接的最大数量。
   keepalive_timeout:
        空闲长连接的最长保持时间。
   keepalive_requests:
        每个长连接最多可以处理的请求数。
        
### 配置nginx的upstream
upstream负载均衡算法
 
a.轮询算法(默认算法):
    每个请求依次会分配给后端不同的应用程序服务器,不理会后端服务器的时机压力。
b.加权负载均衡:
    权重越大的服务器,被分配到的次数就会越多,通常用于后端服务器性能不一致的情况.
c.IP_HASH:
    当IP进行重复访问时会被指定到上次访问的服务器,可以解决动态网站session共享问题.
d.基于URL的HASH :
    当客户端多次访问同一个地址时分配到固定的节点.
e.最少连接数轮询:
    哪个节点当前的连接数少就分配给哪个节点处理.

5.配置LVS转发两台RS主机。
[root@master01 conf.d]# vi /etc/nginx/conf.d/httpd_html.conf
upstream httpd_pools {
    ip_hash;  #指定算法,默认是轮询
    server 192.128.232.13:80 weight=1 max_fails=1 fail_timeout=10s;
    server 192.128.232.15:80 weight=5 max_fails=2 fail_timeout=20s backup;
    #server 192.128.232.13:80 wetight=10 max_fails=2 fail_timeout=20s down;
}

#匹配下面这个lotion区域,
location / {    
    proxy_set_header Host $host; 
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_read_timeout 86400;
    proxy_pass http://httpd_pools;
}

[root@localhost ~]# systemctl restart nginx

#注解:
#只要用户在浏览器中访问的域名绑定了 VIP VIP 下面有RS;则就用$host ;host是访问URL中的域名和端口  www.taobao.com:80
proxy_set_header Host $host; 

#把源IP 【$remote_addr,建立HTTP连接header里面的信息】赋值给X-Real-IP;这样在代码中 $X-Real-IP来获取 源IP
proxy_set_header X-Real-IP $remote_addr; 

#在nginx 作为代理服务器时,设置的IP列表,会把经过的机器ip,代理机器ip都记录下来,用 【,】隔开;代码中用 echo $x-forwarded-for |awk -F, '{print $1}' 来作为源IP 
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

6.配置http服务
# 修改arp协议(arp_ignore、arp_announce)
[root@RS01 ~]# echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore 
[root@RS01 ~]# echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce 
[root@RS01 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore 
[root@RS01 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce 

#两台RS01、RS02安装httpd
# RS01
[root@RS01 ~]# yum -y install httpd
[root@RS01 ~]# echo "web1:192.128.232.13" > /var/www/html/index.html 

# RS02
[root@RS02 ~]# yum -y install httpd
[root@RS02 ~]# echo "web2:192.128.232.15" > /var/www/html/index.html 

# 两台RS01、RS02启动httpd服务
[root@RS01 ~]# systemctl restart httpd
[root@RS01 ~]# systemctl enable httpd

7.找其他主机测试
[root@client ~]# elinks --dump http://192.128.232.16
   web2:192.128.232.15
[root@client ~]# elinks --dump http://192.128.232.16
   web1:192.128.232.13

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值