管理集群工具之LVS

发布于:2024-04-28 ⋅ 阅读:(26) ⋅ 点赞:(0)

管理集群工具之LVS

集群概念

  • 将很多机器组织在一起,作为一个整体对外提供服务
  • 集群在扩展性、性能方面都可以做到很灵活
  • 集群分类
    • 负载均衡集群:Load Balance
    • 高可用集群:High Availability
    • 高性能计算:High Performance Computing

LVS

  • LVSLinux Virtual ServerLinux虚拟服务器
  • 实现负载均衡集群
  • 作者:章文嵩。国防科技大学读博士期间编写
  • LVS的工作模式
    • NAT:网络地址转换
    • DR:路由模式
    • TUN:隧道模式
  • 术语
    • 调度器:LVS服务器
    • 真实服务器:提供服务的服务器
    • VIP:虚拟地址,提供给用户访问的地址
    • DIR:指定地址,LVS服务器上与真实服务器通信的地址
    • RIP:真实地址,真实服务器的地址
  • 常见的调度算法,共10个,常用的有4个
    • 轮巡rr:真实服务器轮流提供服务(一共有两台服务器,第一个给A,第二个给B,第三个再给A…)
    • 加权轮巡wrr:根据服务器性能设置权重,权重大的服务器得到分配的请求就越多
    • 最少连接lc:根据真实服务器的连接数分配请求,优先分配连接少的
    • 加权最少连接wlc:类似wrr,根据权重分配请求
  • ipvsadm使用说明
    • -A:添加虚拟服务器
    • -E:编辑虚拟服务器
    • -D:删除虚拟服务器
    • -t:添加tcp服务器
    • -u:添加udp服务器
    • -s:指定调度算法。如轮巡rr、加权轮巡wrr、最小连接lc、加权最小连接wlc
    • -a:添加虚拟服务器后,向虚拟服务器中加入真实服务器
    • -r:指定真实服务器
    • -w:设置权重
    • -m:指定工作模式为NAT
    • -g:指定工作模式为DR

配置LVS NAT模式

  • NAT模式:通过lvs服务器来接收用户的请求,然后通过调度算法分配请求到真实服务器,然后真实服务器返回数据给lvs服务器,再有lvs服务器返回给用户

lvs-nat

  • clienteth0->192.168.88.10,gateway->192.168.88.5
  • lvseth0->192.168.88.5;eth1->192.168.99.5
  • web1eth0->192.168.99.100,gateway->192.168.99.5
  • web2eth0->192.168.99.200,gateway->192.168.99.5

环境准备

  • client
# 设置ip
nmcli connection modify eth0 ipv4.method manual ipv4.addresses 192.168.88.10/24 ipv4.gateway 192.168.88.5 connection.autoconnect yes

# 启动
nmcli connection up eth0
  • lvs
# 设置eth0的ip
nmcli connection modify eth0 ipv4.method manual ipv4.addresses 192.168.88.5/24 connection.autoconnect yes

# 启动
nmcli connection up eth0

# 设置eth1的ip
nmcli connection modify eth1 ipv4.method manual ipv4.addresses 192.168.99.5/24 connection.autoconnect yes

# 启动
nmcli connection up eth1

# 查看ip转发功能的内核参数
sysctl -a  # 这是查看所有的内核参数
sysctl -a | grep ip_forward
# net.ipv4.ip_forward = 0    # 1表示打开转发,0表示关闭转发

# 永久打开ip_forward功能,可以使client和web1、web2互通
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf 
sysctl -p
  • web1
# 设置ip
nmcli connection modify eth0 ipv4.method manual ipv4.addresses 192.168.99.100/24 ipv4.gateway 192.168.99.5 connection.autoconnect yes

# 启动
nmcli connection up eth0

# 安装httpd,并启动
yum install -y httpd
systemctl enable httpd --now
echo "web1" > /var/www/html/index.html
  • web2
# 设置ip
nmcli connection modify eth0 ipv4.method manual ipv4.addresses 192.168.99.200/24 ipv4.gateway 192.168.99.5 connection.autoconnect yes

# 启动
nmcli connection up eth0

# 安装httpd,并启动
yum install -y httpd
systemctl enable httpd --now
echo "web1" > /var/www/html/index.html

相关配置

  • lvs服务器
# 安装lvs
yum install -y ipvsadm

# 创建虚拟服务器,使用轮巡rr调度算法
ipvsadm -A -t 192.168.88.5:80 -s rr

