突破LVS瓶颈,LVS Cluster部署(OSPF + LVS)

前言

LVS 大家应该很熟悉,这款优秀的开源软件基本成为了 IP 负载均衡的代言词。但在实际的生产环境中会发现,LVS 调度在大压力下很容易就产生瓶颈,其中瓶颈包括 ipvs 内核模块的限制,CPU 软中断,网卡性能等,当然这些都是可以调优的,关于 LVS 的调优,会在这里详细讲 LVS 调优攻略 。回到主题,那当无法避免的单台 LVS 调度机出现了性能瓶颈,有什么办法呢?在本文就来介绍如何横向扩展 LVS 调度机

架构简图

Lvs_Cluster_new1

如上图三层设备的路由表,VIP 地址 1.1.1.1 对应 nexthop 有三个地址,这三个地址是三台 lvs 调度机的地址。这样便可达到效果:用户访问 ------>VIP------> 三台 LVS 调度机 ------> 分发到多台 RealServe

架构优势

1.LVS 调度机自由伸缩,横向扩展(最大 8 台,受限于三层设备允许的等价路由数目)

2.LVS 调度资源全利用,All Active。不存在备份机

部署方法

1. 硬件资源准备

三层设备: 本文用的是 h3c 5800 三层交换机

LVS 调度机三台: 192.168.0.2 192.168.2.2 192.168.3.2

Realserver 三台:  1.1.1.100 1.1.1.101 1.1.1.102

2. 三层设备 OSPF 配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#查找与三层交换与lvs调度相连的端口,在本文端口分别为 g1/0/2 g1/0/3 g1/0/6
 
#把g1/0/2改为三层端口,并配上IP
 
interface GigabitEthernet1/0/2
port link-mode route
ip address 192.168.0.1 255.255.255.0
 
#配置ospf的参数, timer hello是发送hello包的间隔,timer dead是存活的死亡时间。默认是10,40。
 
#hello包是ospf里面维持邻居关系的报文,这里配置是每秒发送一个,当到4秒还没有收到这个报文,就会认为这个邻居已经丢失,需要修改路由
ospf timer hello 1
ospf timer dead 4
ospf dr-priority 100
 
#如此类推,把g1/0/3 g1/0/6都配置上
 
interface GigabitEthernet1/0/3
port link-mode route
ip address 192.168.3.1 255.255.255.0
 
ospf timer hello 1
ospf timer dead 4
ospf dr-priority 99
 
 
 
interface GigabitEthernet1/0/6
port link-mode route
ip address 192.168.2.1 255.255.255.0
 
ospf timer hello 1
ospf timer dead 4
ospf dr-priority 98
 
 
 
#配置ospf
ospf 1
area 0.0.0.0
network 192.168.0.0 0.0.0.255
network 192.168.3.0 0.0.0.255
network 192.168.2.0 0.0.0.255

3.LVS 调度机的 OSPF 配置

a. 安装软路由软件 quagga

1
yum –y install quagga

b. 配置 zerba.conf

vim /etc/quagga/zebra.conf

1
2
3
4
5
6
hostname lvs-route-1
password xxxxxx
enable password xxxxxx
 
log file /var/log/zebra.log
service password-encryption

c. 配置 ospfd.conf

vim /etc/quagga/ospfd.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#ospf的配置类似于上面三层设备,注意需要把vip声明出去(1.1.1.1)
 
log file /var/log/ospf.log
log stdout
log syslog
interface eth0
ip ospf hello-interval 1
ip ospf dead-interval 4
router ospf
ospf router-id 192.168.0.1
log-adjacency-changes
auto-cost reference-bandwidth 1000
network 1.1.1.1/32 area 0.0.0.0
network 192.168.0.0/24 area 0.0.0.0

d. 开启 IP 转发

1
2
3
sed –i ‘/net.ipv4.ip_forward/d/etc/sysctl.conf
 
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.confsysctl –p

e. 开启服务

1
2
3
4
5
6
7
/etc/init.d/zebra start
 
/etc/init.d/ospfd start
 
chkconfig zebra on
 
chkconfig ospfd on

4.LVS keepalived 配置

在此架构下,LVS 只能配置成 DR 模式。如果要配置成 NAT 模式,我的想法是,需要参照上面的方式让 LVS 调度机与内网三层设备配置 ospf,此方法未验证,有其他方案请告知。

