KeepAlived高可用集群详解及拓扑实验搭建配置

Linux ClusterKeepAlive

1.集群类型:LB(负载均衡集群)HA(高可用集群)HP(高性能集群)
    LB:均衡负载的实现LVS
    HA:高可用的实现KeepAlived


2.RS:健康状态检测方式:
1)网络层:icmp ping
2)传输层:tcp ping
3)应用层:对相应服务下的关键点发起请求;基于资源获取的方式;

 

3.各检测之间的时间间隔限定:
前端的调度器,要实现高可用,而且要实现对各RS做健康监测,且实现动态增删RS;
网络层的健康监测效果是最差的,使用简单,应用层的健康监测效果最佳,但消耗资源;

    检测超时限定:timeout
    检测次数限定soft failure –> soft failure –> hard failure
OK –> PROBLEM:3+次    PROBLEM –> OK:1+次

第一次监测失败为soft failure,第三次监测失败则认为是hard failure;从OK检测到失败一般在3次以上;而从失败检测到OK只需一次就可认为是OK;

4.HA:衡量高可用的标准
    A=MTBF/(MTBF+MTTR)
     MTBF:平均无故障时间;
     MTTR:平均修复时间;

    提高系统高可用:

    通过降低MTTR提高系统高可用:通过冗余(redundant)实现;
    当调度器故障时,需要自动判断是否故障,且要能自动实现冗余切换;
    实现方法有三种:1、内生逻辑自动完成2、外在脚本实现3、人工手动介入实现;
    自动完成是可用的,在主备节点间,运行一个服务程序层;通过网络连接,相互通告自己的连接状态是否健康;冗余节点可有多台,可认为在同一组内;主用服务器,发送heartbeat,备用节点发现heartbeat不在时,要选举出一台主用服务器来替代故障机;     

        Heartbeat:Heartbeat 项目是 Linux-HA 工程的一个组成部分,它实现了一个高可用集群系统。心跳服务和集群通信是高可用集群的两个关键组件

 

网络分区:Network Partition

  A主机正常发送heartbeat,由于网络原因,其它备份主机收不heartbeat信息;此时,备份主机会选举出一台主机添加上A主机的IP地址,而A主机此时也存在该地址;前路由会出现无法识别网络的问题,这样就叫由于网络故障出现的网络分区;各主机间会出现,IP的资源争夺;

如何判断IP资源归谁所有,通过票数决定,看A主机和备份主机各占总票数的多少来决定;得票数要大于总票数的半数,为胜出方,取得IP资源当做主用服务器;
大于总票数的一半称为total/2,法定票数(with quorum);
如果集群只有两个节点时,无论任何一方down掉,任何一方都不能有法定票数,即为without quorum;
为了解决只有AB两主机时,一台出现故障,而冗余要替换成主用这个问题,就使用一个路由器当做仲裁,判断是否大于半数;路由器可参与选举,这样AB主机加上路由器就出现了总数为3票;如果B节点发现A节点联系不到,但自己能与路由器通信,此时B就认为自己的票数是大于半数的,自动成为主用服务器;
构建一个冗余的集群时,最好拥有奇数节点;
一般构建高可用集群(基于冗余方式),对另一个节点做冗余,通常把这些节点做集群,定义在一个组内,这些节点上运行一个服务,这个服务可实现,主节点不断向组内的其它备用节点通告heartbeat信息,通常1秒1次,其它冗余节点收到后,则不会在备用组内选举主服务器;3次收不到heartbeat时,就会在冗余组内选举一个主服务器,把原来的IP等资源争夺过来,提供主用服务;
提供高可用服务的程序,就为keepalived(基于vrrp协议实现);

 

    HA Service:要有必须的资源:ip,httpd,store
    HA Cluster的实现方案:
    vrrp协议的实现;keepalived
    ais:完备的HA集群;

  不仅能完成心跳信息的判断,还能判断服务是否正常,在主服务器失败后由备用机替换为主用;
 
 ais家族:需要多个组件,3层,最底层是集群事务层,上一层是资源管理器层、再上一层是资源代理层;每一次都有非常复杂的结构;基于以下三个实现;

                Heartbeat:心跳检测,用于主背服务器之间检测是否可用
     corosync:实现HA心跳信息传输的功能就是Corosync
             cman)

 

 

 

