Web服务器群集——LVS-DR+Keepalived高可用集群

LVS-DR+Keepalived高可用集群

  • 什么是高可用集群?
  • 高可用集群的衡量标准
  • 自动切换/故障转移(FailOver)
  • 自动侦测
    • 脑裂
      • 常见解决方案
  • Keepalived
    • Keepalived是什么?
    • keepalived工作原理
    • keepalived主要有三个模块
  • Keepalived配置
    • 初识Keepalived,实现Web服务器的高可用集群
    • Keepalived感知Nginx
    • Keepalived+LVS-DR集群配置

什么是高可用集群?

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

高可用集群的衡量标准

  • 要保证集群服务的100%时间永远完全可用,几乎可用说是一件不可能完成的任务。
  • 比如,淘宝在这几年双十一刚开始的时候,一下子进来买东西的人很多,访问量大,都出现一些问题,如下单后却支付不了。所以说只能保证服务尽可能的可用,当然有些场景相信还是可能做到100%可用的。
  • 通常用平均无故障时间(MTTF:mean time to failure)来度量系统的可靠性,用平均故障维修时间(MTTR:mean time to restoration)来度量系统的可维护性。于是可用性被定义为:HA=MTTF/(MTTF+MTTR)*100%。

具体HA(高可用)衡量标准:
Web服务器群集——LVS-DR+Keepalived高可用集群_第1张图片

  • 其他高可用方案heartbeat、pacemaker、piranha (web页面)

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

  • 自动切换阶段某一主机如果确认对方故障,则正常主机除继续进行原来的任务,还将依据各种容错备援模式接管预先设定的备援作业程序,并进行后续的程序及服务。
  • 通俗地说,即当A无法为客户服务时,系统能够自动地切换,使B能够及时顶上继续为客户提供服务,且客户感觉不到这个为他提供服务的对象已经更换。
  • 通过上面判断节点故障后,将高可用集群资源(如VIP、httpd等)从该不具备法定票数的集群节点转移到故障转移域(Failover Domain,可以接收故障资源转移的节点)。

自动侦测

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

脑裂

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

常见解决方案

  • 添加冗余的心跳线,例如:双线条线(心跳线也HA),尽量减少“裂脑"发生几率;
  • 启用磁盘锁,正在服务一方锁住共享磁盘,“裂脑"发生时,让对方完全"抢不走"共享磁盘资源。但使用锁磁盘也会有一个不小的问题,如果占用共享盘的一方不主动“解锁",另一方就永远得不到共享磁盘。现实中假如服务节点突然死机或崩溃,就不可能执行解锁命令。后备节点也就接管不了共享资源和应用服务。于是有人4HA中设计了“智能"锁。即:正在服务的一方只在发现心跳线全部断开(察觉不到对端)时才启用磁盘锁。平时就不上锁了。
  • 设置仲裁机制,例如设置参考IP(如网关IP或某一个服务器),当心跳线完全断开时,2个节:都各自ping一下参考IP,不通则表明断点就出在本端。不仅“心跳”、还兼对外“服务"的本端网络链路断了,即使启动(或继续)应用服务也没有用了,那就主动放弃竞争,让能够ping通参考IP的一端去起服务。更保险一些,ping不通参考IP的一方干脆就自我重启,以彻底释放有可能还占用着的那些共享资源。
  • 裂脑的监控报警,如邮件及手机短信等或值班,当然,在实施高可用方案时,要根据业务实际需求确定是否能容忍这样的损失。对于一般的网站常规业务.这个损失是可容忍的。

Keepalived

Keepalived是什么?

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

keepalived工作原理

  • keepalived是以VRRP,协议为实现基础的,VRRP全称Virtual Router RedundancyProtocol,即虚拟路由冗余协议
  • 将N台提供相同功能的服务器组成一个服务器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该服务器所在局域网内其他机器的默认路由为该vip) , master会发组播,当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master

keepalived主要有三个模块

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

Keepalived配置

初识Keepalived,实现Web服务器的高可用集群

Server1:192.168.100.10
Server2:192.168.100.20
VIP:192.168.100.100

一、Server1:Master的配置

Server1:192.168.100.10

#创建etc下的keepalived目录,编辑配置文件
[root@server1 ~]# yum -y install keepalived                #安装keepalived
[root@server1 ~]# vim /etc/keepalived/keepalived.conf      #编辑主配置文件
#将原有的配置文件清空添加如下
!Configuration File for keepalived                         #keepalived配置文件文档声明
global_defs {
                                                   #全局配置
router_id 1                                                #路由器编号,设备在组中的标识
   }

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

