keepalived基础

介绍

  • 他可以实现服务器之间的高可用,他会虚拟出一个ip,当一台服务挂掉后会自动将这个vip转移到另一台机器上,从而实现服务的高可用
  • VRRP是Virtual Router Redundancy Protocol(虚拟路由器冗余协议)的缩写,它出现的目的是为了解决静态路由出现的单点故障问题,通过VRRP可以实现⽹络不间断地、稳定地运行。因此,Keepalived具有服务器状态检测和故障隔离功能,另一方面也具有HA cluster功能。

安装与配置

  • dnf install -y keepalived
  • vim /etc/keepalived/keepalived.conf
    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
    #全局配置
    global_defs {
    #邮件发送服务
    notification_email {
    acassen@firewall.loc
    failover@firewall.loc
    sysadmin@firewall.loc
    }
    #设置通知邮件发送来自于哪里,如果本地开启了sendmail的话,可以使用上面的默认值
    notification_email_from Alexandre.Cassen@firewall.loc
    smtp_server 192.168.200.1 #指定发送邮件的smtp服务器
    smtp_connect_timeout 30
    router_id LVS_DEVEL
    vrrp_skip_check_adv_addr
    vrrp_strict ##严格遵守VRRP协议,这个要注释掉
    vrrp_garp_interval 0
    vrrp_gna_interval 0
    }

    vrrp_instance VI_1 {
    state MASTER #角色
    interface eth0 #网卡名
    virtual_router_id 51 #组id,同一组的组id相同
    priority 100 #优先级,优先级高的vip会优先,两个优先级之间间隔20
    advert_int 1
    authentication {#验证方式
    auth_type PASS #密码验证
    auth_pass 1111 #密码,两台server的密码要一致
    }
    #设置VIP,可以设置多个,⽤于切换时的地址绑定。格式:#<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPT> label <LABEL>
    virtual_ipaddress { #设定的vip,要和server在同一网段(网络地址要相同),且ip没有被使用
    192.168.200.16
    }
    }
    #下面这段可以不要,直接删除
    virtual_server 192.168.200.100 443 {
    delay_loop 6
    lb_algo rr
    lb_kind NAT
    persistence_timeout 50
    protocol TCP

    real_server 192.168.201.100 443 {
    weight 1
    SSL_GET {
    url {
    path /
    digest ff20ad2481f97b1754ef3e12ecd3a9cc
    }
    url {
    path /mrtg/
    digest 9b3a0c85a887a256d6939da88aabd8cd
    }
    connect_timeout 3
    retry 3
    delay_before_retry 3
    }
    }
    }

抢占式和非抢占式

  • 抢占式是在主节点重新开启服务后vip会自动回来
  • 非抢占式(nopreempt)是启动后不会回来
  • 他需要在配置文件中修改两个地方,一个是将主节点的角色state改成和从节点一样的backup,然后新增一行’nopreempt’

smtp邮件发送

  • 在vip发生转移后可以邮件告知
  • 安装发邮件的工具dnf install -y s-nail
  • 在配置文件中添加邮箱信息,这里使用网易邮箱,要现在网友邮箱里开通smtp和授权码
    1
    2
    3
    4
    set from=15079322375@163.com
    set smtp=smtp.163.com
    set smtp-auth-user=15079322375@163.com
    set smtp-auth-password=Usdkdf23jU
  • 在keepalived中vrrp_instance快后添加内容
    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
    #定义了一个脚本
    notify_master "/root/mail_keepalived.sh master"
    notify_backup "/root/mail_keepalived.sh backup"
    notify_fault "/root/mail_keepalived.sh fault"

    #脚本mail_keepalived.sh
    #!/bin/bash
    contact=(15079322375@163.com 940341920@qq.com)

    HOST_IP=$(ip a|egrep 'inet.*ens33$' | awk '{print $2}'| egrep -o '([0-9]{1,3}\.){3}[0-9]{3}')

    notify(){
    mailSubject="Vip transition, $HOST_IP keepalived to be $1 "
    mailbody="$(data +'%F %T'):vrrp transition, $HOST_IP keepalived change to be $1"
    for receiver in ${contact[*]};do
    echo "$mailbody" | mail -s "$mailSubject" $receiver
    done
    }

    case $1 in
    master)
    notify $1
    ;;
    backup)
    notify $1
    ;;
    fault)
    notify $1
    ;;
    *)
    echo "Usage:(master|backup|fault)"
    exit 1
    ;;
    esac