a. 修改配置文件 keepalived.conf ,在 Cluster 架构中,所有调度机用相同的配置文件

vim /etc/keepalived/keepalived.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#keepalived的全局配置global_defs { 
   notification_email {
 
   lxcong@gmail.com
   }
   notification_email_from lvs_notice@gmail.com
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id Ospf_LVS_1
}
 
#VRRP实例,在这个架构下所有的LVS调度机都配置成MASTER
 
vrrp_instance LVS_Cluster{  ##创建实例 实例名为LVS_Cluster
 
    state MASTER #备份服务器上将MASTER改为BACKUP  
    interface eth0    ##VIP 捆绑网卡
    virtual_router_id 100   ##LVS_ID  在同一个网络中,LVS_ID是唯一的
    priority 100    #选举的优先级,优先级大的为MASTER  备份服务上将100改为99
    advert_int 1  #发送vrrp的检查报文的间隔,单位秒
    authentication {  ##认证信息。可以是PASS或者AH
        auth_type PASS 
        auth_pass 08856CD8
    }
    virtual_ipaddress {
        1.1.1.1
    }
}
 
#LVS实例,在本文采用的是DR模式,WRR调度方式。其实在这种架构下也只能使用DR模式
 
virtual_server 1.1.1.1 80 {
    delay_loop 6
    lb_algo wrr
    lb_kind DR
    persistence_timeout 60
    protocol TCP
 
real_server 1.1.1.100 80 {
    weight 1                                           # 权重
    inhibit_on_failure                               # 若此节点故障,则将权重设为零(默认是从列表中移除)
    TCP_CHECK {
        connect_timeout 3
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
    }
 
}
 
real_server 1.1.1.101 80 {
    weight 1                                           # 权重
    inhibit_on_failure                               # 若此节点故障,则将权重设为零(默认是从列表中移除)
    TCP_CHECK {
        connect_timeout 3
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
    }
 
}
 
real_server 1.1.1.102 80 {
    weight 1                                           # 权重
    inhibit_on_failure                               # 若此节点故障,则将权重设为零(默认是从列表中移除)
    TCP_CHECK {
        connect_timeout 3
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
    }
 
}
 
}

 

b. 启动 keepalived

1
2
3
/etc/init.d/keepalived start
 
chkconfig keepalived on

5.realserver 配置

a. 添加启动服务脚本 /etc/init.d/lvs_realserver

请自行按需要修改脚本中 SNS_VIP 变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#!/bin/sh
### BEGIN INIT INFO
# Provides: lvs_realserver
# Default-Start:  3 4 5
# Default-Stop: 0 1 6
# Short-Description: LVS real_server service scripts
# Description: LVS real_server start and stop controller
### END INIT INFO
#  Copyright 2013 lxcong
#
#  chkconfig: - 20 80
#
#  Author:  xxxx@xxxx
 
#有多个虚拟IP,以空格分隔
SNS_VIP="1.1.1.1"
. /etc/rc.d/init.d/functions
if [[ -z "$SNS_VIP"  ]];then
    echo 'Please set vips in '$0' with SNS_VIP!'
fi
 
start(){
num=0
for loop in $SNS_VIP
do
    /sbin/ifconfig lo:$num $loop netmask 255.255.255.255 broadcast $loop
    /sbin/route add -host $loop dev lo:$num
    ((num++))
done
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
sysctl -e -p >/dev/null 2>&1
}
 
stop(){
num=0
for loop in $WEB_VIP
do
    /sbin/ifconfig lo:$num down
    /sbin/route del -host $loop >/dev/null 2>&1
    ((num++))
done
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
sysctl -e -p >/dev/null 2>&1
}
 
case "$1" in
    start)
        start
        echo "RealServer Start OK"
        ;;
    stop)
        stop
        echo "RealServer Stoped"
        ;;
    restart)
        stop
        start
        ;;
    *)
         echo "Usage: $0 {start|stop|restart}"
         exit 1
esac
exit 0

b. 启动服务

1
2
service lvs_realserver start
chkconfig lvs_realserver on

总结

到这里,LVS Cluster 架构已部署完了

posted @   疯狂搬砖  阅读(406)  评论(3编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
点击右上角即可分享
微信分享提示