vrrp_instance VI_1 {
                                            #VRRP模块实例 VI_1,实例名,两台路由器相同
        state MASTER                                       #主或从状态
        interface ens32                                    #监控心跳网卡,(因为实验环境就一张网卡所以监控ens32)
        mcast_src_ip 192.168.100.10                        #心跳源IP
        virtual_router_id 55                               #虚拟路由编号,主备一致
        priority 100                                       #优先级
        advert_int 1                                       #心跳间隔/秒

        authentication {
                                        #认证模块
        auth_type PASS                                     #认证类型为密码认证
        auth_pass 123456                                   #认证密码123456
        }

virtual_ipaddress {
                                             #VIP
        192.168.100.100
}

#track_script {                                            #跟踪脚本
#       chk_nginx
#       }
}
[root@server1 ~]# scp -r /etc/keepalived/keepalived.conf 192.168.100.20:/etc/keepalived/ #复制至back服务器
[root@server1 ~]# systemctl enable keepalived                                            #开机自启

#安装nginx
[root@server1 ~]# yum -y install nginx                 #安装nginx,默认yum源中1.16.1版本
[root@server1 ~]# systemctl enable nginx --now
[root@server1 ~]# vim /usr/share/nginx/html/index.html #测试keepalived修改默认主页内容
...
131 <div id="content">
132 
133         <h1>Welcome to CentOS Pakho one</h1>
...
[root@server1 ~]# systemctl start keepalived           #启动keepalived
http://192.168.100.10/

在这里插入图片描述
二、Server2:Backup的配置

Server2:192.168.100.20

#backup服务器的配置几处修改
[root@server2 ~]# yum -y install keepalived
[root@server2 ~]# vim /etc/keepalived/keepalived.conf
...
        state BACKUP                                   #改为backup服务器
...
        mcast_src_ip 192.168.100.20                    #改为backup真实服务器
...
        priority 99                                    #优先级99
[root@server2 ~]# systemctl enable keepalived
[root@server2 ~]# yum -y install nginx
[root@server2 ~]# systemctl enable nginx --now
[root@server2 ~]# vim /usr/share/nginx/html/index.html
...
131 <div id="content">
132 
133         <h1>Welcome to CentOS Pakho two</h1>
...
[root@server2 ~]# systemctl start keepalived
http://192.168.100.20/

在这里插入图片描述
三、客户端访问

#访问vip:   http://192.168.100.100/

Web服务器群集——LVS-DR+Keepalived高可用集群_第2张图片

#拔掉master服务器网线模拟master服务器宕机

在这里插入图片描述

http://192.168.100.100/ #再次访问vip

Web服务器群集——LVS-DR+Keepalived高可用集群_第3张图片

Keepalived感知Nginx

  • 恢复之前的实验,启动两台主机的keepalived和nginx,确保页面访问正常,关闭master的nginx服务
[root@server1 ~]# systemctl stop nginx
  • 继续访问VIP,页面不会切换到slave
  • 原因是keepalived监控的是接口IP状态。无法监控nginx服务状态

一、编辑监控脚本

Server1:192.168.100.10

#添加nginx监控脚本
[root@server1 ~]# vim /etc/keepalived/ck_ng.sh
#!/bin/bash
#检查nginx进程是否存在
counter=$(ps -C nginx --no-heading | wc -l)

if [ "${counter}" = 0 ] ;then
#尝试启动一次nginx,停止五秒后再次检测
systemctl restart nginx
sleep 5
        if [ "${counter}" = 0 ];then
#如果没有启动成功,杀死keepalived进程触发主备切换
        systemctl stop keepalived
        fi
fi
[root@server1 ~]# chmod +x /etc/keepalived/ck_ng.sh
[root@server1 ~]# scp /etc/keepalived/ck_ng.sh 192.168.100.20:/etc/keepalived/

Server2:192.168.100.20

[root@server2 ~]# chmod +x /etc/keepalived/ck_ng.sh

二、启动监控脚本

Server1:192.168.100.10

[root@server1 ~]# vim /etc/keepalived/keepalived.conf
#取消注释即可
...
vrrp_script chk_nginx {
     
        script "/etc/keepalived/ck_ng.sh"                #脚本位置
        interval 2                                       #每两秒钟执行一次
        weight -5                                        #减去本机优先级
        fall 3                                           #尝试三次
        }
...
track_script {
     
        chk_nginx                                        #chk_nginx对应上方策略名
        }
...
[root@server1 ~]# systemctl restart nginx keepalived

Server2:192.168.100.20同理

[root@server2 ~]# vim /etc/keepalived/keepalived.conf
...
[root@server2 ~]# systemctl restart nginx keepalived

Keepalived+LVS-DR集群配置

Web服务器群集——LVS-DR+Keepalived高可用集群_第4张图片

