Linux集群实现高可用--keepalived

高可用:
lvs本身不支持高可用;

在lvs集群中,可能有两种故障:
    1.Director故障不可用;
        keepalived:原生的lvs的Director高可用解决方案;
        heartbeat
        corosync/pacemaker:通用的高可用解决方案;

    2.后端RS故障不可用;
        lvs的Director不考虑后端RS的可用与否,只是按照调度算法进行客户端请求调度;
        完整的实现:周期性的对各个RS进行健康状态检测;
            检测失败:应该从lvs集群服务中将对应的RS移除;
            检测成功:将对应RS重新加入lvs集群服务中;重新创建lvs集群服务;
            所有的RS检测均失败:临时删除lvs集群服务,并使调度器本地的web服务能够响应一个相对比较友好的错误页面,sorry_server;

        检测方式:
            网络层检测;ping
            传输层检测:端口探测,nmap
            应用层检测:文件资源的存在性检测;文件访问权限检测;文件内容有效性检测;

        keepalived:后端RS的健康状态检测;

可用性:
    A=MTBF/(MTBF+MTTR)
    A ∈ (0,1)
    50%, 90%, 95%
    99%, 99.9%, 99.99%, 99.999%

    提高可用性的有效的方案:降低MTTR;
        方法:冗余 + 自动故障倒换;

高可用的内容:
    服务高可用;
    资源高可用;

HA Cluster实现方案:
基于VRRP协议的实现:
keepalived,专用于高可用lvs的Director;

基于AIS的实现:完备的HA集群;
    heartbeat
    corosync + pacemaker

keepalived:
VRRP协议:Virtual Redundancy Router Protocol,虚拟路由器冗余协议;
VRRP技术术语:
虚拟路由器:虚拟的路由器的接口;
VRID:虚拟路由器标识符,描述路由器的分组;并且可以确定虚拟路由器的虚拟MAC地址,取值范围为:0-255(00-ff);
MASTER:虚拟IP地址的拥有者,可以利用虚拟IP地址接收用户请求,并且能够完成数据转发功能;
BACKUP:不参与数据转发,仅检测MASTER的健康状态;
虚拟IP地址:VIP,虚拟路由器接口的IP地址;
虚拟MAC地址:VMAC,00-00-5e-00-01-{VRID}
优先级:选举成为MASTER的主要的参考标准,取值范围为:0-255;
0:放弃MASTER选举;
255:虚拟IP地址和某个路由器接口的IP地址相同,则该路由器会自动获得255的优先级,从而直接成为MASTER;
1-254:越大越有可能成为MASTER;
非抢占式:如果MASTER故障导致状态发生变化,则所有的BACKUP会重新选举产生新的MASTER;此时,如果原来的MASTER从故障中恢复,则直接成为BACKUP状态,直到当前的MASTER故障之后,所有的BACKUP重新选举MASTER时,其才能重新称为新的MASTER;
抢占式:如果MASTER故障导致状态发生变化,则所有的BACKUP会重新选举产生新的MASTER;此时,如果原来的MASTER从故障中恢复,则立即通告自己的优先级并启动新一轮选举,之后重新成为MASTER;

VRRP的认证方式:
    无认证
    简单字符串认证
    MD5

VRRP的工作模式:
    单个实例:MASTER/BACKUP
    多个实例:MASTER/BACKUP, MASTER/MASTER

keepalived:
VRRP协议在linux系统中的应用实现;最初的设计目的就是为了高可用ipvs调度器;某些场合,简称其为"ka";

keepalived通过调用内核中的系统调用接口完成ipvs的规则编写,从而可以用于管理lvs集群服务;所有的规则,都定义在其配置文件中;

keepalived还可以对VIP地址进行浮动设置;

keepalived还可以为后端各RS提供健康状态检测,可以基于传输层及应用层实现;

keepalived还可以基于外部脚本调用接口完成脚本中定义的功能,甚至可以高可用其他的非lvs服务;

keepalived在RHEL 6.4+或CentOS 6.4+的发行版本的操作系统中,被收录到官方系统光盘镜像之中,直接基于本地Base源使用yum命令完成安装即可;

keepalived的组件:
控制面板:配置文件分析器;
内存管理组件;
IO复用器组件;
核心组件:
VRRP Stack:实现VRRP协议功能的组件;
Checkers:后端RS做健康状态检测的组件;
SMTP:调用SMTP协议,将路由器状态转换的消息以邮件的形式发送到指定管理员邮箱;
Watch Dog:监控Checkers和VRRP Stack的工作状态;如果异常,负责重新启动keepalived进程;
ipvs wrapper:向内核中的ipvs框架传输ipvs规则,用于构建、管理、移除lvs集群服务及集群中的RS的组件;
netlink reflactor:管理虚拟路由器接口;