LVS负载均衡

功能介绍

  • LVS是Linux Virtual Server的简称,当用户的请求过来时,会直接将流量分到Dierector Server上,然后将流量转到后端的RS服务器上
  • 基本工作原理

LVS工作模式

LVS NAT模式

  • 工作原理,通过在ipvs内核空间工作

  • NAT模式他是将client请求的数据包访问DS的vip,然后内部会先经过似进非进的状态(iptables链PREROUTING)然后数据会真正进入ds,将原先的vip指向rip,转到iptables链POSTROUTING,然后rs收到后会将原先的地址互换,就和寄快递一样,对方寄回来后双方的地址就是互相转换

配置方法(提前将防火墙和selinux关闭)

  1. 环境清单
    DS:桥接ip:192.168.1.129/22 仅主机ip:192.168.222.135/24
    RS1:192.168.222.136/24
    RS2:192.168.222.137/24
  2. 三台服务器,一台作为DS/LB,两台作为RS。DS需要两张网卡,一张桥接,一张仅主机,RS都为仅主机模式,DS的桥接的IP要和宿主机的IP同网段、网关,仅主机的话就随便设一个ip
  3. RS的ip要和ds的仅主机网络同网段,网关指向ds的仅主机ip,这样的话,当client的流量过来,ds转到rs,rs就通过ds返回给client
  4. ds下载ipvsadm工具,用于做流量转发与端口监听
  5. 在ds上配置/etc/sysctrl.conf,配置完后刷新sysctrl -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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    #永久生效配置/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.conf配置详解
    1、 kernel.shmall = 4294967296
    含义:系统中共享内存页总数

    2、kernel.panic = 1
    含义:当出现系统内核崩溃的时候系统等待1秒钟,然后自动重启。

    3、 net.ipv4.conf.all.accept_redirects = 0
    含义:处于对网络的安全考虑关闭 ICMP 路由重定向

    4、 net.ipv4.tcp_timestamps = 0
    含义:如果前端有F5之类的负载均衡设备的话需要关闭此参数,否则会造成丢链接。

    5、net.ipv4.conf.all.send_redirects = 0
    含义:发送重定向,处于安全考虑关闭此选项。

    6、net.ipv4.conf.default.send_redirects = 0
    含义:同上

    7、net.ipv4.conf.default.arp_ignore = 1
    含义:确定不同的方式发送的回应收到 ARP 协议要求
    0-(默认)代表任何地方的目标 IP地址,配置任何接口。
    1-答复只有目标IP地址是本地地址上配置传入接口。

    8、net.ipv4.conf.all.arp_ignore = 1
    含义:同上

    9、net.ipv4.ip_no_pmtu_disc = 1
    含义:禁止“沿途 MTU 发现”。“沿途 MTU 发现”是一种技术,可以在传输路径上检测出
    最大的MTU值。

    10、net.ipv4.tcp_tw_reuse = 1
    含义:默认值是 0,该文件表示是否允许重新应用处于 TIME-WAIT 状态的 socket 用于新
    的TCP连接(这个对快速重启动某些服务,而启动后提示端口已经被使用的情形非常有帮助)

    11、net.ipv4.tcp_tw_recycle = 1
    含义:能够更快的回收 TIME-WAIT。默认值为1。

    12、net.ipv4.ip_local_port_range = 10240 65000
    含义:本地端口使用范围

    13、net.ipv4.tcp_keepalive_time = 1800
    含义:当启用keepalive 的时候,TCP发送keepalive消息的频度

    14、net.ipv4.tcp_max_syn_backlog = 8192 含义:记录的那些尚未收到客户端确认信息的链接请求的最大值。 默认值为4096 如果设置这个值大于 4096 最好同时调整 include/net/tcp.h 中的 TCP_SYNQ_HSIZE,保证TCP_SYNQ_HSIZE*16 小于或等于tcp_max_syn_backlo,然后重新编译内核。

    15、net.ipv4.tcp_syncookies = 1
    含义:默认值是0,只有在内核编译时选择了 CONFIG_SYNCOOKIES时才会发生作用。当
    出现syn等候队列,并出现溢出时,对方发送syncookies。目的是为了防止 syn flood 攻击。

    16、net.ipv4.tcp_synack_retries = 3
    含义:为了打开对端的链接,内核需要发送一个SYN并附带一个回应前面一个SYN的ACK。
    也就是所谓三次握手中的第二次握手。这个设置决定了内核放弃链接前发送 SYN+ACK 包的
    数量。
  6. 配置ipvsadm
    1
    2
    3
    4
    ipvsadm -C 清空配置  -L 查看配置
    ipvsadm -A -t 192.168.1.129:80 -s wrr #桥接ip,s执行模式为加权轮询wrr
    ipvsadm -a -t 192.168.1.129:80 -r 192.168.222.136:80 -m -w 1 #m为nat模式,w为权重
    ipvsadm -a -t 192.168.1.129:80 -r 192.168.222.137:80 -m -w 1
  7. 在rs上安装nginx
  8. 然后就可以在宿主机上curl 192.168.1.129,就可以看到效果了