VRRP协议:虚拟冗余路由协议
1、vrrp中的术语:
    VR:虚拟路由器
    VRID:虚拟路由器的标识号(0-255)
    Master(Active):主路由器(活动节点)
    Backup(Passive):备份路由器(被动节点)
    VIP:虚拟IP地址;流动(浮动)IP;
    VMAC:VIP对应的虚拟MAC地址(48位);00-00-5E-00-01-{VRID}

2、优先级:初始化过程中就决定了优先级;
    VRRP备份服务如果启动成为了主服务器之后,会发起gracious arp(免费arp广播),因为此时VIP的MAC地址已经改变了,VRRP会自己询问自己的MAC地址,然后再广播回答自己的MAC地址,同一局域网内的其他主机之前如果存在之前的VIP的MAC地址会自动更新MAC地址,完成IP替换。


3、vrrp工作方式:2种
    抢占式:优先级高的,抢占为主用;主要体现在如果主服务器出 现故障被备用服务器替换之后,此前的主服务器已经修复成功之后会再次抢占自己为主服务器。
    非抢占式:按照优先级决定主背,不会抢占。

4、应用工作模式:
    主/备:
    备/主:配置多个虚拟路由器(交叉主备);

 

例:Director使用高可用,准备两台DR,互为主备;提供两个VIP
 A节点VIP:172.18.100.7
 B节点VIP:172.18.100.8
A为B的备份,B为A的备份;
A节点掉线,B节点将成为A节点的主,同时还是B节点的主;
这样意味着AB节点上要配置两个VIP地址;在DNS解析时,一个A记录要有2个VIP;这样,就实现了2级负载均衡;
keepalived就是在Linux主机上vrrp协议的实现;能实现lvs高可用的;也可制作脚本对http或nginx实现高可用;

 

5、vrrp认证方式:
  无认证;
    简单字符串认证:预共享密钥;
    md5认证;

6、keepalived:(简写为ka)是vrrp协议的实现;
    原生设计目的用于实现为高可用ipvs服务;ka能够根据配置文件中定义自动生成ipvs规则(增、删),并能够对各RS的健康状态进行检测;

    支持vrrp_script接口,vrrp_track;通过编写vrrp脚本,通过vrrp_track跟踪各种服务;

 

7、keepalived组件:

KeepAlived高可用集群详解及拓扑实验搭建配置
    控制面板(组件)配置文件分析器内存管理IO复用
    核心组件:
        vrrp stack:实现vrrp协议;
        smtp:发送通知邮件;可在地址流动时发邮件,还可根据checkers检查后把宕机从从ipvs规则中移除,发出此邮件;
        checkers:检测后端RS健康状态,可基于tcp、htp、ssl、misc检测;发现宕机就从ipvs规则中移除;
        watchdog:实现监控vrrp stack和checkers的健康;
        ipvs wrapper:checkers通过调用该包装器,来实现在ipvs中添加、删除或修改规则;

 

 

8、HA Cluster配置的前提:(各调度器)
  
1、各节点时间同步;
     基于ntp协议同步,设置/etc/chrony.confcentos 7)

        命令:ntpdate 时间服务器IP
    2、确保iptables及selinux不会阻碍,因为各调度器之间会传递心跳信息
     心跳信息传递:3种方式
     单播、广播、组播
     组播:最佳使用方式;组播地址:224.0.0.0-239.0.0.0
    3、各节点之间可通过主机名相互通信(对ka并非必须,ka是无所谓的);
     名称解析服务的解析结果必须与“uname -n”命令的结果一致;
     如果是主机名通信,dns解析名必须与真实主机名一致;
    4、各节点之间的root用户可以基于密钥认证的ssh通信,(对ka并非必须,ka无所谓);

 