配置HA Cluster的前期准备:
1.各个节点主机之间时间必须同步,可以使用时间服务器,如ntp或chrony;
2.确保iptables和SELinux的规则不会阻碍各个节点之前的数据通信;
3.各个节点主机之间需要通过主机名互相通信(对ka并非必须);
4.出于安全考量,各个节点主机之间可以以root用户的身份,基于密钥认证的方式进行ssh通信(对于ka非必须);

keepalived安装:
在CentOS 7.2中,直接使用光盘镜像yum仓库,使用yum install keepalived安装即可;

程序环境:
    主配置文件:/etc/keepalived/keepalived.conf
    主程序文件:/usr/sbin/keepalived
    Unit File:/usr/lib/systemd/system/keepalived.service

主配置文件的结构:
    GLOBAL CONFIGURATION
        Global definitions
    global_defs {
        notification_email {
               root@localhost //配置接收邮件通知的邮箱地址;
        }
        notification_email_from keepalived@localhost
        smtp_server 127.0.0.1  //设定用于发送电子邮件的邮件服务器;
        smtp_connect_timeout 30      # integer, seconds
        router_id my_hostname //设置路由器ID,仅仅为了区分不同的设备而已;如果不修改,也不会影响keepalived服务本身;
        vrrp_mcast_group4 224.0.0.18 //设置发送VRRP协议通过的目标组播通信地址;必须保证所有参数选举的路由器都必须有相同的组播通信地址;
    }

    VRRPD CONFIGURATION
        vrrp_instance inside_network { //定义VRRP的实例及实例名称;
            state MASTER  //指定当前设备的初始状态;
            interface eno16777736 
                //指定被VRRP协议绑定的网络接口,即发送VRRP通过信息的网络接口;
            virtual_router_id 51 //指定虚拟路由器标识,用于确定VRRP备份组;
            priority 100 //指定当前节点的优先级,指定的范围为:1-254;
            advert_int 1 //发送VRRP通过的时间间隔,单位是秒;
            authentication {
                auth_type PASS //设置VRRP协议各节点之间的认证方式,PASS表示简单密码
                auth_pass MTUwPBjd //设置认证密码,不超过8个字符;
            }
            virtual_ipaddress {
                <IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL>
            } //设置虚拟IP地址的专用上下文
            nopreempt //设置当前节点为非抢占模式,默认为抢占模式;
            preempt_delay 300 //抢占模式开始前的延迟时间;
            notify_master <STRING>|<QUOTED-STRING>
            notify_backup <STRING>|<QUOTED-STRING>
            notify_fault <STRING>|<QUOTED-STRING>
                //设置当当前服务器状态发生变化时,所触发的脚本文件的路径及相关参数;
            track_script {
                SCRIPT_NAME
            }
        }

    LVS CONFIGURATION

        virtual server vip vport | fwmark <INT> {
            delay_loop <INT>  //服务轮询的时间间隔设定;
            lb_algo rr|wrr|lc|wlc|lblc|sh|dh //指定负载均衡调度算法;
            lb_kind NAT|DR|TUN //指定负载均衡集群的类型;
            persistence_timeout <INT> //启用持久连接并设置超时时间;
            protocol TCP //负载均衡服务支持的协议;目前仅支持TCP;
            sorry_server <IPADDR> <PORT>  //如果后端RS全部不可用,则需要临时删除lvs集群服务,并设置本地的http服务为sorry-server,提供友好的错误页面;
            real_server <IPADDR> <PORT> {
                weight <INT>  //指定当前RS的权重;
                notify_up <STRING>|<QUOTED-STRING>
                notify_down <STRING>|<QUOTED-STRING>
                    //当RS的状态转为UP或DOWN时,发送通知所使用的脚本路径及参数设定;
                HTTP_GET|SSL_GET {
                    url {
                        path <STRING> //指定进行后端RS健康状态检测的URL地址;
                        digest <STRING> //比较被检测资源的md5值是否发生变化;
                        status_code <INT> //根据响应报文的状态码进行后端RS的健康状态检测;
                    }
                    nb_get_retry <INT>  //指定对后端RS进行健康状态检测重试的次数上限;
                    delay_before_retry <INT> //每次重试之前的延迟时间;
                    connect_ip <IP ADDRESS>
                    connect_port <PORT>
                        //向后端RS的哪个IP地址和哪个端口发出健康状态检测请求;
                    bindto <IP ADDRESS>
                    bind_port <PORT>
                        //向后端RS发出健康状态检测请求的源IP地址和源端口号;
                    connect_timeout <INTEGER>  //连接超时时间;
                }
                TCP_CHECK {
                    connect_ip <IP ADDRESS>
                    connect_port <PORT>
                        //向后端RS的哪个IP地址和哪个端口发出健康状态检测请求;
                    bindto <IP ADDRESS>
                    bind_port <PORT>
                        //向后端RS发出健康状态检测请求的源IP地址和源端口号;
                    connect_timeout <INTEGER>  //连接超时时间;
                }
            }
        }

猜你喜欢

转载自blog.51cto.com/chenliangdeeper/2125796