Keepalived+LVS

发布于:2023-01-04 ⋅ 阅读:(408) ⋅ 点赞:(0)

一、高可用集群简介

什么事高可用集群

高可用集群(High Availability Cluster,简称HA Cluster),是指以减少服务中断时间为目的的服务器集群技术。它通过保护用户的业务程序对外不间断提供的服务,把因软件、硬件、人为造成的故障对业务的影响降低到最小程度。

高可用集群的衡量标准

要保证集群服务100%时间永远完全可用,几乎可以说是一件不可能完成的任务。比如,淘宝在这几年双十一刚开始的时候,一下子进来买东西的人很多,访问量大,都出现一些问题,如下单后却支付不了。所以说只能保证服务尽可能的可用,当然有些场景相信还是可能做到100%可用的。

   通常用平均无故障时间(MTTF:mean time to failure)来度量系统的可靠性,用平均故障维修时间(MTTR:mean time to restoration)来度量系统的可维护性。于是可用性被定义为:HA=MTTF/(MTTF+MTTR)*100%。

在这里插入图片描述

自动切换/故障转移(FailOver)

自动切换阶段某一主机如果确认对方故障,则正常主机除继续进行原来的任务,还将依据各种容错备援模式接管预先设定的备援作业程序,并进行后续的程序及服务。

  通俗地说,即当A无法为客户服务时,系统能够自动地切换,使B能够及时地顶上继续为客户提供服务,且客户感觉不到这个为他提供服务的对象已经更换。

  通过上面判断节点故障后,将高可用集群资源(如VIP、httpd等)从该不具备法定票数的集群节点转移到故障转移域(Failover Domain,可以接收故障资源转移的节点)。

自动侦测

自动侦测阶段由主机上的软件通过冗余侦测线,经由复杂的监听程序,逻辑判断,来相互侦测对方运行的情况。
常用的方法是:集群各节点间通过心跳信息判断节点是否出现故障。

脑裂
脑裂简介

在高可用(HA)系统中,当联系2个节点的“心跳线”断开时,本来为一整体、动作协调的HA系统,就分裂成为2个独立的个体。由于相互失去了联系,都以为是对方出了故障。两个节点上的HA软件像“裂脑人”一样,争抢“共享资源”、争起“应用服务”,就会发生严重后果——或者共享资源被瓜分、2边“服务”都起不来了;或者2边“服务”都起来了,但同时读写“共享存储”,导致数据损坏(常见如数据库轮询着的联机日志出错)。

脑裂产生的原因

因心跳线坏了(包括断了,老化)。
因网卡及相关驱动坏了,ip配置及冲突问题(网卡直连)。
因心跳线间连接的设备故障(网卡及交换机)。
因仲裁的机器出问题(采用仲裁的方案)。
高可用服务器上开启了 iptables防火墙阻挡了心跳消息传输。
高可用服务器上心跳网卡地址等信息配置不正确,导致发送心跳失败。
其他服务配置不当等原因,如心跳方式不同,心跳广插冲突、软件Bug等。

在这里插入图片描述

二、keepalived

2.1 keepalived简介

keepalived是什么

keepalived是集群管理中保证集群高可用的一个服务软件,用来防止单点故障。

keepalive 工作原理

keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议。

将N台提供相同功能的服务器组成一个服务器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该服务器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master

组播

IPV4总共三种通信方式:单播,组播,广播。
组播是指以224.0.0.0地址作为通信地址的一种方式。

keepalived主要的三个模块

分别是core、check和vrrp。
core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。
check负责健康检查,包括常见的各种检查方式。
vrrp模块是来实现VRRP协议的。

2.2 keepalived实战案例

准备环境

SERVER1:192.168.238.129
SERVER2:192.168.238.130
	VIP:192.168.238.131   随意设置,必须处于同一网段
WEB1:	192.168.238.132	

部署

SERVER1:	 
配置keepalived.conf文件;与SERVER2相同配置

yum -y install keepalived
systemctl start keepalived
systemctl enable keepalived

! Configuration File for keepalived
global_defs {
 router_id 1                            #设备在组中的标识,设置不一样即可
 }

#vrrp_script chk_nginx {                        #健康检查
# script "/etc/keepalived/ck_ng.sh"     #检查脚本
# interval 2                            #检查频率.秒
# weight -5                             #priority减5
# fall 3                                        #失败三次
# }

vrrp_instance VI_1 {               #VI_1。实例名两台路由器相同。同学们要注意区分。
    state MASTER                        #主或者从状态
    interface ens33                     #监控网卡
    mcast_src_ip 192.168.238.129          #心跳源IP
    virtual_router_id 55                #虚拟路由编号,主备要一致。同学们注意区分
    priority 100                        #优先级
    advert_int 1                        #心跳间隔

    authentication {                    #秘钥认证(1-8位)
        auth_type PASS
        auth_pass 123456
    }

    virtual_ipaddress {                 #VIP
    192.168.238.131/24
        }

#  track_script {                       #引用脚本
#       chk_nginx
#    }

}

SERVER1:复制server1上的keepalived.conf到server2
`server2  提前安装keepalived`
scp -r /etc/keepalived/keepalived.conf 192.168.238.130:/etc/keepalived 

SERVER2:修改server2上的keeplived.conf文件

router_id 2
state BACKUP 
mcast_src_ip 192.168.238.130   ####SERVER1是129
priority 99  ###优先级   一个宕机根据优先级使用这个


======================================================================================================================
SERVER1/SERVER2 安装nginx

rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

yum -y install nginx
systemctl start nginx
systemctl enable nginx

vim  /usr/share/nginx/html/index.html  			#随意修改,起到与server2差异化状态。

Client:访问 VIP

elinks --dump  http://192.168.238.131 ##持续ping
ipvsadm -Lnc 查看访问页面是交替的

============================================================
拔掉master的网线
再访问192.168.238.131

==============================================================
再停掉 master上的nginx
访问238.131
#不能访问
因为keepalive监控的是IP  端口号,无法监控nginx
==================================================================

解决方法:
在server1/server2上添加监控脚本:
vi /etc/keepalived/ck_ng.sh

#!/bin/bash
#检查nginx进程是否存在
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
#尝试启动一次nginx,停止5秒后再次检测
    service nginx start
    sleep 5
    counter=$(ps -C nginx --no-heading|wc -l)
    if [ "${counter}" = "0" ]; then
#如果启动没成功,就杀掉keepalive触发主备切换
        service keepalived stop
    fi
fi

授权chmod +x /etc/keepalived/ck_ng.sh			
`server1和server2相同配置操作`

 清除掉/etc/keepalived/keepalived.conf中的注释
 重启keepalived
 再尝试关闭nginx   关不掉
因为脚本中有拉起nginx的语句,测试时可以将脚本文件位置进行改变。观察脚本的效果
本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到