基于lvs+nginx+keepalived负载均衡

一、基于nginx实现方法
1.环境配置,关闭防
a.搭建3台虚拟机,分别192.168.100.130、192.168.100.131、192.168.100.132.
b.192.168.100.130作为负载调度服务器,192.168.100.131,192.168.100.132作为web1,web2服务器。
c.192.168.100.130安装nginx服务,配置upstream模块。web1和web2安装nginx或者tomcat,apache服务,web1和web2上先部署同一web页面,确定访问ok.

[root@master(192.168.100.130) conf.d]# curl http://192.168.100.131

slave1

[root@master(192.168.100.130) conf.d]# curl http://192.168.100.132

slave2

[root@master(192.168.100.130) conf.d]#

2.192.168.100.130上nginx.conf配置后重载。
upstream test {
server 192.168.100.131 weight=1 max_fails=2 fail_timeout=10s;
server 192.168.100.132 weight=2 max_fails=2 fail_timeout=10s;
}
server{
listen 80;
server_name 192.168.100.130;
access_log logs/upstream.log main;
location / {
#root /usr/local/openresty/nginx/html/test;
proxy_pass http://test;
index lvs.html;
proxy_set_header X-real-IP $remote_addr;
proxy_set_header Host $Host;
client_max_body_size 100m;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#proxy_set_header Server www.test.com;
}
}
3.测试负载均衡,按照2:1的权重调度。
[root@master(192.168.100.130) conf.d]# for times in {1…10};do curl 192.168.100.130;done;

slave2

slave2

slave2

slave1

slave2

slave2

slave1

slave2

slave2

slave1

[root@master(192.168.100.130) conf.d]# 二、lvs实现CIP <--> VIP == DIP <--> RIP 1.前期准备 a.搭建4台虚拟机。分别192.168.100.130(rs1)、192.168.100.131(lvs)、192.168.100.132(rs2)、 192.168.100.133(client)其中lvs部署ipvsadm程序包,负责调度,rs1,rs2安装nginx,client机器测试调度。 b.3台机器关闭防火墙。设置ipv4地址转发。(重启不生效) [root@slave1(192.168.100.131) home]# sysctl -w net.ipv4.ip_forward=1 net.ipv4.ip_forward = 1 [root@slave1(192.168.100.131) home]# sysctl -a | grep net.ipv4.ip_forward net.ipv4.ip_forward = 1 net.ipv4.ip_forward_use_pmtu = 0 [root@slave1(192.168.100.131) home]#

2、NAT模式实现.客户请求经由lvs的VIP到director,响应由RSX->director->VIP.
a.准备一个虚拟IP为VIP,192.168.100.200,和lvs,rs1,rs2,client不在同一网段也可以,rs1,rs2网关要指向192.168.100.131。
b.在lvs上添加调度规则。
]# ipvsadm -A -t 192.168.100.200 -s rr
]# ipvsadm -a -t 192.168.100.200:80 -r 192.168.100.130 -m -w 1
]# ipvsadm -a -t 192.168.100.200:80 -r 192.168.100.132 -m -w 2
c.在client上访问
[root@client home]# for times in {1…12}; do curl 192.168.100.200;done;

rs1,master,130

rs2,slave2,132

rs1,master,130

rs2,slave2,132

rs1,master,130

rs1,master,130

3.DR路由模式实现.客户请求经由lvs的director,但是响应直接由rs1响应client.
a.准备一个虚拟IP为VIP,192.168.100.200,和lvs,rs1,rs2,client同一网段(不在同一网段也可以,需要配置到client端的路由)
b.lvs,rs1,rs2上分别配置vip。lvs上vip配置在192.168.100.200的网卡上。rs1,rs2配置在lo网卡上。
c.rs1、rs2执行以下脚本,设置网卡响应和通过级别,VIP要配置在lo网卡上
#!/bin/bash

vip=‘192.168.100.200’
netmask=‘255.255.255.255’

case $1 in
start)
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/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

    ifconfig lo:0 $vip netmask $netmask broadcast $vip up
    route add -host $vip dev lo:0
    ;;

stop)
ifconfig lo:0 down

    echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
    echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
    echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
    echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
    ;;

*)
echo “Usage $(basename $0) start|stop”
exit 1
;;
esac
在这里插入图片描述
d.lvs上配置VIP,并添加调度规则,采用dr模式,wrr加权轮询
#!/bin/bash

vip=‘192.168.100.200’
iface=‘ens33:0’
mask=‘255.255.255.255’
port=‘80’
rs1=‘192.168.100.130’
rs2=‘192.168.100.132’
scheduler=‘wrr’
type=’-g’

