zoukankan      html  css  js  c++  java
  • Keepalived 配置高可用

    VRRP协议及Keepalived原理使用

      VRRP 协议即 Virtual Router Redundancy Protocol,虚拟路由器冗余协议, 为了解决局域网内默认网关单点失效的问题. 

     VRRP 将局域网内的一组路由器组成一个虚拟路由器组,每个路由器都有自己的局域网地址, 根据设置的优先级最高决定那个是master路由器, 

    然后网关地址赋给该主路由器, 该主路由器定时发送VRRP报文向虚拟路由器组公布健康状况, 备份的路由器根据柏爱文判断Master路由器是否工作正常,从而决定是否要接替它. VRRP说白了就是实现IP地址漂移的,是一种容错协议。在下图中,Router A(10.100.10.1)Router B(10.100.10.2)Router C(10.100.10.3) 组成一个虚拟路由器。各虚拟路由器都有自己的IP地址。局域网内的主机将虚拟路由器设置为缺省网关。 Router ARouter BRouter C中优先级最高的那台路由器作为Master路由器,比如A,承担网关的功能。局域网内的服务 只知道这台主master路由器A的存在,将自己缺省路由下一跳地址设置为该路由的ip地址10.100.10.1, 其余两台路由器作为Backup路由器。当master路由器出故障后, backup路由器会根据优先级重新选举出新的master路由器承担网关功能。Master路由器周期性地发送VRRP报文, 在虚拟路由器中公布其配置信息(优先级等)和工作状况。Backup路由器通过接收到VRRP报文的情况来判断Master路由器是否工作工常。

    image

    而keepalived 使用的就是VRRP协议, 不过它作用在多台主机上, 而不是路由器组上. 
    比如我们现在准备搭建的配置:
    主机: 192.168.0.7
    从机: 192.168.0.8
    vip虚拟主机: 192.168.0.12
    
    访问的时候我们的地址都填 192.168.0.12, 由它决定目前绑定在那个网卡上就由那台机器进行服务, 如果刚好服务的这台机器挂了,它就会绑定到下一台正常的机器的网卡上去,由新机器处理请求,由此实现高可用和避免单点故障. 
    
                                      |--- 13  web机
                 |---- 07转发(ng) ---- |--- 14  go程序
                 |                    |--- 15  php-cgi
     请求 --> 12-|   
                 |
                 |---- 08 (时刻待命取代07)
    
    1)keepalived简介
        keepalived使用的是VRRP协议方式。简单的说就是,Keepalived的目的是模拟路由器的高可用,Heartbeat或Corosync的目的是实现Service的高可用。
        
    keepalived是模块化设计,不同模块负责不同的功能,下面是keepalived的组件 :
    @1. core 模块
    是keepalived的核心,负责主进程的启动和维护,全局配置文件的加载解析等 。
    @2. check模块
    负责healthchecker(健康检查),包括了各种健康检查方式,以及对应的配置的解析包括LVS的配置解析 。
    @3. vrrp模块
    VRRPD子进程,VRRPD子进程就是来实现VRRP协议的 。
    @4. libipfwc模块
    iptables(ipchains)库,配置LVS会用到 。
    @5. libipvs* 模块
    配置LVS会用到 备注:keepalived和LVS完全是两码事,只不过他们各负其责相互配合而已。 keeplived 是检测机器的健康状况, 发现病体机器将其移除, lvs 是实现多台机器都均衡处理请求.
    
    
    keepalived 开始搭建
    在主从机器上各自安装好keeepalived 
    下载链接: http://www.keepalived.org/download.html
    或者 wget http://www.keepalived.org/software/keepalived-2.0.2.tar.gz
    
    然后解压进入目录执行安装三板斧
    ./configure --prefix=/usr/local/keepalived && make && make install
    
    
    编辑配置文件
    mkdir /etc/keepalived  -p           #新建配置目录
    #复制默认配置到/etc/keepalived 目录去(别拼错,否则默认加载失败的,到时程序都起不来就只能用-f指定配置路径了)
    cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
    
    然后编辑配置文件
    vim /usr/local/etc/keepalived/keepalived.conf
    
    内容如下:(只保留这两节即可,其他的是lvs的配置的,暂时去掉)
    ! Configuration File for keepalived
    global_defs {
       notification_email {
         acassen@firewall.loc
         failover@firewall.loc
         sysadmin@firewall.loc
       }
       notification_email_from Alexandre.Cassen@firewall.loc
       smtp_server 192.168.200.1
       smtp_connect_timeout 30
       router_id NodeA              #节点名,唯一,08可以叫NodeB
       #vrrp_strict                 #把这王八蛋注释掉,不然严格遵守vvrp协议,访问不了vip的
       vrrp_skip_check_adv_addr
       vrrp_garp_interval 0
       vrrp_gna_interval 0
    }
    
    vrrp_instance VI_1 {
        state MASTER                #名字唯一,主机07填MASTER,从机08填BACKUP
        interface eth0              #网卡名,跟你机器对应上
        virtual_router_id 51        #主从机器保持统一
        priority 150                #设置主机的值大于从机即可
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111       #不动
        }
        virtual_ipaddress {
            192.168.0.12/24  
            #你要的虚拟ip的地址,自己填一个,别填已经使用的即可.(填不填子网号24看你,本人亲测有没有都ok,之所以填写是因为执行ip a 查看到eth0网卡上也有192.168.0.7/24 字样)
        }
    }
    
    上面各自按照要求都配置好后执行启动:
     /usr/local/keepalived/sbin/keepalived -D 
    如果指定配置文件路径可以使用-f:  /usr/local/keepalived/sbin/keepalived -D  -f /tmp/keepalived.conf
    

    查看运行

    @1.使用ip a 命令查看网卡绑定的详细信息, ifconfig只会显示默认的那个,不显示其他的绑定
    [root@07 keepalived]# ip a
    eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
        link/ether 00:1c:42:dc:15:9a brd ff:ff:ff:ff:ff:ff
        inet 192.168.0.7/24 brd 192.168.0.255 scope global eth0
           valid_lft forever preferred_lft forever
        inet 192.168.0.12/24 scope global secondary eth0             <--- 12也在这个网卡下
           valid_lft forever preferred_lft forever
        inet6 fe80::21c:42ff:fedc:159a/64 scope link
           valid_lft forever preferred_lft forever
           
           
           
    @2. 两台主机的keepalived都检查运行后, 192.168.0.3 上(或局域网内的任意一台机器上)运行下 arp -an (扫描查看以太网内所有主机的mac信息)
    PS:不要在主从机上执行, 因为不完整,不会显示vip的信息的
    ➜  ~ arp -an
    ? (192.168.0.1) at a4:56:2:92:c2:73 on en0 ifscope [ethernet]
    ? (192.168.0.7) at 0:1c:42:dc:15:9a on en0 ifscope [ethernet]
    ? (192.168.0.8) at 0:1c:42:c0:7a:40 on en0 ifscope [ethernet]
    ? (192.168.0.12) at 0:1c:42:dc:15:9a on en0 ifscope [ethernet]
    ? (224.0.0.251) at 1:0:5e:0:0:fb on en0 ifscope permanent [ethernet]
    ? (239.255.255.250) at 1:0:5e:7f:ff:fa on en0 ifscope permanent [ethernet]
    
    可看到 12机器后面的mac地址跟07的是一样的, 这说明192.168.0.12这个vip也绑定到跟07一个共同网卡上了.
    
    然后在07上查看日志, keepalived 日志在 /var/log/message 里
    [root@07 keepalived]# tail -f /var/log/messages
    Jun 15 16:28:20 07 Keepalived_vrrp[1716]: Sending gratuitous ARP on eth0 for 192.168.0.12
    Jun 15 16:28:20 07 Keepalived_vrrp[1716]: Sending gratuitous ARP on eth0 for 192.168.0.12
    Jun 15 16:28:20 07 Keepalived_vrrp[1716]: Sending gratuitous ARP on eth0 for 192.168.0.12
    Jun 15 16:28:20 07 Keepalived_vrrp[1716]: Sending gratuitous ARP on eth0 for 192.168.0.12
    
    由上提示意思是 各位以太网小伙伴们注意了 192.168.0.12 的mac地址在我的网卡上,你们来这找它啊!
    
    如果都OK 了, 那么在以太网内任意机器上 ping 一下vip地址, 如果能ping通, 并且主从机也能ping通, 基本就没问题了. 
    [root@08 keepalived]# ping 192.168.0.12
    PING 192.168.0.12 (192.168.0.12) 56(84) bytes of data.
    64 bytes from 192.168.0.12: icmp_seq=1 ttl=64 time=0.327 ms
    64 bytes from 192.168.0.12: icmp_seq=2 ttl=64 time=0.577 ms
    
    运行测试
    然后在主从机器上各自搭建ng+php访问, 
    curl http://192.168.0.8/index.php 的输出内容为 "i am 08";
    curl http://192.168.0.7/index.php 的输出内容为 "i am 07";
    都能访问的话, 用vip地址来访问, 因为现在vip绑定的是07的网卡,因此应该也输出"i am 07"
    curl http://192.168.0.12/index.php    #输出 "i am 07" , 非常成功.
    
    现在我把07机器关掉, 再其他机器上用arp -an 查看局域网内的mac信息
    ➜  ~ arp -an
    ? (192.168.0.1) at a4:56:2:92:c2:73 on en0 ifscope [ethernet]
    ? (192.168.0.7) at 0:1c:42:dc:15:9a on en0 ifscope [ethernet]
    ? (192.168.0.8) at 0:1c:42:c0:7a:40 on en0 ifscope [ethernet]
    ? (192.168.0.12) at 0:1c:42:c0:7a:40 on en0 ifscope [ethernet]
    ? (224.0.0.251) at 1:0:5e:0:0:fb on en0 ifscope permanent [ethernet]
    ? (239.255.255.250) at 1:0:5e:7f:ff:fa on en0 ifscope permanent [ethernet]
    对比下上面的,发现12地址的mac信息, 立马绑定成跟08的mac地址一样了, 说明现在它们共用网卡了,避免了单点故障. 
    
    再次访问
    ➜  ~ curl http://192.168.0.12/index.php
    i am 08 ...
    
    vip成功转移到192.168.0.8这台机器上,于是keepalived成功了. 
    

    --> PS: 一旦ping不通(dns的问题我不管)首先把看下是否去掉了配置文件里的 vrrp_strict [它表严格执行vvrp协议,还不行再把防火墙搞掉], 否则搞死你半天都不知咋回事.

    在有“vrrp_strict”的时候,就会有下面的iptables规则:
    [root@centos ~]# iptables -nL
    Chain INPUT (policy ACCEPT)
    target prot opt source destination 
    DROP all -- 0.0.0.0/0 192.168.111.130
    
    把这个选项去掉了之后,重新启动keepalived就完全没有了。
    

    附上即是通知以太网内vip更新mac信息的指令

    说不定arp开启了缓存, 你ping不通的原因可能也是这个, 因此主动向局域网内的成员推送12这台新增vip的mac信息
    
    arping  -c 5 -U -I eth0 192.168.1.12
    
    -c 表示要发多少个广播包。
    -U 非请求模式,更新同网段设备上的arp缓存。
    -I 通过哪个接口发送数据包,这个会使用到这个网卡的mac的地址。
  • 相关阅读:
    iOS
    iOS
    iOS
    Xcodeproject详解
    Swift
    iOS
    iOS
    错误 1 无法将文件“objDebugXXX.exe”复制到“binDebugXXX.exe”。文件“binDebugXXX.exe”正由另一进程使用,因此该进程无法访问该文件
    【转载】SQL注入原理讲解
    在“安装”阶段发生异常。 System.Security.SecurityException: 未找到源,但未能
  • 原文地址:https://www.cnblogs.com/zyp221314/p/9188285.html
Copyright © 2011-2022 走看看