# 添加RIP
ipvsadm -a -t 192.168.88.5:80 -r 192.168.99.100 -m
ipvsadm -a -t 192.168.88.5:80 -r 192.168.99.200 -m

# 查看配置
ipvsadm -Ln

# 此时使用client访问192.168.88.5:80,效果是web1:web2,比例是1:1

# 删除配置,使用加权轮巡wrr
ipvsadm -D -t 192.168.88.5:80 -s wrr
ipvsadm -a -t 192.168.88.5:80 -r 192.168.99.100 -w 1 -m
ipvsadm -a -t 192.168.88.5:80 -r 192.168.99.200 -w 2 -m

# 此时使用client访问192.168.88.5:80,效果是web1:web2,比例是1:2

配置LVS DR模式

  • DR模式相比于NAT模式,它不会因为lvs服务器的带宽而影响业务
  • DR模式:通过lvs服务器来接收请求,然后分配请求到真实服务器,然后通过真实服务器的虚拟网卡直接返回给用户

lvs-dr

  • clienteth0->192.168.88.10
  • lvseth0->192.168.88.5;eth0:0->192.168.88.15
  • web1eth0->192.168.88.100;lo:0->192.168.88.15/32
  • web2eth0->192.168.88.200;lo:0->192.168.88.15/32

环境准备

  • client相比与上一个实验无需操作
  • lvs
# 删除eth1网卡
nmcli connection delete eth1

# 修改eth0,将ipv6那部分都删除,不然配置eth0:0的时候会报错ipv6冲突
vim ifcfg-eth0
# 文件内容如下,#后面的不用加入
TYPE=Ethernet  # 以太网
BOOTPROTO=none  # dhcp/none/static,none和static代表静态配置
NAME=eth0  # 为设备重命名
DEVICE=eth0  # 网卡设备名
ONBOOT=yes  # 开机激活
IPADDR=192.168.88.5  # ip
PREFIX=24  # 子网掩码
GATEWAY=192.168.88.254  # 网关

# 重启网卡
ifdown eth0; ifup eth0

# 配置eth0:0,这里使用的是直接修改网卡配置文件的方法
cd /etc/sysconfig/network-scripts/
cp ifcfg-eth0 ifcfg-eth0:0
vim ifcfg-eth0:0
# 文件内容如下
TYPE=Ethernet
BOOTPROTO=none
NAME=eth0:0
DEVICE=eth0:0
ONBOOT=yes
IPADDR=192.168.88.15
PREFIX=24

# 重启网卡
ifdown eth0:0; ifup eth0:0

# 查看是否成功
ifconfig
  • web1
cd /etc/sysconfig/network-scripts/
# 修改eth0网络
vim ifcfg-eth0
# 文件内容如下
TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=192.168.88.200
PREFIX=24
GATEWAY=192.168.88.254

# 重启网卡(虚拟机情况下,修改完ip之后,记得修改一下网卡的连接,不然会连不上)
ifdown eth0; ifup eth0

# 添加lo:0网卡
cp ifcfg-eth0 ifcfg-lo:0
# 文件内容如下
TYPE=Ethernet
BOOTPROTO=none
NAME=lo:0
DEVICE=lo:0
ONBOOT=yes
IPADDR=192.168.88.15
PREFIX=32  # 这里掩码一定是32位,因为这个是一个虚拟地址

# 重启网卡
ifdown lo:0; ifup lo:0

# 查看是否生效
ifconfig

# 配置内核参数,使它不响应192.168.88.15的请求(这一步很重要)
vim /etc/sysctl.conf
# 文件内容
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 2

# 重新加载内核
sysctl -p
  • web2
cd /etc/sysconfig/network-scripts/
# 修改eth0网络
vim ifcfg-eth0
# 文件内容如下
TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=192.168.88.100
PREFIX=24
GATEWAY=192.168.88.254

# 重启网卡(虚拟机情况下,修改完ip之后,记得修改一下网卡的连接,不然会连不上)
ifdown eth0; ifup eth0

# 添加lo:0网卡
cp ifcfg-eth0 ifcfg-lo:0
# 文件内容如下
TYPE=Ethernet
BOOTPROTO=none
NAME=lo:0
DEVICE=lo:0
ONBOOT=yes
IPADDR=192.168.88.15
PREFIX=32  # 这里掩码一定是32位,因为这个是一个虚拟地址

# 重启网卡
ifdown lo:0; ifup lo:0

# 查看是否生效
ifconfig

