• 管理集群工具之LVS


    管理集群工具之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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    相关配置

    • 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    配置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
    
    • 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
    • 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
    
    • 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
    • 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
    
    • 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服务器
    # 清除之前的配置
    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    配置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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 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
    
    • 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
    • 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
    • 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

    效果演示

    1. 正常访问
    for i in {1..6}; do curl http://192.168.88.15; done
    # 结果都是web1或者web2,是因为上面的keepalived配置文件中第39行,配置了50s内相同服务器调度到相同服务器
    
    • 1
    • 2
    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
    • 2
    • 3
    • 4
    • 5
    • 6
    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
    • 2
    • 3
    • 4
    • 5
    • 6
    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  • 相关阅读:
    PMP模拟题 | 每日一练,快速提分
    Linux 安装mysql5.7版本并连接本地navicat
    大模型重塑软件研发,从辅助编程到多 Agent 协同还有多远?| 新程序员
    深入理解Linux中信号处理过程
    Radware Alteon负载均衡-基于域名的七层负载均衡
    面试:Android应用编译打包流程
    springboot项目基于jdk17、分布式事务seata-server-1.7.1、分库分表shardingSphere5.2.1开发过程中出现的问题
    Vue2.0开发之——webpack基础-打包发布项目(10)
    b站pink老师JavaScript的ES6,断点调试看什么是闭包
    搭建神经网络(torch.nn的用法)
  • 原文地址:https://blog.csdn.net/lubuhan/article/details/138093674