9、配置文件内容详解

]# vim /etc/keepalived/keepalived.conf;
 global_defs {  //全局配置段 
  notification_email {   //接收通告邮件的地址,收件人
        root@localhost
    }
  notification_email_from kaadmin@magedu.com  //发件人 
  smtp_server 127.0.0.1   //配置邮件服务器,要求能在互联网上正反解析;  
  smtp_connect_timeout 30  //邮件服务器的超时时长  
  router_id node1  //定义当前路由器设备的ID号,一般为主机名;  
  vrrp_mcast_group4 224.0.11.18  //组播地址,默认为224.0.0.18,同一个VRRP组的集r群里的所有节点都有使用此地址;表示同一个组播域,用于主背服务器心跳检测使用。} 
vrrp_instance VI_1 {    //虚拟路由器配置段,实例名称为VI_1,也可自定义;  
    state MASTER   //当前节点在此虚拟路由器中的初始状态;表示为主节点;取值为:MASTER|BACKUP;  
    interface eno16777736  //表示vrrp发送通告的接口;  
    virtual_router_id 11   //虚拟路由器ID,范围0-255;  
    priority 100  //当前物理节点在此虚拟路由器中的优先级;  
    advert_int 1  //表示vrrp的通告的时间间隔;为1秒;  
    authentication {   //认证方式   
    auth_type PASS   //使用简单密码认证   
    auth_pass 347hdfk3   //随机随机字符串,可使用openssl rand -base64 8生成,前8位字符有效;;  
    }
  virtual_ipaddress {  //定义虚拟IP,不指明则为前面的interface指明的接口地址;    
      172.18.11.66  //网卡别名地址,可写为172.18.11.66 dev eno16777736 label eno16777736:0  
   } 
}

 

 

例:搭建VRRP

1、各调度器时间需要同步
 ]# ntpdate 172.18.0.1  //向时间服务器同步;
 可创建自动计划任务,向时间服务器每5分钟同步一次时间
 ]# crontab -e                                       
 */5 * * * * /usr/sbin/ntpdate 172.18.0.1 &> /dev/null
2、 安装keepalived

 ]# yum -y install keepalived  ]# vim /etc/keepalived/keepalived.conf
   global_defs {
       notification_email {
         root@localhost  
       }
       notification_email_from  root
       smtp_server 127.0.0.1
       smtp_connect_timeout 30
       router_id node1
     vrrp_mcast_group4 224.0.11.18
    }
  
    vrrp_instance VI_1 {
        state MASTER
        interface eth0
        virtual_router_id 18
        priority 100
        advert_int 1
        authentication {
           auth_type PASS
           auth_pass 76asdf2f
       }
        virtual_ipaddress {
           10.1.25.100/16
       }
    }

3、node1配置完成、复制KeepAlived.conf配置文件到node2

   ]# scp keepalived.conf root@172.18.11.121:/etc/keepalived
 ]# vim /etc/keepalived/keepalived.conf
 修改:
  state BACKUP 修改为备用
  priority 50 修改小优先级;
注意:密码、router_id、vrrp_mcast_group4要保存一致;
4、在两个调度器上开启keepalived服务:测试即可

 

vrrp有两种工作主/备,主/主工作模型;
 为了提高利用率,就使用主/主工作模型;
A主B从,B主A从;这样AB都能发挥作用;在外部都称为主时,可在前端dns配置A记录把两个ip都配置在一个主机名上即可;
但在有些场景中,AB都称为主时不是配置在同一网卡上的两个不同的别名,而是分别配置在两块网卡上;
AB每个主机都有两块网卡,一块网卡面向外网,一块网卡面向内网通信;期望通信时,这两个地址都是VIP,只不过,前面外网是虚拟路由器1,内网是虚拟路由器2;里面的别名配置在内网网卡上,外面的别名配置在外网网卡上;当外网其中一个线路掉线时,可自动切换到另一个外网网卡的服务器上,要求而也要内网同样要切换;要求内外通信使用VIP,所以没有必要切换的内网也要切换;
这种把两个虚拟路由器,配置为只能对一个设备是主服务器,同进同退,这种就叫做一个同步组;

 

centos 7:
主配置文件:/etc/keepalived/keepalived.conf
Unit file:/usr/lib/systemd/system/keepalived.service
配置文件:/etc/sysconfig/keepalived

一、配置文件内容块:
1.GLOBAL CONFIGURATION

//全局配置段,对所有vvrp实例虚拟服务器都是生效;
global_defs {
    ...}


2.VRRPD CONFIGURATION  —虚拟路由器同步组配置段

vrrp_sync_group VG_1 {
   
...}


3.VRRP instance(s) 虚拟路由器实例配置段

vrrp_instance INST_NAME {
   
...}


4.LVS CONFIGURATION 集群配置段

