Keepalived原理与配置

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/TZ_GG/article/details/52821662
Keepalived
    介绍:
        keepalived是所谓的高可用或热备用来防止单点故障的一种手段。
        keepalived是一个类似于layer3, 4 & 5交换机制的软件,也就是我们平时说的第3层、第4层和第5层交换。
    作用:
        Keepalived的作用是检测web服务器的状态,lvs+keepalived实现负载
    原理:
        keepalived是利用VRRP(虚拟路由冗余)协议来实现的高可用(HA),完全遵守VRRP协议包括竞选机制等等。
        keepalived是一个类似于layer3, 4 & 5交换机制的软件,Layer3,4&5工作在IP/TCP协议的IP层,TCP层,及应用层,原理分别如下:
          Layer3:Keepalived使用Layer3的方式工作式时,Keepalived会定期向服务器群中的服务器
                    发送一个ICMP的数据包(既我们平时用的Ping程序),如果发现某台服务的IP地址没有激活,Keepalived便报告这台服务器失效,并将它从服务器群中剔除,这种情况的典型例子是某台服务器被非法关机,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。Layer3的方式是以服务器的IP地址是否有效作为服务器工作正常与否的标准。
          Layer4: Layer4主要以TCP端口的状态来决定服务器工作正常与否。如webserver的服务
                    端口一般是80,如果Keepalived检测到80端口没有启动,则Keepalived将把这台服务器从服务器群中剔除。
             Layer5:Layer5就是工作在具体的应用层了,比Layer3,Layer4要复杂一点,在网络上占用的带宽也要大一些。Keepalived将根据用户
                    的设定检查服务器程序的运行是否正常,如果与用户的设定不相符,则Keepalived将把服务器从服务器群中剔除。
            vip即虚拟ip,是附在主机网卡上的,即对主机网卡进行虚拟,此IP仍然是占用了此网段的某个IP。
        keepalived的应用:
            一台为主服务器(MASTER),一台为备份服务器(BACKUP),但是对外表现为一个虚拟IP,主服务器会发送特定的消息给备份服务器,当备份服务器收不到这个消息的时候,即主服务器宕机的时候,备份服务器就会接管虚拟IP,继续提供服务,从而保证了高可用性
        keepalived也是模块化设计不同模块复杂不同
            core: 是keepalived的核心,负责主进程的启动和维护全局配置文件的加载解析等
            check:负责healthchecker(健康检查)包括了各种健康检查方式以及对应的配置的解析包括LVS的配置解析
            vrrp: VRRPD子进程,VRRPD子进程就是来实现VRRP协议的
        keepalived启动后会有三个进程
            内存管理子进程
            VRRP子进程
            healthchecker子进程
    配置文件:
        keepalived只有一个配置文件keepalived.conf,里面主要包括以下几个配置区域,分别是global_defs、static_ipaddress、static_routes、vrrp_script、vrrp_instance和virtual_server。
            
            global_defs区域:主要是配置故障发生时的通知对象以及机器标识
                global_defs {
                    notification_email {  #指定keepalived在发生切换时需要发送email到的对象,一行一个
                    [email protected]
                       }
                       notification_email_from [email protected] #指定发件人
                       smtp_server localhost #指定smtp服务器地址
                       smtp_connect_timeout 30 #指定smtp连接超时时间
                       enable_traps #开启SNMP陷阱(Simple Network Management Protocol)
                       router_id LVS_DEVEL #运行keepalived机器的一个标识
                }

            static_ipaddress和static_routes区域:static_ipaddress和static_routes区域配置的是是本节点的IP和路由信息。如果你的机器上
                   已经配置了IP和路由,那么这两个区域可以不用配置。其实,一般情况下你的机器都会有IP地址和路由信息的,因此没必要再在这两个区域配置。

            vrrp_script区域:用来做健康检查的,当时检查失败时会将vrrp_instance的priority减少相应的值。
                vrrp_script check_running {  
                       script "/usr/local/bin/check_running" #脚本的位置
                       interval 10     #脚本执行间隔
                       weight 10      #脚本结果导致的优先级变更10表示优先级+10-10则表示优先级-10
                }

            以上意思是如果script中的指令执行失败,那么相应的vrrp_instance的优先级会减少10个点。

            vrrp_instance和vrrp_sync_group区域
                vrrp_instance用来定义对外提供服务的VIP区域及其相关属性。
                vrrp_rsync_group用来定义vrrp_intance组,使得这个组内成员动作一致。举个例子来说明一下其功能:
                    两个vrrp_instance同属于一个vrrp_rsync_group,那么其中一个vrrp_instance发生故障切换时,另一个vrrp_instance也会跟着切换(即使这个instance没有发生故障)。

                    vrrp_sync_group VG_1{ #监控多个网段的实例
                        group {
                        inside_network #实例名
                        outside_network
                        }
                        notify_master /path/xx.sh #指定当切换到master时,执行的脚本
                        netify_backup /path/xx.sh #指定当切换到backup时,执行的脚本
                        notify_fault "path/xx.sh VG_1" #故障时执行的脚本
                        notify /path/xx.sh
                        smtp_alert #使用global_defs中提供的邮件地址和smtp服务器发送邮件通知
                    }

                    vrrp_instance inside_network {
                        state BACKUP #指定那个为master,那个为backup,如果设置了nopreempt这个值不起作用,主备考priority决定
                        interface eth0 #设置实例绑定的网卡
                        dont_track_primary #忽略vrrp的interface错误(默认不设置)
                        track_interface{ #设置额外的监控,里面那个网卡出现问题都会切换
                            eth0
                            eth1
                            }
                        mcast_src_ip #发送多播包的地址,如果不设置默认使用绑定网卡的primary ip
                        garp_master_delay #在切换到master状态后,延迟进行gratuitous ARP请求
                        virtual_router_id 50 #VPID标记
                        priority 99 #优先级,高优先级竞选为master
                        advert_int 1 #检查间隔,默认1秒
                        nopreempt #设置为不抢占 注:这个配置只能设置在backup主机上,而且这个主机优先级要比另外一台高
                        preempt_delay #抢占延时,默认5分钟
                            debug #debug级别
                        authentication { #设置认证
                            auth_type PASS #认证方式
                            auth_pass 111111 #认证密码
                            }
                        virtual_ipaddress { #设置vip
                            192.168.202.200
                            }
                        }

            virtual_server_group和virtual_server区域:virtual_server_group一般在超大型的LVS中用到,一般LVS用不过这东西,因此不多说
                virtual_server 192.168.202.200 23 {
                    delay_loop 6 #健康检查时间间隔
                    lb_algo rr  #lvs调度算法rr|wrr|lc|wlc|lblc|sh|dh
                       lb_kind DR  #负载均衡转发规则NAT|DR|RUN
                    persistence_timeout 5 #会话保持时间
                    protocol TCP #使用的协议
                    persistence_granularity <NETMASK> #lvs会话保持粒度
                    virtualhost <string> #检查的web服务器的虚拟主机(host:头)   
                    sorry_server<IPADDR> <port> #备用机,所有realserver失效后启用
                    real_server 192.168.200.5 23 {
                        weight 1 #默认为1,0为失效
                        inhibit_on_failure #在服务器健康检查失效时,将其设为0,而不是直接从ipvs中删除
                        notify_up <string> | <quoted-string> #在检测到server up后执行脚本
                        notify_down <string> | <quoted-string> #在检测到server down后执行脚本

                    TCP_CHECK {
                        connect_timeout 3 #连接超时时间
                        nb_get_retry 3 #重连次数
                        delay_before_retry 3 #重连间隔时间
                        connect_port 23  健康检查的端口的端口
                        bindto <ip>  
                          }
                    HTTP_GET | SSL_GET{
                        url{ #检查url,可以指定多个
                             path /
                             digest <string> #检查后的摘要信息
                             status_code 200 #检查的返回状态码
                            }
                        connect_port <port>
                        bindto <IPADD>
                        connect_timeout 5
                        nb_get_retry 3
                        delay_before_retry 2
                        }

                    SMTP_CHECK{
                        host{
                            connect_ip <IP ADDRESS>
                            connect_port <port> #默认检查25端口
                            bindto <IP ADDRESS>
                             }
                        connect_timeout 5
                        retry 3
                        delay_before_retry 2
                        helo_name <string> | <quoted-string> #smtp helo请求命令参数,可选
                        }
                    MISC_CHECK{
                        misc_path <string> | <quoted-string> #外部脚本路径
                        misc_timeout #脚本执行超时时间
                        misc_dynamic #如设置该项,则退出状态码会用来动态调整服务器的权重,返回0 正常,不修改;返回1,检查失败,权重改为0;返回2-255,正常,权重设置为:返回状态码-2
                        }
                    }

    keepalived主从切换
        主从切换比较让人蛋疼,需要将backup配置文件的priority选项的值调整的比master高50个点,然后reload配置文件就可以切换了。当时你也可以将master的keepalived停止,这样也可以进行主从切换。

参考文档:http://www.cnblogs.com/knitmesh/p/5439613.html

                    http://www.tuicool.com/articles/jYnQraB

VRRP参考:http://bbs.nanjimao.com/thread-790-1-1.html

猜你喜欢

转载自blog.csdn.net/TZ_GG/article/details/52821662