• LVS + Keepalived群集


    1. Keepalived工具概述

    1.1 什么是Keepalived

    • 专为LVS和HA设计的一款健康检查工具支持故障自动切换 (Failover)
    • 支持节点健康状态检查(Health Checking)
    官方网站: http://www.keepalived.org/
    
    • 1

    1.2 工作原理

    判断 LVS 负载调度器、节点服务器的可用性
    当 master 主机出现故障及时切换到backup 节点保证业务正常,当 master故障主机恢复后将其重新加入群集并且业务重新切换回 master 节点。

    1.3 Keepailved实现原理

    在这里插入图片描述

    • VRRP(虚拟路由冗余协议) 是针对路由器的一种备份解决方案

    • 由多台路由器组成一个热备组,通过共用的虚拟IP地址对外提供服务

    • 每个热备组内同时只有一台主路由器提供服务,其他路由器处于冗余状态

    • 若当前在线的路由器失效,则其他路由器会根据设置的优先级自动接替虚拟IP地址,继续提供服务

    1.4 Keepalived体系主要模块及其作用

    keepalived体系架构中主要有三个模块,分别是corecheckvrrp

    • core模块:为keepalived的核心,负责主进程的启动、维护及全局配置文件的加载和解析。
    • vrrp模块:是来实现VRRP协议的。(调度器之间的健康检查和主备切换)
    • check模块:负责健康检查,常见的方式有端口检查及URL检查。(节点服务器的健康检查)

    1.5 keepalived的抢占与非抢占模式

    抢占模式即MASTER从故障中恢复后,会将VIP从BACKUP节点中抢占过来。非抢占模式即MASTER恢复后不抢占BACKUP升级为MASTER后的VIP

    非抢占式俩节点state必须为bakcup,且必须配置nopreempt。

    注意:这样配置后,我们要注意启动服务的顺序,优先启动的获取master权限,与优先级没有关系了。

    #Keepalived通过什么判断哪台主机为主服务器,通过什么方式配置浮动IP?
    
    Keepalived首先做初始化先检查state状态,master为主服务器,backup为备服务器。
    然后再对比所有服务器的priority,谁的优先级高谁是最终的主服务器。
    优先级高的服务器会通过ip命令为自己的电脑配置一个提前定义好的浮动IP地址。
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2. 脑裂现象 (拓展)

    2.1 什么是脑裂

    主服务器和备服务器同时拥有 VIP

    2.2 脑裂的产生原因

    因为主服务器和备服务器之间的通信链路中断,导致备服务器无法正常收到主服务器发送的VRRP心跳报文

    2.3 如何解决脑裂

    关闭主服务器或者备服务器其中一个的keepalived服务

    2.4 如何预防脑裂

    1. 主服务器与备服务器之间添加双通信链路

    2. 在主服务器上定义运行脚本判断与备服务器通信链路是否中断,如果中断则自行关闭keepalived服务

    3. 利用第三方监控软件检测是否发生脑裂故障,如果发生则通过监控软件关闭主或者备服务器上的keepalived服务

    3. LVS+Keepalived 实现高可用负载均衡配置

    3.1 前置准备

    主keepalived服务器:192.168.67.100
    备keepalived服务器:192.168.67.101
    
    web1服务器:192.168.67.102
    web2服务器:192.168.67.103 
      
    vip:192.168.67.200
    
    客户机:192.168.67.104
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    3.2 配置负载调度器 (主keepalived服务器:192.168.67.100)

    #关闭防火墙
    systemctl stop firewalld.service
    setenforce 0
     
    #安装服务
    yum install ipvsadm -y
    yum install keepalived -y 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述在这里插入图片描述

    #修改配置文件keeplived.conf
    cd /etc/keepalived/
    cp keepalived.conf keepalived.conf.bak    #备份配置文件
    
    vim keepalived.conf
    #编辑配置文件
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    删掉多余配置

    #启动服务、查看虚拟网卡vip
    systemctl start keepalived
    ip addr show dev ens33	
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    #调整proc响应参数,关闭Linux内核的重定向参数响应
    vim /etc/sysctl.conf
    net.ipv4.ip_forward = 1
    net.ipv4.conf.all.send_redirects = 0
    net.ipv4.conf.default.send_redirects = 0
    net.ipv4.conf.ens33.send_redirects = 0
     
    #刷新一下
    sysctl -p
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述

    #配置负载分配策略,并启动服务
    ipvsadm-save >/etc/sysconfig/ipvsadm
    systemctl start ipvsadm.service
     
    #清空ipvsadm,并做策略
    ipvsadm -C
    ipvsadm -A -t 192.168.67.200:80 -s rr
    ipvsadm -a -t 192.168.67.200:80 -r 192.168.67.102:80 -g
    ipvsadm -a -t 192.168.67.200:80 -r 192.168.67.103:80 -g
     
    #保存设置
    ipvsadm
    ipvsadm -ln
    ipvsadm-save >/etc/sysconfig/ipvsadm
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    在这里插入图片描述

    3.3 配置负载调度器(备keepalived服务器:192.168.67.101)

    #与主服务器类似
    #关闭防火墙
    systemctl stop firewalld.service
    setenforce 0
     
    #安装服务
    yum install ipvsadm -y
    yum install keepalived -y 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    #修改配置文件keeplived.conf
    cd /etc/keepalived/
    cp keepalived.conf keepalived.conf.bak    #备份配置文件
    
    vim keepalived.conf
    #编辑配置文件
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    在这里插入图片描述

    #启动服务、查看虚拟网卡vip
    systemctl start keepalived
    ip addr show dev ens33	
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    #调整proc响应参数,关闭Linux内核的重定向参数响应
    vim /etc/sysctl.conf
    net.ipv4.ip_forward = 1
    net.ipv4.conf.all.send_redirects = 0
    net.ipv4.conf.default.send_redirects = 0
    net.ipv4.conf.ens33.send_redirects = 0
     
    #刷新一下
    sysctl -p
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述

    #配置负载分配策略,并启动服务
    ipvsadm-save >/etc/sysconfig/ipvsadm
    systemctl start ipvsadm.service
     
    #清空ipvsadm,并做策略
    ipvsadm -C
    ipvsadm -A -t 192.168.67.200:80 -s rr
    ipvsadm -a -t 192.168.67.200:80 -r 192.168.67.102:80 -g
    ipvsadm -a -t 192.168.67.200:80 -r 192.168.67.103:80 -g
     
    #保存设置
    ipvsadm
    ipvsadm -ln
    ipvsadm-save >/etc/sysconfig/ipvsadm
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    在这里插入图片描述

    3.4 配置节点服务器(web1服务器:192.168.67.102)

    #关闭防火墙
    systemctl stop firewalld
    setenforce 0
     
    #安装并开启httpd服务
    yum -y install httpd
    systemctl start httpd
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

    #配置站点文件
    vim /var/www/html/index.html
    this is scj web1!
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    #配置虚拟vip
    vim /etc/sysconfig/network-scripts/ifcfg-lo:0
    DEVICE=lo:0
    ONBOOT=yes
    IPADDR=192.168.67.200
    NETMASK=255.255.255.255
     
    #重启网络服务,开启虚拟网卡
    systemctl restart network
    ifup lo:0
    ifconfig lo:0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述

    #设置路由
    route add -host 192.168.67.200 dev lo:0
    route -n
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    #调整 proc 响应参数
    
    #添加系统只响应目的IP为本地IP的ARP请求
    #系统不使用原地址来设置ARP请求的源地址,而是物理mac地址上的IP
    vim /etc/sysctl.conf
    net.ipv4.conf.all.arp_ignore = 1
    net.ipv4.conf.all.arp_announce = 2
    net.ipv4.conf.default.arp_ignore = 1
    net.ipv4.conf.default.arp_announce = 2
    net.ipv4.conf.lo.arp_ignore = 1
    net.ipv4.conf.lo.arp_announce = 2
     
    #刷新proc参数
    sysctl -p
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    在这里插入图片描述

    3.5 配置节点服务器(web2服务器:192.168.67.103)

    #配置与web1类似
    
    • 1
    #关闭防火墙
    systemctl stop firewalld
    setenforce 0
     
    #安装并开启httpd服务
    yum -y install httpd
    systemctl start httpd
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

    #配置站点文件
    vim /var/www/html/index.html
    this is scj web2!
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    #配置虚拟vip
    vim /etc/sysconfig/network-scripts/ifcfg-lo:0
    DEVICE=lo:0
    ONBOOT=yes
    IPADDR=192.168.67.200
    NETMASK=255.255.255.255
     
    #重启网络服务,开启虚拟网卡
    systemctl restart network
    ifup lo:0
    ifconfig lo:0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述

    #设置路由
    route add -host 192.168.67.200 dev lo:0
    route -n
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    #调整 proc 响应参数
    
    #添加系统只响应目的IP为本地IP的ARP请求
    #系统不使用原地址来设置ARP请求的源地址,而是物理mac地址上的IP
    vim /etc/sysctl.conf
    net.ipv4.conf.all.arp_ignore = 1
    net.ipv4.conf.all.arp_announce = 2
    net.ipv4.conf.default.arp_ignore = 1
    net.ipv4.conf.default.arp_announce = 2
    net.ipv4.conf.lo.arp_ignore = 1
    net.ipv4.conf.lo.arp_announce = 2
     
    #刷新proc参数
    sysctl -p
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    在这里插入图片描述

    3.6 测试

    #前往客户机
    curl 192.168.67.200
    #访问vip
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    #前往主服务器
    ip a
    
    • 1
    • 2

    在这里插入图片描述

    #前往备服务器
    ip a
    
    • 1
    • 2

    在这里插入图片描述

    #前往主服务器
    systemctl stop keepalived.service
    #断开主服务器
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    #前往备服务器
    ip a
    
    • 1
    • 2

    在这里插入图片描述

    4. nginx与keepalived的联动部署实现高可用 (拓展)

    4.1 前置准备

    192.168.67.102 #主服务器
    192.168.67.103 #备服务器
    
    192.168.67.100 #nginx节点服务器1
    192.168.67.101 #nginx节点服务器2
    
    192.168.67.104 #客户机
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    4.2 配置节点服务器1

    systemctl stop firewalld
    setenforce 0
    #关闭防火墙
    
    #yum安装nginx
    
    yum install -y epel-release
    #安装epel源
    
    yum install nginx -y
    #安装nginx主体软件
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    echo this is nginx1 > /var/share/nginx/html/index.html
    #编辑主页内容
    
    • 1
    • 2

    在这里插入图片描述

    vim /etc/sysconfig/network-scripts/ifcfg-lo:0
    DEVICE=lo:0
    ONBOOT=yes
    IPADDR=192.168.67.200
    NETMASK=255.255.255.255
     
    #重启网络服务,开启虚拟网卡
    systemctl restart network
    ifup lo:0
    ifconfig lo:0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述

    #设置路由
    route add -host 192.168.67.200 dev lo:0
    route -n
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    4.2 配置节点服务器1

    systemctl stop firewalld
    setenforce 0
    #关闭防火墙
    
    #yum安装nginx
    
    yum install -y epel-release
    #安装epel源
    
    yum install nginx -y
    #安装nginx主体软件
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    echo this is nginx2 > /var/share/nginx/html/index.html
    #编辑主页内容
    
    • 1
    • 2

    在这里插入图片描述

    vim /etc/sysconfig/network-scripts/ifcfg-lo:0
    DEVICE=lo:0
    ONBOOT=yes
    IPADDR=192.168.67.200
    NETMASK=255.255.255.255
     
    #重启网络服务,开启虚拟网卡
    systemctl restart network
    ifup lo:0
    ifconfig lo:0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述

    #设置路由
    route add -host 192.168.67.200 dev lo:0
    route -n
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    4.4 配置主服务器

    systemctl stop firewalld
    setenforce 0
    #关闭防火墙
    
    #下载依赖环境
    yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make
    #创建管理用户
    useradd -M -s /sbin/nologin nginx
    
    #编译安装ngnix
    cd /opt
    tar -xf nginx-1.18.0\ .tar.gz
    #解压缩软件包
    
    cd nginx-1.18.0             #进入源码包
    
    #搭建编译环境
    ./configure --prefix=/apps/nginx \
    --user=nginx \
    --group=nginx \
    --with-http_ssl_module \
    --with-http_v2_module \
    --with-http_realip_module \
    --with-http_stub_status_module \
    --with-http_gzip_static_module \
    --with-pcre \
    --with-stream \
    --with-stream_ssl_module \
    --with-stream_realip_module
    
    make -j2 && make install 
    #编译并安装
    
    #软连接 添加到环境变量中
    ln -s /apps/nginx/sbin/nginx /usr/local/sbin/
    
    • 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
    #添加到systemd系统服务中
    vim /lib/systemd/system/nginx.service
    
    [Unit]
    Description=nginx
    After=network.target
    [Service]
    Type=forking
    PIDFile=/apps/nginx/logs/nginx.pid
    ExecStart=/apps/nginx/sbin/nginx
    ExecrReload=/bin/kill -s HUP $MAINPID
    ExecrStop=/bin/kill -s QUIT $MAINPID
    PrivateTmp=true
    [Install]
    WantedBy=multi-user.target
    
    systemctl daemon-reload
    chmod 754 /lib/systemd/system/nginx.service
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    systemctl start nginx
    #开启服务
    
    systemctl status nginx
    #查看运行状态
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    vi /apps/nginx/conf/nginx.conf
    #编辑主配置文件,布置四层代理
    
    stream {
        upstream backend {
          server 192.168.67.100:80; #节点服务器1
          server 192.168.67.101:80; #节点服务器2
    }
        server {
          listen 8080;
          proxy_pass backend;
    }
    }
    
    nginx -t
    nginx -s reload
    #重新加载
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    在这里插入图片描述

    #测试
    curl 192.168.67.102:8080 #x2
    
    • 1
    • 2

    在这里插入图片描述

    #默认备服务器已经编译安装nginx
    scp /apps/nginx/conf/nginx.conf 192.168.67.103:`pwd`
    #将配置文件远程拷贝到被备服务器
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    #前往备服务器查看是否拷贝成功
    nginx -t
    nginx -s reload
    #重新加载
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    #测试是否轮询成功
    curl 192.168.67.103:8080 #x2
    
    • 1
    • 2

    在这里插入图片描述

    #回到主服务器
    yum install keepalived -y 
    #安装服务
    
    • 1
    • 2
    • 3
    #编写一个判断nginx是否正常启动,如果没有正常启动则立刻关闭keepalived服务,防止主备之间发生脑裂状况的脚本,并给脚本加上执行权限
    
    vi /etc/keepalived/check_nginx.sh
    #编辑脚本
    
    #!/bin/bash
    
    if ! killall -0 nginx           #表示如果nginx没有在启动则启用下面的命令
    then
      systemctl stop keepalived     #关闭keepalived
    fi
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述

    #检测脚本是否有用
    systemctl restart nginx keepalived
    #开启两个软件
    
    systemctl stop nginx
    #关闭nginx
    
    bash check_nginx.sh
    #运行脚本
    
    #如果是最小化安装是没有kill命令的,需要安装
    yum install -y psmisc
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在这里插入图片描述

    vi /etc/keepalived/keepalived.conf
    #编辑配置文件
    
    • 1
    • 2

    在这里插入图片描述

    #备服务器默认安装了keepalivsd
    scp check_nginx.sh keepalived.conf 192.168.67.103:`pwd`
    #将配置文件和脚本文件一起传送给备服务器
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    4.5 配置备服务器

    systemctl stop firewalld
    setemforce 0
    #关闭防火墙
    
    • 1
    • 2
    • 3
    vi /etc/keepalived/keepalived.conf
    #编辑配置文件
    
    • 1
    • 2

    在这里插入图片描述

    4.6 测试

    #前往主服务器
    ip a
    
    • 1
    • 2

    在这里插入图片描述

    #前往备服务器
    ip a
    
    • 1
    • 2

    在这里插入图片描述

    #现在使主服务器上nginx挂掉
    systemctl stop nginx keepalived
    #关掉两个服务
    或
    poweroff
    #直接关机
    
    #现在前往备服务器
    ip a
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述

  • 相关阅读:
    vue3组件通信
    DolphinDB 诚挚招募实施伙伴
    CSS之浮动Float
    C#不安全代码
    ubuntu20.04搭建QGC4.2编译环境
    java上传文件到指定服务器
    一篇笔记爆不爆,话题占了爆文的绝大部分,这篇文章教你
    Vue 开发必须知道的 36 个技巧【近1W字】
    《一个程序猿的生命周期》-《发展篇》- 44.再次进军内蒙市场(转型)
    Django笔记六 常用字段类型,字段选项
  • 原文地址:https://blog.csdn.net/m0_74170357/article/details/132800330