case $1 in
start)
ifconfig $iface $vip netmask $mask broadcast $vip up
iptables -F

    ipvsadm -A -t $vip:$port -s $scheduler
    ipvsadm -a -t $vip:$port -r $rs1 $type -w 3
    ipvsadm -a -t $vip:$port -r $rs2 $type -w 2
    ;;

stop)
ipvsadm -C
ifconfig $iface down
;;
*)
echo “Usage $(basename $0) start|stop”
exit 1
;;
esac

在这里插入图片描述
e.client测试
[root@client home]# for times in {1…12}; do curl 192.168.100.200;done;

rs1,master,130

rs2,slave2,132

rs1,master,130

rs2,slave2,132

rs1,master,130

rs1,master,130

rs2,slave2,132

rs1,master,130

rs2,slave2,132

rs1,master,130

rs1,master,130

rs2,slave2,132

[root@client home]#

4.总结
a.nat模式:多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某挑出的RS的RIP和PORT实现转发;
(1)RIP和DIP必须在同一个IP网络,且应该使用私网地址;RS的网关要指向DIP;
(2)请求报文和响应报文都必须经由Director转发;Director易于成为系统瓶颈;
(3)支持端口映射,可修改请求报文的目标PORT;
(4)vs必须是Linux系统,rs可以是任意系统;
b.dr模式:
通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目标IP/PORT均保持不变;
Director和各RS都得配置使用VIP;
(1) 确保前端路由器将目标IP为VIP的请求报文发往Director:
(a) 在前端网关做静态绑定;
(b) 在RS上使用arptables;
© 在RS上修改内核参数以限制arp通告及应答级别;
arp_announce
arp_ignore
(2) RS的RIP可以使用私网地址,也可以是公网地址;RIP与DIP在同一IP网络;RIP的网关不能指向DIP,以确保响应报文不会经由Director;
(3) RS跟Director要在同一个物理网络;
(4) 请求报文要经由Director,但响应不能经由Director,而是由RS直接发往Client;
(5) 不支持端口映射;
三、keepalived
1.使用条件:
(1) 各节点时间必须同步;ntp, chrony
(2) 确保iptables及selinux不会成为阻碍;
(3) 各节点之间可通过主机名互相通信(对KA并非必须);
建议使用/etc/hosts文件实现;
(4) 确保各节点的用于集群服务的接口支持MULTICAST通信;
D类:224-239;
2.配置
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id lvs_master
vrrp_mcast_group4 224.0.0.18
}

vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.100.200/32 broadcast 192.168.100.200 dev ens33 label ens33:0
}
}

vrrp_instance VI_2 {
state BACKUP
interface ens33
virtual_router_id 52
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.100.201/32 broadcast 192.168.100.201 dev ens33 label ens33:1
}
}
virtual_server 192.168.100.200 80 {
delay_loop 1
lb_algo wrr
lb_kind DR
nat_mask 255.255.255.0

persistence_timeout 0

protocol TCP
sorry_server 127.0.0.1 80
real_server 192.168.100.130 80 {
    weight 2
    TCP_CHECK {
            connect_ip 192.168.100.130            
            connect_timeout 20     
            connect_port 80       
            nb_get_retry 3      
    }
}

		
real_server 192.168.100.132 80 {
    weight 1
    TCP_CHECK {
            connect_ip 192.168.100.132            
            connect_timeout 20     
            connect_port 80       
            nb_get_retry 3      
    }
}

}

virtual_server 192.168.100.201 80 {
delay_loop 1
lb_algo wrr
lb_kind DR
nat_mask 255.255.255.0

persistence_timeout 0

protocol TCP
sorry_server 127.0.0.1 80
real_server 192.168.100.130 80 {
    weight 1
    HTTP_GET {
        url {
          path /
          status_code 200
        }
        connect_timeout 3
        nb_get_retry 3
        delay_before_retry 3
}
    TCP_CHECK {
            connect_ip 192.168.100.130         
            connect_timeout 20     
            connect_port 80       
            nb_get_retry 3      
    }
}

		
real_server 192.168.100.132 80 {
    weight 2
    HTTP_GET {
        url {
          path /
          status_code 200
        }
        connect_timeout 3
        nb_get_retry 3
        delay_before_retry 3
}
 TCP_CHECK {
            connect_ip 192.168.100.132           
            connect_timeout 20     
            connect_port 80       
            nb_get_retry 3      
    }
}

}

3.启动、停止、查看
systemctl start|stop|status keepalived
4.测试
在这里插入图片描述
5.停止web1的nginx服务,请求如下
在这里插入图片描述
在这里插入图片描述
6.停止web2网卡,请求如下
在这里插入图片描述
7.停止lvs_master上keepalived,请求如下
在这里插入图片描述
在这里插入图片描述
8.2台web都停止
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值