zoukankan      html  css  js  c++  java
  • keepalived --(VIP)

    1. 简介

        Keepalived软件通过VRRP协议实现高可用的功能,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议。它将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和N-1个backup,master上面有一个对外提供服务的vip,master会发送(多播的方式)心跳消息,当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master,来接管旧Master节点的IP资源及服务;而当Master节点恢复时,Backup节点又会释放Master节点故障时自身接管的IP资源及服务,恢复到原来的Backup角色。从而解决静态路由单点故障问题。

    Keepalived工作在TCP/IP参考模型中的网络层,传输层和应用层。

    1.1 核心模块

    core模块:为keepalived的核心组件,负责主进程的启动、维护以及全局配置文件的加载和解析;
    check:   负责健康检查;
    VRRP模块:是来实现VRRP协议的。


    1.2 体系结构

    image

    SchedulerI/OMultiplexer是一个I/O复用分发调度器,它负载安排Keepalived所有内部的任务请求;
    Memory Mngt是一个内存管理机制,这个框架提供了访问内存的一些通用方法;
    Control Plane 是keepalived的控制版面,可以实现对配置文件编译和解析;
    Core componets 这部分主要包含了5个部分;
    
    Watchdog:是计算机可靠领域中极为简单又非常有效的检测工具,Keepalived正是通过它监控Checkers和VRRP进程的。
    Checkers:这是Keepalived最基础的功能,也是最主要的功能,可以实现对服务器运行状态检测和故障隔离。
    VRRP Stack:这是keepalived后来引用VRRP功能,可以实现HA集群中失败切换功能。负责负载均衡器之间的失败切换FailOver;
    IPVS wrapper:这个是IPVS功能的一个实现,IPVSwarrper模块将可以设置好的IPVS规则发送的内核空间并且提供给IPVS模块,最终实现IPVS模块的负载功能。
    Netlink Reflector:用来实现高可用集群Failover时虚拟IP(VIP)的设置和切换


    2. 软件安装

    2.1 源码编译安装

    # 安装系统依赖软件包,详见源码包中INSTALL文件
    # 检查依赖包
    rpm -q --queryformat "%{NAME}-%{VERSION}-%{RELEASE} (%{ARCH})
    " make autoconf automake openssl-devel libnl3-devel ipset-devel iptables-devel 
    file-devel net-snmp-devel glib2-devel json-c-devel pcre2-devel libnftnl-devel libmnl-devel 
    python-sphinx epel-release python-sphinx_rtd_theme latexmk 
    texlive texlive-titlesec texlive-framed texlive-threeparttable texlive-wrapfig texlive-multirow 
    libnl libnl-devel libnfnetlink-devel

    # yum 安装软件包
    yum -y install make autoconf automake openssl-devel libnl3-devel ipset-devel iptables-devel 
    file-devel net-snmp-devel glib2-devel json-c-devel pcre2-devel libnftnl-devel libmnl-devel 
    python-sphinx epel-release python-sphinx_rtd_theme latexmk 
    texlive texlive-titlesec texlive-framed texlive-threeparttable texlive-wrapfig texlive-multirow 
    libnl libnl-devel libnfnetlink-devel
    
    # 解压
    cd /ups/soft
    tar -xf keepalived-2.0.18.tar.gz
    or
    curl --progress http://keepalived.org/software/keepalived-2.0.18.tar.gz | tar xz
    # 编译安装
    cd keepalived-2.0.18
    ./configure --prefix=/ups/app/mysql/keepalived
    or
    ./configure --prefix=/ups/app/mysql/keepalived --with-init=systemd     <<<<<<-- rhel7
    make --jobs $(grep -ci processor /proc/cpuinfo) && make --jobs $(grep -ci processor /proc/cpuinfo) install
    
    # 配置服务
    -- rhel6
    mkdir -p /etc/keepalived
    cp /ups/app/mysql/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
    cp /ups/soft/keepalived-2.0.18/keepalived/etc/init.d/keepalived /etc/init.d/
    chmod +x /etc/init.d/keepalived
    cp /ups/app/mysql/keepalived/etc/sysconfig/keepalived /etc/sysconfig/keepalived
    cp /ups/app/mysql/keepalived/sbin/keepalived /usr/sbin/
    -- 参考附录keepalived.conf配置
    chkconfig keepalived on
    
    -- rhel7
    mkdir -p /etc/keepalived
    cp /ups/app/mysql/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
    cp /ups/app/mysql/keepalived/etc/sysconfig/keepalived /etc/sysconfig/keepalived
    -- 可选 cp /ups/soft/keepalived-2.0.18/keepalived/keepalived.service /usr/lib/systemd/system/keepalived.service
    systemctl enable keepalived.service
    systemctl start keepalived.service
    systemctl status keepalived.service
    
    # 配置keepalived 日志
    vi /etc/sysconfig/keepalived
    修改
    KEEPALIVED_OPTIONS="-D -d -S 0"
    vi /etc/rsyslog.conf
    local0.*                                                /var/log/keepalived.log
    or
    echo 'local0.*                                                /var/log/keepalived.log' >>/etc/rsyslog.conf


    2.2 配置文件说明

        keepalived服务安装完成之后,后面的主要工作就是在keepalived.conf文件中配置HA和负载均衡。一个功能比较完整的常用的keepalived配置文件,主要包含三块:全局定义块、VRRP实例定义块和虚拟服务器定义块。全局定义块是必须的,如果keepalived只用来做ha,虚拟服务器是可选的。下面是一个功能比较完整的配置文件模板

    vi /etc/keepalived/keepalived.conf
    
    ! Configuration File for keepalived   # 这部分配置好了就可以启动,Keepalived就开始互相监听Keepalived服务了。
    
    # 全局配置 ,主要是通知机制及静态路由配置,还可以定义静态路由,但非必要,所以这里没给默认值
    global_defs {
       notification_email { #收件人
            #acassen@firewall.loc          # 这三个均为收件人
            #failover@firewall.loc
            #sysadmin@firewall.loc
       }
       # notification_email_from Alexandre.Cassen@firewall.loc     # 发件人
       # smtp_server 127.0.0.1                                     # 发件服务器, 需要系统开启sendmail服务
       # smtp_connect_timeout 30                                   # 发件连接超时
       router_id LVS_PG_HA1                                         # 路由器标示,随便给一个字符串
       # lvs_id LVS_PG1                                            # lvs负载均衡器标识,在一个网络内,它的值应该是唯一的。
    }
    
    # VRRP 实例定义块
    vrrp_sync_group VG1 {   # 同步vrrp级,用于确定失败切换(FailOver)包含的路由实例个数。在有2个负载均衡器的场景,当某个负载均衡器失效,需要自动切换到另外一个负载均衡器的实例
        group {             # 至少要包含一个vrrp实例,vrrp实例名称必须和vrrp_instance定义的一致
            VI_1
        }
        notify_master /etc/keepalived/script_master.sh
    #        (or notify_master “ /path_to_script/script_master.sh <arg_list>”)
    #    notify_backup /path_to_script/script_backup.sh
    #        (or notify_backup “/path_to_script/script_backup.sh <arg_list>”)
    #    notify_fault /path_to_script/script_fault.sh
    #        (or notify_fault “ /path_to_script/script_fault.sh <arg_list>”)
    }
    
    # 配置vrrpd 定义虚拟路由器 VI_1 虚拟路由的标示名称,随意取名 state MASTER
    vrrp_instance VI_1 {                   # vrrp实例名
        state MASTER                       # MASTER|BACKUP
        virtual_router_id 51               # 虚拟路由ID,每个虚拟路由都需要有id号,vmac的最后一段地址,最大255,一套Keepalived 应该是相同的id
        interface ens32                    # 对外提供服务的网卡接口,即VIP绑定的网卡接口
        mcast_src_ip 127.0.0.1             # 指定VRRP播发IP头的SRC IP地址值(本机IP地址)
        priority 1000                      # 在VRRP路由器中指定实例优先级,取值范围0~254,高的为master,高的会在恢复的时候抢过来
        advert_int 1                       # MASTER与BACKUP节点间同步检查的时间间隔,单位为秒
        nopreempt                          # 禁止抢占服务。默认情况,当MASTER服务挂掉之后,BACKUP自动升级为MASTER并接替它的任务,当MASTER服务恢复后,升级为MASTER的BACKUP服务又自动降为BACKUP,把工作权交给原MASTER。当配置了nopreempt,MASTER从挂掉到恢复,不再将服务抢占过来。
        smtp_alert                         # 有故障时是否激活邮件通知
        lvs_sync_daemon_interface ens32    # 负载均衡器之间的监控接口,类似于 HA HeartBeat 的心跳线。但它的机制优于 Heartbeat,因为它没有“裂脑”这个问题,它是以优先级这个机制来规避这个麻烦的。在 DR 模式中,lvs_sync_daemon_inteface与服务接口interface使用同一个网络接口
        authentication {                   # 认证机制
            auth_type PASS                 # 明文机制,或者ssl认证 (PASS|AH)
            auth_pass 111111               # 认证密码
        }
    
        virtual_ipaddress {                # VIP 地址, 每个IP占一行
            # Block limited to 20 IP addresses @IP
            192.168.10.202
        }
    }
    
    # 虚拟服务器定义块
    virtual_server 192.168.10.202 5432 {                 # virtual_server (@IP PORT)|(fwmark num)
        delay_loop 2                                     # 健康检查时间间隔,单位:秒
        lb_algo rr                                       # rr|wrr|lc|wlc|sh|dh|lblc 负载均衡调度算法,互联网应用常用方式为wlc或rr
        lb_kind DR                                       # NAT|DR|TUN 负载均衡转发规则,一般使用路由(DR)转发规则
        persistence_timeout 50                           # http服务会话保持时间,单位:秒
        protocol TCP                                     # TCP|UDP 转发协议
        real_server 192.168.10.181 5432 {                # 真实服务器IP和端口,可以定义多个
            weight 1                                     # 负载权重,值越大,转发的优先级越高
            notify_down /etc/keepalived/postgresql11.sh  # 服务停止后执行的脚本
            TCP_CHECK {                                  # 服务有效性检测
                connect_port 5432                        # 服务连接端口
                connect_timeout 10                       # 服务连接超时时长,单位:秒
                nb_get_retry 3                           # 服务连接失败重试次数
                delay_before_retry 3                     # 重试连接间隔,单位:秒
            }
        }
    
        real_server 192.168.10.182 5432 {
            weight 1
            notify_down /etc/keepalived/postgresql11.sh
            TCP_CHECK {
                connect_port 5432
                connect_timeout 10
                nb_get_retry 3
                delay_before_retry 3
            }
        }
    
        # real_server @IP PORT {
        #     weight num
        #     MISC_CHECK {
        #         misc_path /path_to_script/script.sh(or misc_path “/path_to_script/script.sh <arg_list>”)
        #     }
        # }
    
        # real_server @IP PORT {
        #     weight num
        #     HTTP_GET|SSL_GET {
        #         url {
        #             # You can add multiple url block path alphanum
        #             digest alphanum
        #         }
        #         connect_port num
        #         connect_timeout num
        #         nb_get_retry num
        #         delay_before_retry num
        #     }
        # }
    }
    
    
    -- 相关脚本
    cat >> /etc/keepalived/postgresql11.sh < EOF
    #!/bin/sh
    systemctl stop keepalived || pkill keepalived
    EOF
    
    -- arp需要安装net-tools [yum -y install net-tools ]
    cat >>  /etc/keepalived/script_master.sh < EOF
    #!/bin/bash
    VIP=192.168.10.202
    GATEWAY=192.168.10.2
    ETH_NAME=ens32
    /sbin/arping -I ${ETH_NAME} -c 5 -s ${VIP} ${GATEWAY} &>/dev/null
    EOF
  • 相关阅读:
    JAVA学习第五十四课 — IO流(八)打印流 &amp; 序列流
    jdbc框架 commons-dbutils+google guice+servlet 实现一个例子
    java ThreadLocal 理解
    jdbc框架 commons-dbutils的使用
    Java 集合系列06之 Vector详细介绍(源码解析)和使用示例
    Java 集合系列05之 LinkedList详细介绍(源码解析)和使用示例
    Java 集合系列04之 fail-fast总结(通过ArrayList来说明fail-fast的原理、解决办法)
    Java 集合系列03之 ArrayList详细介绍(源码解析)和使用示例
    Java 集合系列02之 Collection架构
    Java 集合系列01之 总体框架
  • 原文地址:https://www.cnblogs.com/binliubiao/p/12595122.html
Copyright © 2011-2022 走看看