LVS+Keepalived群集

一。Keepalived工具

集群需要满足的特点:负载均衡,健康检查,故障切换

在应用中单台服务器承担负载应用存在单点故障的危险,一旦发生故障,企业服务将发生中断,造成损失

Keepalived工具专为LVS和HA(高可用)设计的一款健康检查工具

(1)支持故障自动切换(Failover)

(2)支持节点健康状态检查(Health Checking)

判断LVS负载调度器、节点服务器的可用性,当master主机出现故障即时切换到backup节点保证业务正常,当master故障主机恢复后将其重新加入群集并且业务重新切回master节点

(3)官方网站:http://www.keepalived.org/

二。Keepalived及工作原理

Keepalived是一个基于底层协议是VRRP热备份协议来实现的LVS服务高可用方案,可以解决静态路由出现的单点故障问题。

2.1)工作原理

在一个LVS服务集群中通常有主服务器 (MASTER)和备份服务器(BACKUP) 两种角色的服务器,但是对外表现为一个虚拟IP,主服务器会发送VRRP通告信息给备份服务器, 当备份服务器收不到VRRP消息的时候,即主服务器异常的时候,备份服务器就会接管虚拟IP,继续提供服务,从而保证了高可用性。

2.2)Keepalived体系主要模块及其作用

keepalived体系架构中主要有三个模块,分别是core、check和vrrp。

core模块∶为keepalived的核心,负责主进程的启动、维护及全局配置文件的加载和解析。

vrrp模块∶是来实现VRRP协议的。

check模块∶负责健康检查,常见的方式有端口检查及URIL检查。

2.3)VRRP(虚拟路由冗余协议)

1. 是针对路由器的一种备份解决方案

2. 多台路由器组成一个热备组,通过共用的虚拟IP地址对外提供服务

3. 每个热备组内同时只有一台主路由器提供服务,其他路由器处于冗余状态

4. 若当前在线的路由器失效,则其他路由器会根据设置的优先级自动接替虚拟IP地址,继续提供服务

工作原理

1VRRP会把多台路由器组成一个虚拟路由器组vrid,VRRP会生成一个虚拟路由器 (包含虚拟IP和虚拟mac)

2局域网内的用户不关心哪个是主哪个是备,他们只用虚拟路由器的虚拟IP作为他们的网关实际上虚拟IP是承载在master路由器也就是说实际的数据包是通过master进行转发

3masterbackup是通过优先级来决定哪个是master,优先级最大的那台就是 master其余小的都是backup

4backup只是用来监听Master定时发来的vrrp报文,如果超时未收到 master 发来的vrrp报文backup就会抢占master地位虚拟IP也会一起漂移到backup 上

三。keepalived 脑裂现象是如何产生的?那又如何解决? 

在某一次故障切换后,原来的master并没有真正的挂掉 ,VIP还在而backup 则已经抢占master地位,并也在本地配置了VIP,本来为一整体、动作协调的HA系统,就分裂成为2个独立的个体。由于相互失去了联系,都以为是对方出了故障。两个节点上的HA软件像“裂脑人”一样,争抢“共享资源”、争起“应用服务”,就会发生严重后果——或者共享资源被瓜分、2边“服务”都起不来了;或者2边“服务”都起来了,但同时读写“共享存储”,导致数据损坏(常见如数据库轮询着的联机日志出错)。这时客户端发送请求都能够做出响应造成资源的争夺

解决思路

1.  网络的层面来解决 再加一条链路需要一定的成本

 

2.  通过第三方监控软件的方式来解决 zabbix

监控服务器的状态,也监控网络的流量

 

3.  在本地通过脚本方式来解决

在master主机通过if判断是否能够ping通backup主机,ping不通2种可能性中间链路断掉了backup宕机再使用if判断使用ssh跳到某一台节点服务器ping backup主机 ,如果也ping 不通则判断backup宕机,如果Ping通则说明是中间链路问题链路问题就手动关闭maseter的keepalived工具,让backup主机顶上

 

4.  编写监控脑裂脚本

vim check_keepalived.sh

#!/bin/bash

state=$(ip addr show ens33 | grep 192.168.150.200 | wc -l)

while true

do

if [ $state -ne 0 ]

then

echo "建立VIP"

else

echo "未建立VIP"

fi

done

 

5.  命令测试确保两台负载均衡能够正常负载

例如:

[root@dd ~]# curl -H Host:www.kgc.com 192.168.150.15

<h1>this is first 1 web!</h1>

四。实验搭建LVS+Keepalived高可用群集

主DR服务器:192.168.150.5

备DR服务器:192.168.150.10

web服务器1:192.168.150.15

web服务器2:192.168.150.20

VIP:192.168.150.200

客户端:192.168.150.100

1. 配置负载调度器 (主、备相同)

systemctl stop firewalld.service

setenforce 0

yum -y install ipvsadm keepalived

modprobe ip_vs

cat /proc/net/ip_vs

 

1需要关闭icmp的重定向,不充当路由器

vim /etc/sysctl.conf

net.ipv4.ip_forward = 0

net.ipv4.conf.all.send_redirects = 0

net.ipv4.conf.default.send_redirects = 0

net.ipv4.conf.ens33.send_redirects = 0

sysctl -p

LVS+Keepalived群集

(2)启动ipvsadm工具