virtual_server_group <STRING> { 虚拟服务器组配置段
    
...}

5.Virtual server(s) 虚拟服务器配置段
 virtual_server IP port
 virtual_server fwmark int { 十进制的整数,(实际最终用的是十六进制数)
  protocol TCP 注意:keepalived只支持tcp;
 
 real_server <IPADDR> <PORT>{ 真实后端服务器配置段
 
 }
 }
虚拟路由示例配置:

vrrp_instance <string> {  
    state MASTER|BACKUP //当前节点在此虚拟路由器中的初始状态;  
    interface ETHERCARD //vrrp实例工作的网络接口;发送通告的接口;  
    virtual_router_id 51 //虚拟路由器ID,范围0-255;  
    priority 100  //当前物理节点在此虚拟路由器中的优先级;  
    advert_int 1  //通告的时间间隔;  
    authentication { 认证机制   # PASS||AH 使用哪种认证方式   # PASS - Simple Passwd (suggested) 简单密码   # AH - IPSEC (not recommended)) 验证头协议   
        auth_type PASS     
        auth_pass 1234  前8位字符有效;  
    } 
virtual_ipaddress { 定义虚拟IP格式:<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL>  
    192.168.200.17/24 dev eth1  //可为网卡别名的地址;  192.168.200.18/24 dev eth2 label eth2:1
 } 
use_vmac <VMAC_INTERFACE> //使用虚拟MAC地址,00-00-5E-00-01-{VRID},可省略; 
mcast_src_ip <IPADDR>  -----组播地址作为的源地址 unicast_src_ip <IPADDR> ----单播地址作为的源地址 
track_interface {   ----定义要监控的接口;指明跟踪的接口,接口发生故障时,可实现自我监控机制;发通告的接口与VIP所在接口可不是同一个接口;  
    eth0  
    eth1 } 
nopreempt   ----表示工作于非抢占模式,不指明,则默认为抢占,两台服务器性能一样可设为非抢占; 
preempt_delay 300   ---设定上线后抢占延迟时间,默认为300秒即5分钟;
通告脚本定义,对于整个路由设备,内部出现故障时,可向外通告;
notify_master <STRING>|<QUOTED-STRING> 变为主服务器时发通告,此处为脚本的路径;路径中有空格要使用双引号; 
notify_backup <STRING>|<QUOTED-STRING> 变为备用服务器时发通告;
notify_fault <STRING>|<QUOTED-STRING> 变为故障服务器时发通告; 
notify <STRING>|<QUOTED-STRING>  以上三个功能可用一个脚本实现; }

虚拟服务器示例

]# vim /etc/keepalived/keepalived.conf   //配置虚拟服务器示例
virtual_server IP PORT

virtual_server FWM # {   //设定一个整数
 lb_algo rr|wrr|lc|wlc|lbli|sh|dh    //定义负载均衡的调度方法
 delay_loop <INT>      //定义服务轮询时间间隔;每隔多长时间对后端服务器做健康状态检测
 lb_kind NAT|DR|TUN    //集群的类型;-m,-g,-i
 persistence_timeout <INT>    //持久连接时长,默认单位是秒钟,没定义或为0表示不使用持久连接
 protocol TCP     //服务协议,只支持tcp;
 virtualhost <STRING>    //后端RS上的虚拟主机,做健康状态检测时是对每个虚拟主机做检测,向后端主机发送报文时会带上host首部,如果