# 配置内核参数,使它不响应192.168.88.15的请求(这一步很重要)
vim /etc/sysctl.conf
# 文件内容
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 2

# 重新加载内核
sysctl -p

相关配置

  • lvs服务器
# 清除之前的配置
ipvsadm -D -t 192.168.88.5:80

# 创建虚拟服务器,使用的调度算法是最少连接lc
ipvsadm -A -t 192.168.88.15:80 -s lc

# 向虚拟服务器中添加真实服务器(注意这里是-g,设置了权重是不影响的,因为使用的是lc,这里是为了下面演示修改虚拟服务器的调度算法)
ipvsadm -a -t 192.168.88.15:80 -r 192.168.88.100 -w 100 -g
ipvsadm -a -t 192.168.88.15:80 -r 192.168.88.200 -w 200 -g

# 此时使用client访问192.168.88.15:80,效果是web1:web2,比例是1:1

# 修改虚拟服务器的调度算法为wlc
ipvsadm -E -t 192.168.88.15:80 -s wlc

# 查看配置
ipvsadm -Ln

# 此时使用client访问192.168.88.15:80,效果是web1:web2,比例是1:2

配置Keepalived+LVS DR模式

  • keepalived用于实现高可用集群
  • 它的工作原理就是VRRP(虚拟冗余路由协议)
  • 可以实现lvs服务器自动切换,并且可以根据web服务器的工作情况自动添加和删除

keepalived-lvs

  • clienteth0->192.168.88.10
  • lvs集群,使用keepalived服务,配置虚拟ip192.168.88.15/24
    • lvs1eth0->192.168.88.5,Master
    • lvs2eth0->192.168.88.6,Backup
  • web集群,都配置lo:0为192.168.88.15/32
    • web1eth0->192.168.88.100
    • web2eth0->192.168.88.200

环境准备

  • client不做修改
  • lvs1
# 配置网络
nmcli connection modify eth0 ipv4.method manual ipv4.addresses 192.168.88.5/24 ipv4.gateway 192.168.88.254 autoconnect yes
nmcli connection up eth0

# 安装keepalived和ipvsadm
yum install -y keepalived ipvsadm
  • lvs2
# 配置网络
nmcli connection modify eth0 ipv4.method manual ipv4.addresses 192.168.88.6/24 ipv4.gateway 192.168.88.254 autoconnect yes
nmcli connection up eth0

# 安装keepalived和ipvsadm
yum install -y keepalived ipvsadm
  • web1web2跟上次实验操作一致,不需要额外操作

相关配置

  • lvs1
# 编辑keepalived配置文件
vim /etc/keepalived/keepalived.conf
# 修改内容如下
1 ! Configuration File for keepalived
2 
3 global_defs {
4    notification_email {
5      acassen@firewall.loc
6      failover@firewall.loc
7      sysadmin@firewall.loc
8    }
9    notification_email_from Alexandre.Cassen@firewall.loc
10    smtp_server 192.168.200.1
11    smtp_connect_timeout 30
12    router_id lvs1  # 唯一id
13    vrrp_iptables  # 添加一行,自动开启iptables放行规则
14    vrrp_skip_check_adv_addr
15    vrrp_strict
16    vrrp_garp_interval 0
17    vrrp_gna_interval 0
18 }
19 
20 vrrp_instance VI_1 {
21     state MASTER  # 状态:MASTER为主,BACKUP为备
22     interface eth0  # 网卡
23     virtual_router_id 51  # 虚拟路由器地址
24     priority 100  # 优先级
25     advert_int 1  # 发送心跳信息的间隔
26     authentication {
27         auth_type PASS  # 认证类型为共享密码
28         auth_pass aabb  # 集群中密码相同,才能成为集群
29     }
30     virtual_ipaddress {
31         192.168.88.15  # VIP地址
32     }   
33 }
34 # 以下为keepalived配置lvs的规则
35 virtual_server 192.168.88.15 80 {  # 声明虚拟服务器的地址和端口
36     delay_loop 6  # 健康检查延迟6s开始
37     lb_algo rr  # 调度算法为rr
38     lb_kind DR  # 工作模式为DR
39     persistence_timeout 50  # 50s内相同客户端调度到相同服务器
40     protocol TCP  # 协议为TCP
41 
42     real_server 192.168.88.100 80 {  # 声明真实服务器的地址和端口
43         weight 1  # 权重
44         TCP_CHECK {  # 通过TCP协议对真实服务器做健康检查
45             connect_timeout 3  # 连接超时时间为3秒
46             nb_get_retry 3  # 3次访问失败则认为真实服务器故障
47             delay_before_retry 3  # 两次检查时间的间隔3秒
48         }
49     }
50 
51     real_server 192.168.88.200 80 {  # 第二个真实服务器配置跟第一台差不多
52         weight 2
53         TCP_CHECK {
54             connect_timeout 3
55             nb_get_retry 3
56             delay_before_retry 3
57         }
58     }
59 }