ipvsadm-save > /etc/sysconfig/ipvsadm          

systemctl start ipvsadm                       

ipvsadm -C                                                                 #清空规则   

LVS+Keepalived群集

3)配置keeplived(主、备DR服务器上都要设置)

cd /etc/keepalived/

cp keepalived.conf keepalived.conf.bak                                   #备份一下配置文件

vim keepalived.conf

。。。。。。。

global_defs {                                                                              #定义全局参数

--10行--修改,邮件服务指向本地

               smtp_server 127.0.0.1                                               #该IP是本机回环地址

--12行--修改,指定服务器(路由器)的名称,主备服务器名称须不同,例如主为LVS_01,备为LVS_02

               router_id LVS_01

--14行--注释或删除,取消严格遵守VRRP协议功能,否则VIP无法被连接

               #vIrp_strict

               }

vrrp_ instance VI_1 {                                                            #定义VRRP热备实例参数

--20行--修改,指定热备状态,主为MASTER,备为BACKUP

              state MASTER

--21行--修改,指定承载vip地址的物理接口

              interface ens33

-22行--修改,指定虚拟路由器的ID号,每个热备组保持一致

              virtual_router_id 10

#如果设置非抢占模式,两个节点都必须加上配置nopreempt抢占模式主机宕机,备机顶上,主机恢复则抢回master位,非抢占不会主动抢回

              nopreempt

-23行--修改,指定优先级,数值越大优先级越高,这里设置主为100,备为90

              priority 100

              advert_int 1                         #通告间隔秒数(心跳频率)

              authentication {                   #定义认证信息,每个热备组保持一致

              auth_type PASS                   #认证类型

--27行--修改,指定验证密码,主备服务器保持一致

             auth_pass abc123

              }

virtual_ipaddress {                             #指定群集vip地址

             192.168.150.200

              }

}

--36行--修改,指定虚拟服务器地址(VIP)、端口,定义虚拟服务器和Web服务器池参数

virtual server 192.168.150.200 80 {

              delay_loop 6                      #健康检查的间隔时间(秒)

              lb_algo rr                            #指定调度算法,轮询(rr

--39行--修改,指定群集工作模式,直接路由(DR)

              lb_kind DR

              persistence_timeout 50     #连接保持时间(秒)

              protocol TCP                       #应用服务采用的是TCP协议

-43行--修改,指定第一个Web节点的地址、端口

real server 192.168.150.15 80 {

               weight 1                                 #节点的权重

-45行--删除,添加以下健康检查方式

             TCP_CHECK {

             connect_port 80                 #添加检查的目标端口

              connect_timeout 5             #添加连接超时(秒)

             nb_get_retry 4                    #添加重试次数

             delay_before_retry 3           #添加重试间隔

          }

}

#添加第二个web节点的地址,端口以及健康检查方式

real server 192.168.150.20 80 {       

             weight 1                               

          TCP_CHECK {

          connect_port 80                        

           connect_timeout 5                      

          nb_get_retry 4                           

          delay_before_retry 3                       

          }

     }

###删除后面多余配置项

}

 LVS+Keepalived群集

LVS+Keepalived群集

LVS+Keepalived群集

systemctl start keepalived       

ip addr                                                    #查看虚拟网卡vip

*注意删除多余配置项后括号是否都补全,少括号依然可以启动成功但无法加载出虚拟网卡ip

LVS+Keepalived群集

2. 节点服务器配置

systemctl stop firewalld.service

setenforce 0

(1)配置承载VIP的虚拟口

cd /etc/sysconfig/network-scripts/

cp ifcfg-lo ifcfg-lo:0

vim ifcfg-lo:0

DEVICE=lo:0

ONBOOT=yes

IPADDR=192.168.150.200 

NETMASK=255.255.255.255  

ifup lo:0

ifconfig

LVS+Keepalived群集

#临时添加路由指定该接口承载VIP地址

route add -host 192.168.150.200 dev lo:0  

或添加到开机自启

vim /etc/rc.d/rc.local                    

/usr/sbin/route add -host 192.168.150.200 dev lo:0

chmod +x /etc/rc.d/rc.local

LVS+Keepalived群集

(2)调整内核的ARP响应参数

vim /etc/sysctl.conf

net.ipv4.conf.lo.arp_ignore = 1           #系统只响应目的IP为本地IP的ARP请求

net.ipv4.conf.lo.arp_announce = 2     #系统不使用IP包的源地址来设置ARP请求的源地址,而选择发送接口的IP地址

net.ipv4.conf.all.arp_ignore = 1

net.ipv4.conf.all.arp_announce = 2

sysctl -p

LVS+Keepalived群集

(3)设置首页文件启动web服务

yum -y install httpd

192.168.150.15服务器

echo <h1>this is first 1 web!</h1> > /var/www/html/index.html

192.168.150.20服务器

echo <h1>this is first 2 web!</h1> > /var/www/html/index.html

systemctl start httpd

LVS+Keepalived群集

LVS+Keepalived群集

3. 测试验证

客户端访问http://192.168.150.200

再在主服务器关闭Keepalived进行测试

LVS+Keepalived群集

手动停止master上的keepalived服务,查看是否进行主备切换

LVS+Keepalived群集

LVS+Keepalived群集

LVS+Keepalived群集

上一篇:Mybatis Plus 代码生成


下一篇:随机事件