不定义,则是向每个后端主机的IP地址发报文检测健康状态(即默认虚拟主机响应);

 quorum <INT>   //定义法定票数;即后端的RS至少有几台在线,才认为此集群是ok的,少于此处设定的值就认为整个集群都挂了;
 quorum_up <STRING>|<QUOTED-STRING>  //用于法定票数,执行的脚本;
 sorry_server <IPADDR> <PORT>  //所有RS均故障时,提供say sorry的服务器;
 real_server <IPADDR> <PORT> {   //后端真实服务器
  weight <INT>   //权重
  notify_up <STRING>|<QUOTED-STRING>  //当前RS节点上线时调用的通知脚本;
  notify_down <STRING>|<QUOTED-STRING>  //当前RS节点离线时调用的通知脚本;

 

 

# HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK  —支持的所有健康状态检测方式;

1.基于HTTP或HTTPS协议检测健康状态
  HTTP_GET|SSL_GET { 基于http或https协议做健康状态检测方法指令
   url {
    path <STRING>   —健康状态检测时请求的资源的URL;
    digest <STRING>   —-基于获取内容的摘要码(使用摘要md5方法)进行健康状态判断;判断是否健康;
    status_code <INT>   —-使用响应码方法,判断是否健康;所请求路径的状态码与此处一致就认为ok;
   }

    nb_get_retry <INT>  –健康状态测试请求尝试的次数;
   delay_before_retry <INT>  –两次健康状态测试请求尝试之间的时间间隔;
   connect_timeout <INTEGER>  —RS发健康状态测试请求连接的超时时长;
   connect_ip <IP ADDRESS>   —检查RS健康状态时向此处指定的RS的IP地址发测试请求;不指明则为上面配置中定义的RS的IP;
   connect_port <PORT>   —-向此处指定的端口发健康状态测试请求;
   bindto <IP ADDRESS>   —-指定测试健康状态请求报文的源IP;向RS发测试请求时有源IP,一般为DIP;
   bind_port <PORT>   —-指定测试健康状态请求报文的源端口;
 }

}

 

2.基于TCP方式检测健康状态

TCP_CHECK {    —-基于tcp方式检测健康状态
 connect_ip <IP ADDRESS>
 connect_port <PORT>
 bindto <IP ADDRESS>
 bind_port <PORT>
 connect_timeout <INTEGER>
 warmup <INT>  —延迟多长时间再做健康状态检查,同时做检测会有问题,如果有100个RS要做检测,就需要此处设置;
}

 

 

实验1:对后端WEB-server提高前端调度器的高可用集群,基于keepalived定义两个调度器高可用lvs-dr模型的负载均衡集群

KeepAlived高可用集群详解及拓扑实验搭建配置 

1.实验环境:

KeepAlived地址:1:10.1.25.2

         2:10.1.25.4

Web-Server地址:10.1.25.1、10.1.25.5

 

2.实现前提:

(1)KeepAlived时间要一致,可使用ntpdate命令同步

(2)KA之间能使用主机名通信,使用/etc/hosts/文件,主机名需要和uname -n的结果一致

(3)尽量让KA之间可以无密码通信,使用ssh-keygen和ssh-copy-id

(4)关闭防火墙和selinux

(5)由于KA中指定配置为DR模型,所以需要配置整个拓扑为DR模型,但不用配置ipvsadm

 

3.实验步骤:

A.配置KA

[root@Centos6-2 keepalived]# vim keepalived.conf 
    global_defs {
    notification_email {
    root@localhost
    }
    notification_email_from Centos6-2@localhost
    smtp_server 127.0.0.1
    smtp_connect_timeout 20
    router_id Centos6-2
    vrrp_mcast_group4 224.0.25.1
}
vrrp_instance v1 {
    state MASTER
    priority 100
    interface eth0
    virtual_router_id 25
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 12345678
    }
    virtual_ipaddress {
        10.1.25.125 dev eth0 brd 10.1.25.125 label eth0:10
    }
}
virtual_server 10.1.25.125 80 {
    lb_algo rr
    delay_loop 2 
    lb_kind DR
    persistence_timeout 0
    sorry_server 127.0.0.1 80
 
    real_server 10.1.25.1 80 {
        weight 1 
        HTTP_GET {
            url {
                path /index.html
                status_code 200
            }
            nb_get_retry 3
            delay_before_retry 2
            connect_timeout 3
        }
     }
    real_server 10.1.25.5 80 {
        weight 1 
        HTTP_GET {
            url {
                path /index.html
                status_code 200
            }
            nb_get_retry 3
            delay_before_retry 2
            connect_timeout 3
        }
    }
}

B.配置KA2

更改:virtual_ipaddress 、state 、priority 、等指令即可,

注意:virtual_router_id、auth_pass、vrrp_mcast_group4等指令需要一致

C.配置WEBserve,配置基本相同

   i:搭建服务

    ~]# yum install -y httpd
     ~]# echo “WEB-Server1” > /var/www/html/index.html
    ~]# service httpd start 
  ii:由于KA中指定配置为DR模型,所以需要配置整个拓扑为DR模型,但不用配置ipvsadm
    ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
    ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
    ~]# router add -host 10.1.25.125 dev lo 
    ~]# ifconfig lo:0 10.1.25.125 netmask 255.255.255.255 broadcast 10.1.25.125 up

 

 

 