# 启动服务
systemctl start keepalived.service

# 查看设置是否成功
ip a s eth0 | grep 192.168.88.15
# inet 192.168.88.15/32 scope global eth0
ipvsadm -Ln
  • lvs2
# 编辑keepalived配置文件
1 ! Configuration File for keepalived
2 
3 global_defs {
4    notification_email {
5      acassen@firewall.loc
6      failover@firewall.loc
7      sysadmin@firewall.loc
8    }
9    notification_email_from Alexandre.Cassen@firewall.loc
10    smtp_server 192.168.200.1
11    smtp_connect_timeout 30
12    router_id lvs2  # 唯一id
13    vrrp_iptables  # 添加一行,自动开启iptables放行规则
14    vrrp_skip_check_adv_addr
15    vrrp_strict
16    vrrp_garp_interval 0
17    vrrp_gna_interval 0
18 }
19 
20 vrrp_instance VI_1 {
21     state BACKUP  # 状态:MASTER为主,BACKUP为备
22     interface eth0  # 网卡
23     virtual_router_id 51  # 虚拟路由器地址
24     priority 100  # 优先级
25     advert_int 1  # 发送心跳信息的间隔
26     authentication {
27         auth_type PASS  # 认证类型为共享密码
28         auth_pass aabb  # 集群中密码相同,才能成为集群
29     }
30     virtual_ipaddress {
31         192.168.88.15  # VIP地址
32     }   
33 }
34 # 以下为keepalived配置lvs的规则
35 virtual_server 192.168.88.15 80 {  # 声明虚拟服务器的地址和端口
36     delay_loop 6  # 健康检查延迟6s开始
37     lb_algo rr  # 调度算法为rr
38     lb_kind DR  # 工作模式为DR
39     persistence_timeout 50  # 50s内相同客户端调度到相同服务器
40     protocol TCP  # 协议为TCP
41 
42     real_server 192.168.88.100 80 {  # 声明真实服务器的地址和端口
43         weight 1  # 权重
44         TCP_CHECK {  # 通过TCP协议对真实服务器做健康检查
45             connect_timeout 3  # 连接超时时间为3秒
46             nb_get_retry 3  # 3次访问失败则认为真实服务器故障
47             delay_before_retry 3  # 两次检查时间的间隔3秒
48         }
49     }
50 
51     real_server 192.168.88.200 80 {  # 第二个真实服务器配置跟第一台差不多
52         weight 2
53         TCP_CHECK {
54             connect_timeout 3
55             nb_get_retry 3
56             delay_before_retry 3
57         }
58     }
59 }

# 启动服务
systemctl start keepalived.service

# 因为lvs2是备用服务器,当主服务器正常运行时,是不会出现VIP的,只能通过ipvsadm的配置查看
ipvsadm -Ln

效果演示

  1. 正常访问
for i in {1..6}; do curl http://192.168.88.15; done
# 结果都是web1或者web2,是因为上面的keepalived配置文件中第39行,配置了50s内相同服务器调度到相同服务器
  1. lvs1关机,然后查看lvs2的ip,再次访问测试
# lvs2
ip a s | grep 192.168.88.15
# 输出: inet 192.168.88.15/32 scope global eth0

# client正常能够访问,实现了自动切换
for i in {1..6}; do curl http://192.168.88.15; done
  1. web2httpd服务器关闭,然后查看lvs2ipvsadm配置,再次访问测试
# lvs2
ipvsadm -Ln
# 结果只有一个真实服务器TCP -> 192.168.88.100:80            Route   1      0          0 

# client正常能够访问,只能访问到web1
for i in {1..6}; do curl http://192.168.88.15; done
  1. lvs1启动,并启动它的keepalived服务,查看VIP会不会自动切换过来,再次访问测试
# 查看lvs1网卡,发现VIP自动切换过来了
ip a s | grep 192.168.88.15
# 输出: inet 192.168.88.15/32 scope global eth0

# client正常能够访问,只能访问到web1
for i in {1..6}; do curl http://192.168.88.15; done

网站公告

今日签到

点亮在社区的每一天
去签到