Load BalanceHigh AvailabilityHigh Performance ComputingLVS:Linux Virtual Server,Linux虚拟服务器LVS的工作模式
NAT:网络地址转换DR:路由模式TUN:隧道模式LVS服务器VIP:虚拟地址,提供给用户访问的地址DIR:指定地址,LVS服务器上与真实服务器通信的地址RIP:真实地址,真实服务器的地址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:指定工作模式为DRNAT模式:通过lvs服务器来接收用户的请求,然后通过调度算法分配请求到真实服务器,然后真实服务器返回数据给lvs服务器,再有lvs服务器返回给用户
client:eth0->192.168.88.10,gateway->192.168.88.5lvs:eth0->192.168.88.5;eth1->192.168.99.5web1:eth0->192.168.99.100,gateway->192.168.99.5web2:eth0->192.168.99.200,gateway->192.168.99.5client# 设置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
DR模式相比于NAT模式,它不会因为lvs服务器的带宽而影响业务DR模式:通过lvs服务器来接收请求,然后分配请求到真实服务器,然后通过真实服务器的虚拟网卡直接返回给用户
client:eth0->192.168.88.10lvs:eth0->192.168.88.5;eth0:0->192.168.88.15web1:eth0->192.168.88.100;lo:0->192.168.88.15/32web2:eth0->192.168.88.200;lo:0->192.168.88.15/32client相比与上一个实验无需操作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
web1cd /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
web2cd /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用于实现高可用集群VRRP(虚拟冗余路由协议)lvs服务器自动切换,并且可以根据web服务器的工作情况自动添加和删除
client:eth0->192.168.88.10lvs集群,使用keepalived服务,配置虚拟ip为192.168.88.15/24
lvs1:eth0->192.168.88.5,Masterlvs2:eth0->192.168.88.6,Backupweb集群,都配置lo:0为192.168.88.15/32
web1:eth0->192.168.88.100web2:eth0->192.168.88.200client不做修改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
web1和web2跟上次实验操作一致,不需要额外操作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
for i in {1..6}; do curl http://192.168.88.15; done
# 结果都是web1或者web2,是因为上面的keepalived配置文件中第39行,配置了50s内相同服务器调度到相同服务器
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
web2的httpd服务器关闭,然后查看lvs2的ipvsadm配置,再次访问测试# 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
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