借助keepalived的vrrp_script,track_script完成高可用服务;
1.vrrp_script:
 
自定义一个(服务)资源监控脚本;vrrp脚本能通过返回成功或失败,或是vrrp实例或进程能根据脚本的状态返回值来作为判断服务是成功还是失败的基本依据,并且能在脚本成功时,使相应节点的优先级提升或在失败时相应节点的优先级通过计算以后降低;
公共定义,可被多个实例调用,因此,定义在vrrp实例之外;

2.track_script:
 
·调用vrrp_script定义的脚本去监控资源;track_script还能够在监控的过程中,一旦发现脚本成功了能够使得优先级升高,失败了就能够使得优先级降低,从而完成向外通告时通告一个较高优先级或较低的优先级,从而完所谓的角色转换,这就是track_script的基本思路;
·定义在vrrp实例之内,调用事先定义好的vrrp_script;如同track interface,所以track就是跟踪接口方式;失败就向外通告降低优先级,成功就向外通告升高优先级;
·降低到什么程度,例如对一个主节点可运行两个资源,第一,是定义在网卡的ip地址,第二,是监控的nginx服务;不断的通过一个脚本探测nginx所监听的80端口,甚至是nginx中的某个资源是否能够正常访问,如果发现不能访问,就会尝试的借助于vrrp实例中track_scipt的定义,使得当前节点优先级减去一个数值,减得的结果会低于backup节点,这样,在向外通告时主节点的优先级会低于backup节点,这时,backup会成为主节点;这就是keepalived监控web服务实现高可用的思路;

对于keepalived而言,允许定义一个服务或资源追踪脚本,并且根据脚本的状态返回值,来作为判断当前节点上所运行的服务是否OK的基本依据;如果需要这个脚本作为探测依据,就通过track_script来调用vrrp_script脚本定义的内容;

 

 

 

 

实验2:定义利用down文件维护服务器

1.实验要求:

A)当主服务优先级高并且不存在down文件时正常处于运行状态,当down文件存在时则降低优先级自动让备用服务器代替处理任务

2.实验配置:

[root@Centos6-2 keepalived]# vim keepalived.conf 
global_defs {
   notification_email {
   root@localhost
   }
notification_email_from Centos6-2@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 20
router_id Centos6-2
vrrp_mcast_group4 224.0.25.1
}
vrrp_script chk_down {   //自定义vrrp脚本调用名为chk_down  script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0" 
     //文件存在,退出码1,不存在则返回0; 
   interval 2   //每个2秒检查一次;  weight -5   //检测失败则权重-5;成功将不执行;}
vrrp_instance v1 {
   state MASTER
   priority 100
   interface eth0
   virtual_router_id 25
   advert_int 1
   authentication {
   auth_type PASS
    auth_pass 12345678
   }
   virtual_ipaddress {
    10.1.25.125 dev eth0 brd 10.1.25.125 label eth0:10
   }
   track_script { 调用上面自定义的vrrp脚本调用名   
   chk_down  
   }

3.备用服务器只需要更改state、priority即可

4.实验结果:

  i.当主服务器不存在down文件时,依然正常工作

KeepAlived高可用集群详解及拓扑实验搭建配置 

Ii.当主服务存在down文件时,备用服务器立即代理主服务器工作

KeepAlived高可用集群详解及拓扑实验搭建配置 

这就是vrrp_script、rack_script脚本基本工作机制;
可利用这样的脚本来判断http服务是否ok,实现出现故障时,地址自动浮动到另一节点上继续提供服务;
要判断一个服务是否在线,脚本应写的越简单越好;

判断一个进程是否运行正常,如果正常就返回成功,不正常就返回失败;
没有killall命令,需要安装psmisc程序包:

 

使用示例1:当down文件存在,则降低该服务器的的优先级,备用服务器充当主服务器,利用文件是否存在来维护服务器

vrrp_script chk_down {
     script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0" 
     interval 2 weight -5} 
     track_script { 
         chk_down
      }

 

使用示例2:利用服务器来决定主背,使用killall -0 监控具体的服务进程,执行此命令时,如果进程不存在,则返回值为1 ,如果进程存在则被kill掉,返回值为0;

 
Killall命令返回值为1时,降低改服务器的优先级,让备用服务器充当主服务器,killall命令返回值为0时,则不减5,表示该服务正在运行,该服务器则可以充当主服务器;
vrrp_script chk_httpd {
    script "killall -0 httpd && exit 0 || exit 1"
    interval 2
    weight -5
}
track_script {
    chk_httpd
}

注意:此演示的脚本一次判断服务是否正常有可能会失败,这样就不是很妥当,应该需要多次判断是否失败,即便发现本机失败了,也不要着急把地址及服务流转出去;应该先尝试重启本地服务,重启失败后再向外流转出去;或者是失败后把服务完全kill掉可通过复杂脚本完成;

 

 

 

 

实验3:利用通知机制返回当前服务器运行类型

1.通过扩展通知脚本,对当前服务器主背转换以及故障时监控通知示例:
~]#vim /etc/keepalived/notify.sh

#!/bin/bash  
contact='root@localhost'
notify() {
mailsubject="$(hostname) to be $1, vip floating."
mailbody="$(date +'%F %T'): vrrp transition, $(hostname) changed to be $1"
echo "$mailbody" | mail -s "$mailsubject" $contact
}
case $1 in
master)
    notify master
    ;;