LVS DR模式

  • 工作原理
  • DR模式与NAT模式有点相反,NAT模式是通过在内部重新指向IP,且数据的出入都需要经过DS,DR模式是通过重新指向MAC,且数据从RS返回不需要经过DS,直接返回client
  • 三台server都设成NAT模式,三台都绑定vip,ds绑定在ens网卡上,rs绑定在loop回环口上,用于认识ds传过来的vip,不至于拒绝数据包

配置方法

  1. 环境清单
    DS:192.168.146.135/24 vip:192.168.146.250/24
    RS1:192.168.146.136/24 vip:192.168.146.250/32
    RS2:192.168.146.137/24 vip:192.168.146.250/32
  2. 在rs上安装工具net-tools,用于在回环口添加vip
  3. 设定vip为192.168.146.250,vip需要和正常ip同网段,因为ds的vip是设在ens网卡上
    1
    2
    3
    4
    5
    6
    #ds
    nmcli con mod ens33 +ipv4.addresses 192.168.146.250/24
    nmcli con up ens33

    #rs,两台rs都需要添加
    ifconfig lo:0 192.168.146.250/32 broadcast 192.168.146.250 up
  4. rs上添加配置/etc/sysctrl.conf,对ARP进行限制
    1
    2
    3
    4
    net.ipv4.conf.ens33.arp_ignore = 1   #忽略arp广播
    net.ipv4.conf.ens33.arp_announce = 2 #精确匹配ip地址回包
    net.ipv4.conf.all.arp_announce = 2 #精确匹配ip地址回包
    net.ipv4.conf.all.arp_ignore = 1 #忽略arp广播包 也就是只有发个接口地址是它本身的才接收
  5. ds上创建集群
    1
    2
    3
    4
    ipvsadm -C 清空配置  -L 查看配置
    ipvsadm -A -t 192.168.146.250:80 -s rr #桥接ip,s执行模式为轮询rr
    ipvsadm -a -t 192.168.146.250:80 -r 192.168.146.136:80 -g #g为dr模式
    ipvsadm -a -t 192.168.146.250:80 -r 192.168.146.137:80 -g
  6. 现在可以直接在宿主机curl 192.168.146.250了