突破LVS瓶颈,LVS Cluster部署(OSPF + LVS)
前言
LVS 大家应该很熟悉,这款优秀的开源软件基本成为了 IP 负载均衡的代言词。但在实际的生产环境中会发现,LVS 调度在大压力下很容易就产生瓶颈,其中瓶颈包括 ipvs 内核模块的限制,CPU 软中断,网卡性能等,当然这些都是可以调优的,关于 LVS 的调优,会在这里详细讲 LVS 调优攻略 。回到主题,那当无法避免的单台 LVS 调度机出现了性能瓶颈,有什么办法呢?在本文就来介绍如何横向扩展 LVS 调度机
架构简图
如上图三层设备的路由表,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 架构已部署完了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App