backup)
    notify backup
    ;;
fault)
    notify fault
    ;;
*)
    echo "Usage: $(basename $0) {master|backup|fault}"
    exit 1
    ;;
esac  
 
2.配置脚本通知机制
~]#vim /etc/keepalived/keepalived.conf
在vrrp_instance端添加以下指令即可
Vrrp_instance v1 {
   notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"
  }

 

 

 

综合实验:配置高可用负载均衡,配置Nginx代理搭建DISCUZ应用程序实现动静分离

KeepAlived高可用集群详解及拓扑实验搭建配置 

1.实验环境:六台主机,如上图

a) 配置各主机IP地址

b) 所有主机关闭iptablesSElinux

 

2.实验目的:

a) 配置两台KeepAlived实现客户端请求时的高可用;

b) 配置两台Nginx代理服务器实现动静态代理时的高可用;

c) 分别配置http服务器和php-fpm+mysql实现动静态分离;

3.实验步骤:

 (1)KeepAlived主机配置:

[root@Centos6-1~]#yum install -y keepalived 
[root@Centos6-1 keepalived]# cat keepalived.conf 
! Configuration File for keepalived
global_defs {
   notification_email {
root@localhost
   }
   notification_email_from nginx1@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id Centos6-1
vrrp_mcast_group4 224.0.25.1
}
 
 
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
10.1.25.125 dev eth0 brd 10.1.25.125 label eth0:10
    }
}
 
