zoukankan      html  css  js  c++  java
  • keepalived + lvs

    Keepalived原理
    
    Keepalived原理
    keepalived也是模块化设计,不同模块复杂不同的功能,下面是keepalived的组件
    core check vrrp libipfwc libipvs-2.4 libipvs-2.6
    
    core:是keepalived的核心,复杂主进程的启动和维护,全局配置文件的加载解析等
    check:负责healthchecker(健康检查),包括了各种健康检查方式,以及对应的配置的解析包括LVS的配置解析
    vrrp:VRRPD子进程,VRRPD子进程就是来实现VRRP协议的
    libipfwc:iptables(ipchains)库,配置LVS会用到
    libipvs*:配置LVS会用到
    注意,keepalived和LVS完全是两码事,只不过他们各负其责相互配合而已
    
     
    
    keepalived启动后会有三个进程
    父进程:内存管理,子进程管理等等
    子进程:VRRP子进程
    子进程:healthchecker子进程
    
    有图可知,两个子进程都被系统WatchDog看管,两个子进程各自复杂自己的事,healthchecker子进程复杂检查各自服务器的健康程度,例如HTTP,LVS等等,如果healthchecker子进程检查到MASTER上服务不可用了,就会通知本机上的兄弟VRRP子进程,让他删除通告,并且去掉虚拟IP,转换为BACKUP状态
    genhash 用法:
    [root@localhost bin]# ./genhash -s 192.168.100.101 -p 80 -u /       #genhash http 页面探测时检查hash 值,首先要获取hash 值
    MD5SUM = 47f174a067d193f370407ec4aa882ab0
    
    [root@localhost bin]# 

    配置文件详解:本次测试着重点在keepalived 中使用LVS 功能

    [root@localhost keepalived]# cat keepalived.conf
    ! Cconfiguration File for keepalived
    
    global_defs {     #全局配置段
        notification_email {    #定义报警邮件接收地址
        test1@ppap.com
        test2@ppap.com
        test3@ppap.com
        }
        notification_email_from  error_from@ppap.com     #定义告警邮件发送邮箱
        smtp_server   114.114.114.114      #定义邮箱服务器
        smtp_connect_timeout 30            #定义邮件发送超时时间
        router_id  lvs_1               #定义路由标识信息,相同局域网唯一
    }  
    
    vrrp_instance VI_1 {     #定义vrrp 实例,实例可以定义多个,在主+主,主+主+备 分别在不通服务器调用
        state MASTER         #状态参数,标识在当前主机上,实列状态,有master/backup
        interface ens33      #指定绑定虚IP的网卡设备
        virtual_router_id 51  #路由 id 标识,用于区分不同vrrp 实例,相同实例id 必须一致:[0-255]  
        priority  100        #定义当前实例的优先级,优先级大小决定主备
        advert_int 1         #主备通讯时间间隔
     
        authentication {
        auth_type  PASS   #定义实例认证类型
        auth_pass  1111   #定义认证密码
        }
        virtual_ipaddress {   #定义vrrp 需要发布的虚拟ip ,可以绑定网卡
         192.168.100.201/24
         192.168.100.202/24
         192.168.100.203/24  dev eth2 label eth2:1     指定网卡和名称
        }
    
        nopreempt             #开启不抢占功能,默认抢占
    }
    
    virtual_server 192.168.100.201 80 {        #定义虚拟服务地址端口
    
        delay_loop 10         #查询后端real_server 状态间隔时间
        lvs_sched  wlc        #定义lvs 负载算法 
        lvs_method DR         #定义lvs 模式
        persistence_timeout  300   #定义会话保持时间 
        protocol    TCP           #定义负载协议为tcp    
        
        real_server 192.168.100.101 80 {   #定义real_server
        weight  1         #设置权重为1 ,默认为1
        uthreshold  10000   #最大连接阈值
        TCP_CHECK {       
            connect_timeout 5   #定义探测超时时间默认为5 s
            retry           3   #尝试三次
    
        }
        }
       real_server 192.168.100.103 80 {
        weight 1           # 设置权重为1,默认1
        uthreshold 5000    # 设置连接最大阈值
        HTTP_GET {
            url {
            path /
            digest c32410fe653866bfc3e85c896a4abc94
            status_code 200   #正常应该是 200 状态码
            
            }
            connect_timeout 5    #定义探测超时时间,默认5s
            retry 3    #     尝试 3  次
        }
        }    
    
        
    }

    测试结果:

    [root@localhost keepalived]# ip addr 
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host 
           valid_lft forever preferred_lft forever
    2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
        link/ether 00:50:56:2d:b8:9a brd ff:ff:ff:ff:ff:ff
        inet 192.168.100.100/24 brd 192.168.100.255 scope global noprefixroute ens33
           valid_lft forever preferred_lft forever
        inet 192.168.100.201/24 scope global secondary ens33
           valid_lft forever preferred_lft forever
        inet 192.168.100.202/24 scope global secondary ens33
           valid_lft forever preferred_lft forever
        inet6 fe80::18a9:d1fe:4955:8559/64 scope link noprefixroute 
           valid_lft forever preferred_lft forever
    [root@localhost keepalived]# ipvsadm -L -n
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags
      -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
    TCP  192.168.100.201:80 wlc persistent 300
      -> 192.168.100.101:80           Route   1      0          4         
      -> 192.168.100.103:80           Route   1      0          0         

     停止其中一个节点服务:  重启节点只能重新加载keepalived 配置

    [root@localhost /]# systemctl stop httpd
    [root@localhost /]# 
    Mar  1 04:30:12 localhost Keepalived_healthcheckers[2966]: Error connecting server [192.168.100.103]:80.
    
    Mar  1 04:30:15 localhost Keepalived_healthcheckers[2966]: Error connecting server [192.168.100.103]:80.
    Mar  1 04:30:15 localhost Keepalived_healthcheckers[2966]: Check on service [192.168.100.103]:80 failed after 1 retry.
    Mar  1 04:30:15 localhost Keepalived_healthcheckers[2966]: Removing service [192.168.100.103]:80 from VS [192.168.100.201]:80
    Mar  1 04:30:15 localhost Keepalived_healthcheckers[2966]: Remote SMTP server [114.114.114.114]:25 connected.
  • 相关阅读:
    javaweb消息中间件——rabbitmq入门
    virtual box 桥接模式(bridge adapter)下无法获取ip(determine ip failed)的解决方法
    Apache Kylin本地启动
    git操作
    Java学习总结
    Java中同步的几种实现方式
    hibernate exception nested transactions not supported 解决方法
    vue 中解决移动端使用 js sdk 在ios 上一直报invalid signature 的问题解决
    cookie 的使用
    vue 专门为了解决修改微信标题而生的项目
  • 原文地址:https://www.cnblogs.com/zy09/p/10457687.html
Copyright © 2011-2022 走看看