Master:192.168.100.10
backup:192.168.100.20
web1:192.168.100.30
web2:192.168.100.40
VIP:192.168.100.100

一、在Master上安装Keepalived

ipvsadm安装并不启动,因为在keepalived配置中集成了ipvs代码

[root@master ~]# yum -y install keepalived ipvsadm   

二、在Master上修改配置文件

[root@master ~]# vim /etc/keepalived/keepalived.conf
#将原有的配置文件清空添加如下

#Keepalived配置
!Configuration File for keepalived                         #keepalived配置文件文档声明
global_defs {
                                                   #默认的全局配置
        route_id Director1                                #该设备在组当中的名字,两边不一样
}

vrrp_instance VI_1 {
                                            #VRRP模块实例 VI_1,实例名,两台路由器相同
        state MASTER                                       #主或从状态,另外一台是BACKUP
        interface ens32                                    #心跳网卡
        virtual_router_id 51                               #虚拟路由编号,两边一样即可
        priority 150                                       #优先级
        advert_int 1                                       #检查间隔/秒
                authentication {
                                #认证模块
                auth_type PASS                             #认证类型为密码认证
                auth_pass 1111                             #认证密码1111
                }
        virtual_ipaddress {
                                     #VIP和工作接口
        192.168.100.100/24 dev ens32
        }       
}       

#LVS-DR配置
virtual_server 192.168.100.100 80 {
                             #VIP
        delay_loop 3                                       #服务轮询时间间隔,每三秒测试真实服务器是否存活
        lb_algo rr                                         #负载均衡策略算法 rr:轮询
        lb_kind DR                                         #LVS集群模式 DR
        protocol TCP                                       #协议为TCP协议
                real_server 192.168.100.30 80 {
                 #真实后端服务器
                weight 1                                   #权重1
                TCP_CHECK {
                                     #TCP校验
                connect_timeout 3                          #健康检查方式,连接超时时间,与delay_loop配合使用
                        }
                }
                real_server 192.168.100.40 80 {
                 #真实后端服务器
                weight 1                                   #权重1
                TCP_CHECK {
                                     #TCP校验 
                connect_timeout 3                          #健康检查方式,连接超时时间,与delay_loop配合使用
                        }
                }
}

三、在backup上安装keepalived

ipvsadm安装不启动

[root@backup ~]# yum -y install keepalived ipvsadm

四、拷贝Master上的keepalived.conf到backup上

[root@backup ~]# scp 192.168.100.10:/etc/keepalived/keepalived.conf /etc/keepalived/

五、拷贝后修改配置文件

[root@backup ~]# vim /etc/keepalived/keepalived.conf
...
        route_id Director2
...
        state BACKUP
...
        priority 100                                      #优先级100,低于Master即可
...

六、Master和backup上启动服务

[root@master ~]# systemctl enable keepalived --now
[root@master ~]# shutdown -r now                           #重启

[root@backup ~]# systemctl enable keepalived --now
[root@backup ~]# shutdown -r now

七、Web服务器配置

web1和web2相同配置

[root@web1 ~]# yum -y install httpd && systemctl enable httpd --now
[root@web1 ~]# echo Pakho1 > /var/www/html/index.html
[root@web2 ~]# yum -y install httpd && systemctl enable httpd --now
[root@web2 ~]# echo Pakho2 > /var/www/html/index.html

八、配置虚拟地址

[root@web1 ~]# cp /etc/sysconfig/network-scripts/ifcfg-lo /etc/sysconfig/network-scripts/ifcfg-lo:0
[root@web1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-lo:0
#其余行删除,修改如下
DEVICE=lo:0                                                #子接口
IPADDR=192.168.100.100                                     #VIP地址
NETMASK=255.255.255.255                                    #子网掩码
ONBOOT=yes                                                 #开机自启

[root@web2 ~]# scp 192.168.100.30:/etc/sysconfig/network-scripts/ifcfg-lo:0 /etc/sysconfig/network-scripts/

九、配置路由

[root@web1 ~]# vim /etc/rc.local
...
/sbin/route add -host 192.168.100.100 dev lo:0

[root@web2 ~]# vim /etc/rc.local
...
/sbin/route add -host 192.168.100.100 dev lo:0

十、配置ARP

[root@web1 ~]# vim /etc/sysctl.conf
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2                        #忽略arp请求,可以回复

[root@web2 ~]# vim /etc/sysctl.conf
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
[root@web1 ~]# shutdown -r now
[root@web2 ~]# shutdown -r now

十一、测试

#将Master网线断开
http://192.168.100.100/

在这里插入图片描述

#将Master网线连接,断开backup
http://192.168.100.100/

在这里插入图片描述
实现负载均衡高可用集群,实验完成!

你可能感兴趣的:(Web服务器群集,运维,lvs)