基于虚 IP 的分布式集群负载
前情提要
传统单机应用时代,为了保障服务的可用,因此产生了很多负载相关的技术,当然根据负载范围的不同,因此负载的应用侧重点也有差别,本文基于虚IP实现机器间的应用负载;
基于虚IP的负载应用范围很广,基本可以涵盖所有基于 IP 的应用;
LVS 简介
LVS 由两部分程序组成,包括 ipvs 和 ipvsadm :
1、 ipvs(ip virtual server):LVS 是基于内核态的 netfilter 框架实现的 IPVS 功能,工作在内核态。用户配置 VIP 等相关信息并传递到 IPVS 就需要用到 ipvsadm 工具。
2、 ipvsadm:ipvsadm 是 LVS 用户态的配套工具,可以实现 VIP 和 RS 的增删改查功能,是基于 netlink 或 raw socket 方式与内核 LVS 进行通信的,如果 LVS 类比于 netfilter,那 ipvsadm 就是类似 iptables 工具的地位。
应用领域:
-
主要用于多服务器的负载均衡,工作在网络层,可实现高性能,高可用的服务器集群技术;
-
稳定可靠&可扩展性好,即使在集群的服务器中某台服务器无法正常工作,也不影响整体效果;
-
廉价易用,可把许多低性能的服务器组合在一起形成一个超级服务器;
keepalived 简介
keepalived是一个类似于layer3, 4 & 5交换机制的软件,也就是我们平时说的第3层、第4层和第5层交换。Keepalived是自动完成,不需人工干涉。
应用领域: Keepalived的作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。
服务器网络配置
服务器A: 192.168.139.139
服务器B: 192.168.139.140
虚拟IP:192.168.139.9
a. 设置静态 IP
$vi /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
IPADDR=192.168.139.139 # 本机 IP
GATEWAY=192.168.139.2
NETMASK=255.255.255.0
DNS1=192.168.139.2
DNS2=192.168.139.1
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=a2687b07-c273-483f-8b9b-5349683c437f # 每个服务器都不一样
DEVICE=ens33
ONBOOT=yes
b. 开启 arp 转发规则
$vi /etc/sysctl.conf
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2
$sysctl -p
$systemctl restart NetworkManager
Web 服务配置
# 定义 web 页面
[root@139 ~]# echo "192.168.139.139" > /var/www/html/index.html
[root@140 ~]# echo "192.168.139.140" > /var/www/html/index.html
# 启动 web 服务
[root@139 ~]# systemctl start httpd;systemctl enable httpd
[root@140 ~]# systemctl start httpd;systemctl enable httpd
备注:由于web 测试,所以此次测试不占用 80 端口,通过 18080 进行服务访问;
vi /etc/httpd/conf/httpd.conf
# 更改监听端口
Listen 18080
路由转发
sed -i '/ip_forward/s/0/1/' sysctl.conf
sysctl -p
安装 Keepalived & ipvsadm
yum install -y keepalived && systemctl enable keepalived
yum install -y ipvsadm
负载调度
vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
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.139.9
}
}
virtual_server 192.168.0.9 18080 { //设置VIP为192.168.0.9
delay_loop 6
lb_algo wrr //设置LVS调度算法为RR
lb_kind DR //设置LVS的模式为DR
persistence_timeout 1
protocol TCP
real_server 192.168.139.139 18080 {
weight 1 //设置权重为1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.139.140 18080 {
weight 1 //设置权重为2
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
启动服务:
systemctl start keepalived
ipvsadm -Ln
访问测试
a. 场景一: 服务器A & 服务器B 均正常
b. 场景二: 服务器A 宕机 & 服务器B 正常
c. 场景三: 服务器B 宕机 & 服务器A 正常
总结
国庆节前,所有的负载均衡相关的技术都梳理了下,为什么要有那么多的负载的技术,我之前也想过干脆使用一种负载的技术直接涵盖全部的场景要多好有多好,可是实际的场景,做不到,对于技术的选择我们能做到的更像是一种管理学的手段,合理规划;技术没有银弹,或许未来计算机的技术架构发生了巨变,不然现有的技术,现有的场景就决定了这些技术存在的必然;技术无非就是一种手段,一种通过代码实现管理的实现,不涉及人心的复杂,会创造是一种能力,会运用也是一种很重要的能力,因为会创造的那些人都在被会运用的人进行管理和调度,这就是实实在在的现实;