virtual_server 10.1.25.125 80 {
    delay_loop 3
    lb_algo rr
    lb_kind DR
    protocol TCP
 
    real_server 10.1.25.4 80 {
        weight 1
        HTTP_GET {
            url {
              path /index.html
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
   }
    real_server 10.1.25.6 80 {
        weight 1
        HTTP_GET {
            url {
              path /index.html
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            }
       } 
}

(2)两台KeepAlived主机配置差不多相同,主配置文件中更改一些参数即可

 

(3)配置Nginx Proxy代理服务器:  两台服务器配置差不多一致

[root@Centos7-1 ~]#yum install -y nginx 
[root@Centos7-1 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore 
[root@Centos7-1 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce 
[root@Centos7-1 ~]# route add -host 10.1.25.125 dev lo
[root@Cento7-1 ~]# ifconfig lo:1 10.1.25.125 netmask 255.255.255.255 broadcast 10.1.25.125 up
[root@Centos7-1 ~]#iptables -F ;setenforce 0
[root@Centos7-1 ~]# vim /etc/nginx/conf.d/default.conf
server {
    listen       80;
    server_name  www.nginx1.com;
root /var/www/html;
index forum.php;
    location / {
        proxy_pass   http://10.1.25.11;
index index.php;
    }
 
    location ~ \.php$ {
        fastcgi_pass   10.1.25.5:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /var/www/html/$fastcgi_script_name;
        include        fastcgi_params;
    }

 

(4)配置http服务器

[root@Centos6-3 ~]# yum install -y http 
[root@Centos6-3 ~]# iptables -F;setenforce 0 ;cd /var/www/html
[root@Centos6-3 ~]# wget ftp://10.1.0.1/pub/Sources/sources/php/Discuz_X3.2_SC_UTF8.zip
[root@Centos6-3 ~]# unzip Discuz_X3.2_SC_UTF8.zip 
[root@Centos6-3 ~]# mv upload/* .
[root@Centos6-3 ~]# chmod 777 -R * 
[root@Centos6-3 ~]# service httpd start

 

(5)配置php-fpm + mysql

[root@Cento-2 ~]# vim /etc/php-fpm.d/www.conf 
listen = 10.1.25.5:9000   //更改
;listen.allowed_clients = 127.0.0.1  //添加;号注释
[root@Centos7-2 ~]# mysql 
mysql> grant all on *.* to disuser@’%’ identified by ‘dispass’ ;
mysql> grant all on *.* to disuser@’127.0.0.1’ identified by ‘dispass’ ;
mysql> gras7-2 ~]# yum install -y php-mysql php-fpm php-gd php-xml php-mbstring php-mvrypt mariadb-server 
[root@Centos7nt all on *.* to disuser@’localhost’ identified by ‘dispass’ ;
mysql> flush privileges;
[root@Centos7-2 ~]# wget ftp://10.1.0.1/pub/Sources/sources/php/Discuz_X3.2_SC_UTF8.zip
[root@Centos7-2 ~]# unzip Discuz_X3.2_SC_UTF8.zip 
[root@Centos7-2 ~]# mv upload/* .
[root@Centos7-2 ~]# chmod 777 -R * 
[root@Centos7-2 ~]# service php-fpm start
[root@Centos7-2 ~]# service mariadb-server start

原创文章,作者:Lii,如若转载,请注明出处:http://www.178linux.com/56777

(2)
LiiLii
上一篇 2016-11-01
下一篇 2016-11-01

相关推荐

  • rsyslog, mysql, loganalyzer联合实现

    一. rsyslog简介 rsyslog是一个自由软件, 是GPL的lincesed增强的syslogd. 它提供了Mysql和完全可配置的输出格式的支持. 1. 日志信息格式:      <优先级>时间戳 主机名 模块名/级别/信息摘要:内容      <priority>…

    Linux干货 2016-10-24
  • LVS实现负载均衡wordpress

    项目构建: LVS实现基于https wordpress 组建 必需软件: nfs-utils-1.2.3-70.el6.x86_64 配置步骤: 1.在D主机设置NFS共享目录 /app/nfsdata #mkdir /app/nfsdata //最好用LVM 实现在线扩展 #chown mysql: /app/data //确认该主机mysql用户存在 …

    2017-05-12
  • 关于大型网站技术演进的思考(三):存储的瓶颈(3)

    原文出处: 夏天的森林    存储的瓶颈写到现在就要进入到深水区了,如果我们所做的网站已经到了做数据库垂直拆分和水平拆分的阶段,那么此时我们所面临的技术难度的挑战也会大大增强。 这里我们先回顾下数据库的垂直拆分和水平拆分的定义: 垂直拆分:把一个数据库中不同业务单元的数据分到不同的数据库里。 水平拆分:是根据一定的规则把同一业务…

    Linux干货 2015-03-03
  • 第一周作业

    1、描述计算机的组成及其功能。     运算器,控制器,存储器,输入设备,输出设备     CPU:运算器+控制器     内存,硬盘:存储器     输入设备:键盘鼠标   &n…

    Linux干货 2016-06-26
  • vsftpd权限配置

    要求 :完成vsftpd配置,   (1) 禁锢系统用户于家目录;   (2) 基于mysql进行用户认证;   (3) 不同的虚拟用户拥有不同的权限设定. 解答:  (1) 首先安装需要的系统环境和软件 yum groupinstall -y "Development&nbsp…

    Linux干货 2016-10-24
  • 上下文管理练习(为加法函数计时)

    上下文管理(为加法函数计时) 为加法函数计时 使用装饰器显示该函数的执行时长 使用上下文管理显示该函数的执行时长 装饰器实现 import time import datetime from functools import wraps def logger(fn): @wraps(fn) # wraps(fn)(wrapper) def wrapper(*…

    2017-11-18