美文网首页
第四十一节、Keepalived高可用

第四十一节、Keepalived高可用

作者: 妄语莫言 | 来源:发表于2018-01-17 07:38 被阅读0次
    Keepalived介绍

    keepalived是一个类似于layer3, 4 & 7交换机制的软件,也就是我们平时说的第3层、第4层和第7层交换。
    Keepalived的作用是检测web服务器的状态,如果有一台web服务器、Mysql服务器宕机,或工作出现故障,Keepalived将检测到后,会将有故障的web服务器或者Mysql服务器从系统中剔除,当服务器工作正常后Keepalived自动将web、Mysql服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的WEB和Mysql服务器。
    Layer3,4&7工作在IP/TCP协议栈的IP层,TCP层,及应用层,原理分别如下:

    • Layer3:Keepalived使用Layer3的方式工作式时,Keepalived会定期向服务器群中的服务器发送一个ICMP的数据包(既我们平时用的Ping程序),如果发现某台服务的IP地址没有激活,Keepalived便报告这台服务器失效,并将它从服务器群中剔除,这种情况的典型例子是某台服务器被非法关机。Layer3的方式是以服务器的IP地址是否有效作为服务器工作正常与否的标准。
    • Layer4:如果您理解了Layer3的方式,Layer4就容易了。Layer4主要以TCP端口的状态来决定服务器工作正常与否。如web server的服务端口一般是80,如果Keepalived检测到80端口没有启动,则Keepalived将把这台服务器从服务器群中剔除。
    • Layer7:Layer7就是工作在具体的应用层了,比Layer3,Layer4要复杂一点,在网络上占用的带宽也要大一些。Keepalived将根据用户的设定检查服务器程序的运行是否正常,如果与用户的设定不相符,则Keepalived将把服务器从服务器群中剔除。URL
    简单的说基于3层是通过ICMP协议ping包监控ip,4层是监控端口号是否启动,7层是检查具体服务是否运行
    VRRP介绍
    • VRRP的目的就是为了解决静态路由单点故障问题
      VRRP通过一竞选(election)协议来动态的将路由任务交给LAN中虚拟路由器中的某台VRRP路由器
    • 工作机制
      由多个物理路由器虚拟出一个VRRP虚拟路由器,这多台的物理的机器并不能同时工作,而是由一台称为MASTER的负责路由工作,其 它的都是BACKUP,MASTER并非一成不变,VRRP让每个VRRP路由器参与竞选,最终获胜的就是MASTER
    • MASTER拥有一些特权,比如 拥有虚拟路由器的IP地址,我们的主机就是用这个IP地址作为静态路由的。拥有特权的MASTER要负责转发发送给网关地址的包和响应ARP请求
      在一个虚拟路由器中,只有作为MASTER的VRRP路由器会一直发送VRRP广告包(VRRP Advertisement message),BACKUP不会抢占MASTER,除非它的优先级(priority)更高。当MASTER不可用时(BACKUP收不到广告包), 多台BACKUP中优先级最高的这台会被抢占为MASTER。这种抢占是非常快速的(<1s),以保证服务的连续性。由于安全性考虑,VRRP包使用了加密协议进行加密
    keepalived服务的安装

    涉及到的服务器都需要安装keepalived把自己封装成路由器再进行竞争选举最后生成虚拟路由器VRRP

    #首先由于涉及到内核需要先安装内核的软件包
    [root@localhost ~]# yum install kernel kernel-devel 
    #检查内核下是否有目录
    [root@localhost 2.6.32-431.el6.x86_64]# pwd
    /usr/src/kernels/2.6.32-431.el6.x86_64
    #下载软件包解压
    [root@localhost ~]# cd /usr/src/
    [root@localhost src]# wget http://www.keepalived.org/software/keepalived-1.2.1.tar.gz
    [root@localhost src]# tar zxvf keepalived-1.2.1.tar.gz
    [root@localhost src]# cd keepalived-1.2.1
    [root@localhost keepalived-1.2.1]# ls
    AUTHOR     configure     COPYING  INSTALL     keepalived.spec.in  README
    bin        configure.in  doc      install-sh  lib                 TODO
    ChangeLog  CONTRIBUTORS  genhash  keepalived  Makefile.in         VERSION
    

    开始编译安装

    #这里预编译不指定安装目录,会默认安装到内核中
    [root@localhost keepalived-1.2.1]# ./configure --with-kernel-dir=/usr/src/kernels/2.6.32-431.el6.x86_64/
    [root@localhost keepalived-1.2.1]# make
    [root@localhost keepalived-1.2.1]# make install
    
    安装报错信息如下
    #报错一、预编译缺少库
    checking for poptGetContext in -lpopt... no
    configure: error: Popt libraries is required
    原因分析:未安装popt的开发包
    解决如下:
    [root@localhost keepalived-1.2.1]# yum install popt-devel -y
    #报错二、编译报错
    ../include/check_data.h:38:27: 错误:linux/ip_masq.h:没有那个文件或目录
    ../include/check_data.h:39:25: 错误:net/ip_masq.h:没有那个文件或目录
    In file included from ../include/check_api.h:29,
                     from layer4.c:27:
    ../include/check_data.h:113: 错误:‘IP_MASQ_TNAME_MAX’未声明(不在函数内)
    layer4.c: 在函数‘tcp_socket_state’中:
    layer4.c:111: 警告:传递‘getsockopt’的参数 5 给指针时,目标与指针符号不一致
    /usr/include/sys/socket.h:190: 附注:需要类型‘socklen_t * __restrict__’,但实参的类型为‘int *’
    make[2]: *** [layer4.o] 错误 1
    make[2]: Leaving directory `/usr/src/keepalived-1.1.7/keepalived/core'
    make[1]: *** [all] 错误 1
    make[1]: Leaving directory `/usr/src/keepalived-1.1.7/keepalived'
    make: *** [all] 错误 2
    原因:解决方法:
    进入源码目录就是你解压的目录了:cd /usr/local/src/keepalived-1.2.2
    vi keepalived/libipvs-2.6/ip_vs.h
    找到下面一行:
    #include <linux/types.h>        /* For __beXX types in userland */
    把他放到下面一行的下面:
    #include <sys/types.h>
    这是最新版本的问题,如果用keepalived-1.2.1则不会出现这个问题了,我用的是keepalived-1.1.7
    

    安装后所有文件存在/usr/local/etc目录下,拷贝相关文件到系统服务目录

    #拷贝启动文件到系统目录
    [root@yumserver etc]# cp /usr/local/etc/rc.d/init.d/keepalived /etc/init.d/
    #拷贝系统配置文件到系统目录
    [root@yumserver etc]# cp /usr/local/etc/sysconfig/keepalived  /etc/sysconfig/
    #创建主配置文件存放目录
    [root@yumserver etc]# mkdir -p /etc/keepalived
    #拷贝二进制sbin文件到系统目录
    [root@yumserver etc]# cp /usr/local/sbin/keepalived  /usr/sbin/
    
    创建keepalived服务主配置文件
    • 一个功能比较完整的keepalived的配置文件,其配置文件keepalived.conf可以包含三个文本块:全局定义块、VRRP实例定义块及虚拟服务器定义块。全局定义块和虚拟服务器定义块是必须的,如果在只有一个负载均衡器的场合,就不须VRRP实例定义块。
    [root@yumserver etc]# vim /etc/keepalived/keepalived.conf
    1 #######GLOBAL CONF#### 全局配置定义管理员邮箱及路由信息,感叹号!开头表示注释信息
      2 ! Configuration File for keepalived
      3 global_defs {
      4       notification_email {
      5            wgkgood@139.com                                 #接收邮件的邮箱,一行一个
      6    }
      7    notification_email_from wgkgood@139.com   #发送邮件的邮箱
      8    smtp_server 127.0.0.1                                     #邮件服务器的IP
      9    smtp_connect_timeout 30                               #发送连接超时设置30秒
     10   router_id LVS_DEVEL                                     #设置默认路由ID
     11 }
    12 ######## VIP1  VRRP CONF######   VRRP虚拟路由器定义块
     13 vrrp_instance VI_1 {                             #配置一个vrrp实例(instance),别名VI_1 
     14     state BACKUP                                 #状态设置BACKUP
     15     interface eth0                                   #配置实例绑定的网卡eth0         
     16     lvs_sync_daemon_inteface eth0     #配置虚拟路由器同步的接口
     17     virtual_router_id 151                       #配置路由ID,虚拟路由器组成的物理机该ID需要保持一致通过#tcpdump vrrp查看
     18     priority 100                                      #优先级,高优先级竞选为master
     19     advert_int 5                                     #master广播发送包的时间间隔
     20     nopreempt                                       #设置为不抢占
     21     authentication {                               #设置主机之间认证
     22         auth_type PASS                         #keepalived物理主机之间的认证方式
     23         auth_pass 2222                          #认证密码
     24     }
     25     virtual_ipaddress {
     26         192.168.15.201                         #定义虚拟路由器的IP即VIP
     27     }
     28 }
    29 ############CHECK VHOST PORT############## 虚拟服务器定义块
     30 virtual_server 192.168.15.201 3306 {     #虚拟服务器检查的端口3306是mysql,80是nginx
     31     delay_loop 6                                       #健康检查时间间隔
     32     lb_algo wrr                                           #负载均衡调度算法,互联网应用常使用wlc或rr
     33     lb_kind DR                                         #负载均衡转发规则。一般包括DR,NAT,TUN3种,在我的方案中,都使用DR的方式
     34     persistence_timeout 60                      #会话保持时间6秒
     35     protocol TCP                                      #转发协议protocol.一般有tcp和udp两种
     36     real_server 192.168.15.103 3306 {    #通过TCP协议检查物理服务器的端口,可以是本机或者远程机器
     37         weight 100                                      #权重100使用不同的权重值的目的在于为不同性能的机器分配不同的负载
     38         notify_down /data/sh/mysql.sh      #端口当机执行的脚本
     39         TCP_CHECK {  
     40         connect_timeout 10                       #连接超时时间
     41         nb_get_retry 3                               #重连次数
     42         delay_before_retry 3                    #重连间隔时间
     43         connect_port 3306                        #健康检查的端口
     44         }
     45     }
    将配置文件拷贝到另一台机器修改真实主机的IP以及优先级MASTER
    分别重启keepalived服务
    [root@localhost ~]# /etc/init.d/keepalived restart
    停止 keepalived:                                          [失败]
    正在启动 keepalived:                                      [确定]
    
    启动后查看日志信息发现报错
    [root@yumserver etc]# tail -fn 10 /var/log/messages
    Jan 11 13:39:31 yumserver Keepalived_healthcheckers: IPVS: Can't initialize ipvs: Protocol not available
    #这是因为没有加载ipvs模块,先临时手动加载后重启keepalived
    [root@yumserver etc]# modprobe ip_vs
    [root@localhost ~]# /etc/init.d/keepalived restart
    #查看日出出现如下信息竞选master成功
    Jan  6 19:02:24 localhost Keepalived_vrrp: VRRP_Instance(VI_1) Transition to MASTER STATE
    Jan  6 19:02:29 localhost Keepalived_vrrp: VRRP_Instance(VI_1) Entering MASTER STATE
    Jan  6 19:02:29 localhost Keepalived_vrrp: VRRP_Instance(VI_1) setting protocol VIPs.
    Jan  6 19:02:29 localhost Keepalived_vrrp: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.15.201
    

    查看虚拟VIP

    [root@localhost ~]# ip addr list
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
        inet6 ::1/128 scope host 
           valid_lft forever preferred_lft forever
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
        link/ether 00:0c:29:42:12:9e brd ff:ff:ff:ff:ff:ff
        inet 192.168.15.172/24 brd 192.168.15.255 scope global eth0
        inet 192.168.15.201/32 scope global eth0
        inet6 fe80::20c:29ff:fe42:129e/64 scope link 
           valid_lft forever preferred_lft forever
    
    关于配置主文件的一些说明
    • 虚拟VVRP定义块里面state BACKUP,如果设置为MASTER在集群机器都存活时,该机器就是MASTER,一旦监控端口挂掉,VIP会漂移到竞选产生的新MASTER上,但是一旦原机器恢复并重新加入集群,VIP会立马漂移回来,重新抢回MASTER,造成多次访问中断影响用户体验
    • 虚拟VVRP定义块里面priority 100设置权重,之前所有机器都是BACKUP,就通过权重高的竞选MASTER
    • 虚拟VVRP定义块里面nopreempt就是为了约束权重高的服务器,当发生异常退出集群后,竞选产生新的MASTER,此时当原来的MASTER服务器恢复故障重新加入集群后,虽然权重高,但由于该条的约束不会去竞争MASTER,直到集群中的新MASTER故障进行重新竞争选举.
    • 虚拟服务器定义块里 notify_down /data/sh/check_nginx.sh是监测到端口没存活时执行的脚本,一般语句有三段,首先立刻停止keepalived服务/etc/init.d/keepalived stop,之后等待20ssleep 20集群完成VIP漂移竞选新的MASTER,重启检测的服务如nginx服务/usr/local/nginx/bin/nginx -s restart,最后重启keepalived加入集群/etc/init.d/keepalived restart
    • 一般来说定义虚拟服务器块里面监测的real server真实服务器直接监测本机IP端口号,远端的服务器虽然可以监控但是无法访问验证,因此建议安装keepalived的服务器监控自己本地的端口号并根据脚本做对应的配置.

    相关文章

      网友评论

          本文标题:第四十一节、Keepalived高可用

          本文链接:https://www.haomeiwen.com/subject/iqieoxtx.html