负载均衡LVS集群之DR模式搭建(DR + ldirectord + Keepalived)

lvs概述:

1.LVS简介

LVS的是Linux Virtual Server的简写,翻译为Linux虚拟服务器,即一个虚拟的服务器集群系统,
是由我国章文嵩博士在1998年5月所研究成立,也是中国国内最早出现的自由软件项目之一。

2.LVS的组成

LVS 由2部分程序组成,包括 ipvs 和 ipvsadm
1. ipvs(ip virtual server):一段代码工作在内核空间,叫ipvs,是真正生效实现调度的代码。
2. ipvsadm:另外一段是工作在用户空间,叫ipvsadm,负责为ipvs内核框架编写规则,定义谁是集群服务,而谁是后端真实的服务器(Real Server)

3.LVS相关的几种IP

VIP :(virtual IP)   LVS服务器上接收外网数据报文的网卡IP地址
DIP: (director IP)  LVS服务器上发送数据报文到real server的网卡IP地址
RIP :(real server)  真实服务器上的IP,即提供服务的服务器IP(常简称为RS)
CIP :(client IP )   客户端的IP
LVS/DR模式:

1.DR模式原理

图解:
在这里插入图片描述
原理简述:

每个RS(Real Server)上都有两个IP:VIP和RIP,但是VIP是隐藏的,即不能提供解析等功能,
只是用来做请求回复的源IP的,Director(VS)上只需要一个网卡,在该网卡上配置两个IP:VIP和DIP,
在VS接收到客户端的请求后,VS根据负载算法选择一台RS的网卡mac作为客户端请求包中的目标mac,
通过arp转交给后端RS处理,后端RS再通过自己的路由网关回复给客户端client。

工作模式:

client  ---->  vs  ---->  rs  ---->  client

vs:  virtual server (虚拟服务器)
rs:  real    server (真实服务器)

2.DR模式特点

1.各DIP(VS)必须与 RIP(RS) 在同一局域网内(即具有相同的广播域),且两个有相同的目标地址(vip);
2.RS的RIP可以使用私有地址,也可以使用公网地址,以方便配置;不支持支持端口映射;
3.RS可以使用必须为uninx操作系统(OS);且RS需要配置vip但不做响应;
4.Director(VS)仅负责处理入站请求,响应报文由RS( Real server) 直接发往客户端;
5.Real server(RS)不能将网关指向DIP(DS),而直接使用前端网关响应请求报文;

3.DR模式优缺点

优点:

负载均衡器VS只负责将请求包分发给物理服务器RS,而物理服务器RS将应答包直接发给用户。所以,负载均衡器VS能处理很巨大的请求量。
这种方式,一台负载均衡能为超过100台的物理服务器服务,负载均衡器不再是系统的瓶颈。
使用LVS/DR方式,如果你的负载均VS拥有100M的全双工网卡的话,就能使得整个Virtual Server能达到1G的吞吐量,甚至更高;

缺点:

这种方式需要所有的DIR和RIP都在同一广播域;不支持异地容灾。

总结:

LVS/DR是三种模式中性能最高的一种模式,比LVS-NAT模式下负载的RS serve更多,通常在100台左右,对网络环境要求更高,也是日常应用的最多的一种工作模式。
1.轮叫机制(轮询)

实验环境:

vs: server1  172.25.66.1
rs: server2  172.25.66.2
rs: server3  172.25.66.3
VIP:172.25.66.100
DIP:172.25.66.1
RIP:172.25.66.2,172.25.66.3
CIP:172.25.66.254

1.配置虚拟服务器(vs)

#安装编写调度策略工具,报错,因为用到了高可用,故需要更改yum源
[root@server1 ~]# yum install -y ipvsadm -y 
Loaded plugins: product-id, subscription-manager
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
rhel-source                                              | 3.9 kB     00:00     
Setting up Install Process
No package ipvsadm available.
Error: Nothing to do
# 查看高可用yum源
[root@foundation66 ~]# cd /var/www/html/rhel6.5/
[root@foundation66 rhel6.5]# ls

在这里插入图片描述

#1.配置高可用yum源
[root@server1 ~]# vim /etc/yum.repos.d/rhel-source.repo 
#################
[LoadBalancer]
name=LoadBalancer
baseurl=http://172.25.66.254/rhel6.5/LoadBalancer
enabled=1

在这里插入图片描述

# 清理缓存
[root@server1 ~]# yum clean all
# 查看yum源详细信息,检查配置高可用yum源是否配置成功
[root@server1 ~]# yum repolist

在这里插入图片描述

#2.安装编写调度策略工具
[root@server1 ~]# yum install -y ipvsadm -y 
# 查看调度策略(开始什么也没有)
[root@server1 ~]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
[root@server1 ~]# lsmod

在这里插入图片描述

#3.添加策略:vip(virtual ip:虚拟ip)  -s表示算法(rr:轮询)
[root@server1 ~]# ipvsadm -A -t 172.25.66.100:80 -s rr
# 查看调度策略
[root@server1 ~]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.25.66.100:http rr
#4.添加策略: 真实ip(real ip),-a表示添加策略, -g表示直连模式(DR模式)
[root@server1 ~]# ipvsadm -a -t 172.25.66.100:80 -r 172.25.66.2:80 -g
[root@server1 ~]# ipvsadm -a -t 172.25.66.100:80 -r 172.25.66.3:80 -g
#查看调度策略
[root@server1 ~]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.25.66.100:http rr
  -> server2:http                 Route   1      0          0         
  -> server3:http                 Route   1      0          0   
#5.保存策略,默认保存在/etc/sysconfig/ipvsadm文件中
[root@server1 ~]# /etc/init.d/ipvsadm save
ipvsadm: Saving IPVS table to /etc/sysconfig/ipvsadm:      [  OK  ]    

注意:1.若策略添加错误,该怎么办?

#1).清除策略,-C表示clean
[root@server1 ~]# ipvsadm -C
[root@server1 ~]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
#2).若已经保存了策略,直接打开保存策略的文件,删除添加错误的策略即可
[root@server1 ~]# /etc/init.d/ipvsadm save
ipvsadm: Saving IPVS table to /etc/sysconfig/ipvsadm:      [  OK  ]
[root@server1 ~]# ifconfig 

在这里插入图片描述

#6.给eth1网卡添加vip, 注意:vip和调度器ip要在同一局域网内 
[root@server1 ~]# ip addr add 172.25.66.100/24 dev eth1
[root@server1 ~]# ip addr show eth1

在这里插入图片描述
2.配置真实后端服务器(rs)

在server2上:

#1.查看是否安装了apache,若是没有需要安装
[root@server2 ~]# rpm -q httpd
httpd-2.2.15-29.el6_4.x86_64
#2.编写apahce默认发布文件
[root@server2 ~]# cat /var/www/html/index.html 
<h1>www.westos.org ---- server2</h1>
#3.开启apache
[root@server2 ~]# /etc/init.d/httpd start
Starting httpd: httpd: Could not reliably determine the server's fully qualified domain name, using 172.25.66.2 for ServerName
                                                           [  OK  ]

在server3上:

#1.查看是否安装了apache,若是没有需要安装
[root@server3 ~]# rpm -q httpd
httpd-2.2.15-29.el6_4.x86_64
#2.编写默认发布文件
[root@server3 ~]# cat /var/www/html/index.html 
<h1>www.westos.org ---- server3</h1>
#3.开启apache
[root@server3 ~]#  /etc/init.d/httpd start
Starting httpd: httpd: Could not reliably determine the server's fully qualified domain name, using 172.25.66.3 for ServerName
                                                           [  OK  ]

测试:

#发现此时无法轮询
[root@foundation66 ~]# curl 172.25.66.100
^C
[root@foundation66 ~]# curl 172.25.66.100
^C
[root@foundation66 ~]# curl 172.25.66.100
^C
[root@foundation66 ~]# curl 172.25.66.100
^C
[root@foundation66 ~]# curl 172.25.66.100
^C
[root@foundation66 ~]# curl 172.25.66.100
^C

为何此时无法实现轮询呢?

(1)检查虚拟服务器

#查看策略,发现可以调度,说明调度器没有问题,问题出在后端
[root@server1 ~]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.25.66.100:http rr
  -> server2:http                 Route   1      0          2         
  -> server3:http                 Route   1      0          2         

(2)检查后端服务器

#发现没有vip,此时vs和rs无法进行通信(vs:virtual server   rs: real server)
[root@server2 ~]# ip addr show eth1

在这里插入图片描述
解决方案:给后端服务器添加vip

在server2上:

#给eth1网卡添加vip,32表示ip仅自己可用
[root@server2 ~]# ip addr add 172.25.66.100/32 dev eth1
[root@server2 ~]# ip addrshow eth1

在这里插入图片描述
在server3上:

[root@server3 ~]# ip addr show eth0

在这里插入图片描述

#给eth1网卡添加vip,32表示ip仅自己可用
[root@server3 ~]# ip addr add 172.25.66.100/32 dev eth1
[root@server3 ~]# ip addr show eth1

在这里插入图片描述
测试:

发现此时便可以轮询

[root@foundation66 ~]# curl 172.25.66.100
<h1>www.westos.org ---- server3</h1>
[root@foundation66 ~]# curl 172.25.66.100
<h1>www.westos.org ---- server2</h1>
[root@foundation66 ~]# curl 172.25.66.100
<h1>www.westos.org ---- server3</h1>
[root@foundation66 ~]# curl 172.25.66.100
<h1>www.westos.org ---- server2</h1>

查看策略,发现确实它通过vs调度器的调度算法实现了轮询

#查看策略
[root@server1 ~]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.25.66.100:http rr
  -> server2:http                 Route   1      0          4         
  -> server3:http                 Route   1      0          4         

但发现当客户访问vip时,它会随机调转到调度器VS(server1)或是后端服务器RS(server2 / server3),显然这样很不合理

#1).查看mac地址,发现访问的是调度器:server1,所以可以实现轮询
[root@foundation66 ~]# arp -an | grep 100
? (172.25.66.100) at 52:54:00:70:34:55 [ether] on br0

在这里插入图片描述

[root@server1 ~]# ip addr  show eth1

在这里插入图片描述

##2).清理缓存
[root@foundation66 ~]# arp -d 172.25.66.100
[root@foundation66 ~]# arp -an | grep 100
#发现此时无法实现轮询
[root@foundation66 ~]# curl 172.25.66.100
<h1>www.westos.org ---- server2</h1>
[root@foundation66 ~]# curl 172.25.66.100
<h1>www.westos.org ---- server2</h1>
[root@foundation66 ~]# curl 172.25.66.100
<h1>www.westos.org ---- server2</h1>
#3).查看mac地址,发现此时访问的是server2(后端服务器),所以无法实现轮询
[root@foundation66 ~]# arp -an | grep 100
? (172.25.66.100) at 52:54:00:e0:50:76 [ether] on br0

在这里插入图片描述

[root@server2 ~]# ip addr show eth1

在这里插入图片描述
当访问vip,调度的是后端服务器VS时,由于不是调度器,便没有办法根据调度算法实现轮询

## 多清理机次缓存,发现访问vip时,它是随机转到调度器或是后端服务器上,这样显然是不合理的
[root@foundation66 ~]# arp -d 172.25.66.100
[root@foundation66 ~]# curl 172.25.66.100
<h1>www.westos.org ---- server2</h1>
[root@foundation66 ~]# curl 172.25.66.100
<h1>www.westos.org ---- server2</h1>
[root@foundation66 ~]# curl 172.25.66.100
<h1>www.westos.org ---- server2</h1>
[root@foundation66 ~]# arp -d 172.25.66.100
[root@foundation66 ~]# curl 172.25.66.100
<h1>www.westos.org ---- server3</h1>
[root@foundation66 ~]# curl 172.25.66.100
<h1>www.westos.org ---- server2</h1>
[root@foundation66 ~]# curl 172.25.66.100
<h1>www.westos.org ---- server3</h1>

在这里插入图片描述
那么怎样才能实现访问vip时,只能调转到调度器上呢?

解决方案:给真实后端服务器添加arp火墙策略

在server2上:

#1.安装arp火墙管理工具
[root@server2 ~]# yum install -y arptables_jf
#2.添加火墙策略
#1).当数据流进来时,直接拒绝vip,DROP表示丢弃
[root@server2 ~]# arptables -A IN -d 172.25.66.100 -j DROP
# 查看策略
[root@server2 ~]# arptables -L

在这里插入图片描述

#2).当数据流出去时,以本机ip返回
[root@server2 ~]# arptables -A OUT -s 172.25.66.100 -j mangle --mangle-ip-s 172.25.66.2
#查看策略
[root@server2 ~]# arptables -L

在这里插入图片描述

#3.保存策略
[root@server2 ~]# /etc/init.d/arptables_jf  save
Saving current rules to /etc/sysconfig/arptables:          [  OK  ]

在server3上:

#1.安装arp工具
[root@server3 ~]# yum install -y arptables_jf
#2.添加策略
[root@server3 ~]# arptables -A IN -d 172.25.66.100 -j DROP
[root@server3 ~]# arptables -A OUT -s 172.25.66.100 -j mangle --mangle-ip-s 172.25.66.3
#查看策略
[root@server3 ~]# arptables -L
#3.保存策略
[root@server3 ~]# /etc/init.d/arptables_jf  save
Saving current rules to /etc/sysconfig/arptables:          [  OK  ]

注意:如果策略添加错误,只需刷新策略即可

# 刷新策略
[root@server2 ~]# arptables -F
[root@server3 ~]# arptables -L

在这里插入图片描述
测试:

此时便实现了稳定的轮询(当客户访问vip时,每次访问的都是调度器,无论清理多少次缓存,这样便实现了一直轮询)

#注意:在清理缓存前必须是访问的是调度器才可以
[root@foundation66 ~]# curl 172.25.66.100
<h1>www.westos.org ---- server3</h1>
[root@foundation66 ~]# curl 172.25.66.100
<h1>www.westos.org ---- server2</h1>
[root@foundation66 ~]# arp -d 172.25.66.100
[root@foundation66 ~]# curl 172.25.66.100
<h1>www.westos.org ---- server3</h1>
[root@foundation66 ~]# curl 172.25.66.100
<h1>www.westos.org ---- server2</h1>
[root@foundation66 ~]# arp -d 172.25.66.100
[root@foundation66 ~]# curl 172.25.66.100
<h1>www.westos.org ---- server3</h1>
[root@foundation66 ~]# curl 172.25.66.100
<h1>www.westos.org ---- server2</h1>
2.健康检查(DR + ldirectord)

如果某个后端服务器(RS)出现故障,我们该怎么办呢?

#1.模拟后台服务器:server3出现故障(关闭apache服务)
[root@server3 ~]# /etc/init.d/httpd stop
Stopping httpd:                                            [  OK  ]

若不设定健康检查,此时某个后端服务器挂了,客户在访问时便会出现一会儿报错,一会儿访问正常的现象,这样显然不合理

#2.此时客户在访问vip时,发现时而可以访问,时而不能访问,这样很不合理
[root@foundation66 ~]# curl 172.25.66.100
<h1>www.westos.org ---- server2</h1>
[root@foundation66 ~]# curl 172.25.66.100
curl: (7) Failed connect to 172.25.66.100:80; Connection refused
[root@foundation66 ~]# curl 172.25.66.100
<h1>www.westos.org ---- server2</h1>
[root@foundation66 ~]# curl 172.25.66.100
curl: (7) Failed connect to 172.25.66.100:80; Connection refused

解决方案:设定健康检查

安装包:

ldirectord-3.9.5-3.1.x86_64.rpm

实验前提:

#当访问vip时,已经实现了稳定的轮询
[root@foundation66 ~]# curl 172.25.66.100
<h1>www.westos.org ---- server2</h1>
[root@foundation66 ~]# curl 172.25.66.100
<h1>www.westos.org ---- server3</h1>
[root@foundation66 ~]# curl 172.25.66.100
<h1>www.westos.org ---- server2</h1>
[root@foundation66 ~]# curl 172.25.66.100
<h1>www.westos.org ---- server3</h1>

在这里插入图片描述

#1.下载安装包
[root@server1 mnt]# ls
ldirectord-3.9.5-3.1.x86_64.rpm
#安装健康检查工具,报错,有依赖性
[root@server1 mnt]# yum install -y ldirectord-3.9.5-3.1.x86_64.rpm 

在这里插入图片描述

#查看高可用yum源,/var/www/html/rhel6.5/为6.5镜像的挂载目录
[root@foundation66 ~]# cd /var/www/html/rhel6.5/
[root@foundation66 rhel6.5]# ls

在这里插入图片描述

#2.配置高可用yum源
[root@server1 mnt]# vim /etc/yum.repos.d/rhel-source.repo 
###################
[HighAvailability]
name=HighAvailability
baseurl=http://172.25.66.254/rhel6.5/HighAvailability
enabled=1

在这里插入图片描述

#清理缓存
[root@server1 mnt]# yum clean all
#查看yum源的详细信息
[root@server1 mnt]# yum repolist

在这里插入图片描述

#3.安装健康检查工具
[root@server1 mnt]# yum install -y ldirectord-3.9.5-3.1.x86_64.rpm 
#列出包含ldirec字段的软件的信息;q代表query,a代表all
[root@server1 mnt]# rpm -qa | grep ldirec
ldirectord-3.9.5-3.1.x86_64
#查看主配置文件
[root@server1 mnt]# rpm -qc ldirectord
/etc/logrotate.d/ldirectord
#查看所有配置文件(包括帮助文档)
[root@server1 mnt]# rpm -qpl ldirectord-3.9.5-3.1.x86_64.rpm

在这里插入图片描述

[root@server1 mnt]# cd /etc/ha.d
[root@server1 ha.d]# ls
resource.d  shellfuncs
[root@server1 ha.d]# pwd
/etc/ha.d
#4.拷贝文件
[root@server1 ha.d]# cp /usr/share/doc/ldirectord-3.9.5/ldirectord.cf .
[root@server1 ha.d]# ls
ldirectord.cf  resource.d  shellfuncs
#5.设定健康检查
[root@server1 ha.d]# vim ldirectord.cf 
######################
virtual=172.25.66.100:80             #vip(虚拟ip)
        real=172.25.66.2:80 gate     #rip(真实ip)
        real=172.25.66.3:80 gate
        fallback=127.0.0.1:80 gate   #若是后端服务器都出现了故障,就报错
        #receive="Test Page"
        #virtualhost=www.x.y.z

在这里插入图片描述

#6.重启ldirectord服务
[root@server1 ha.d]# /etc/init.d/ldirectord start
Starting ldirectord... success

测试:

#1.模拟后端服务器:server3出现故障(关闭apache服务)
[root@server3 ~]# /etc/init.d/httpd stop
Stopping httpd:                                            [  OK  ]
#2.查看策略,发现调度器自动将坏掉的后端服务器:server3移除了
[root@server1 ha.d]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.25.66.100:http rr
  -> server2:http                 Route   1      0          6  

在这里插入图片描述

#3.此时客户端访问时,只能访问server2,也就解决了客户在访问vip时,时而成功时而失败的窘况
[root@foundation66 ~]# curl 172.25.66.100
<h1>www.westos.org ---- server2</h1>
[root@foundation66 ~]# curl 172.25.66.100
<h1>www.westos.org ---- server2</h1>
[root@foundation66 ~]# curl 172.25.66.100
<h1>www.westos.org ---- server2</h1>

那若是两个后端服务器(RS)都出现故障了,又该再怎么解决呢?

#模拟后端服务器:server2也出现故障
[root@server2 ~]# /etc/init.d/httpd stop
Stopping httpd:    
#此时客户便无法访问,但没有给客户返回任何信息,这样显然不友好
[root@foundation66 ~]# curl 172.25.66.100
curl: (7) Failed connect to 172.25.66.100:80; Connection refused
[root@foundation66 ~]# curl 172.25.66.100
curl: (7) Failed connect to 172.25.66.100:80; Connection refused

解决方案:当两个后端服务器都出现故障时,代理服务器(vs)自动给客户一个错误信息反馈

#1.查看是否安装了apache,若没有需要自己安装
[root@server1 ha.d]# rpm -q httpd
httpd-2.2.15-29.el6_4.x86_64
#2.删除默认发布目录中的所有文件
[root@server1 ha.d]# cd /var/www/html/
[root@server1 html]# rm -rf *
[root@server1 html]# ls
#3.编写默认发布文件
[root@server1 html]# vim index.html
####################
<h1>网站正在维护.....</h1>

在这里插入图片描述

# 4.将pache的端口改为默认端口:80
[root@server1 html]# vim /etc/httpd/conf/httpd.conf 
####################
136 Listen 80

在这里插入图片描述

#查看apache的端口是否为默认端口:80
[root@server1 html]# netstat -antlup

在这里插入图片描述
测试:

#此时客户再访问vip时,便会友好的给客户返回一个报错信息
[root@foundation66 ~]# curl 172.25.66.100
<h1>网站正在维护.....</h1>
[root@foundation66 ~]# curl 172.25.66.100
<h1>网站正在维护.....</h1>
[root@foundation66 ~]# curl 172.25.66.100
<h1>网站正在维护.....</h1>

总结:

当后台服务器中有一台挂掉,这台服务器就会自动从调度器上删除,所以当访问挂调的这台服务器时,另一台服务器就会自动接替工作,此时访问便不会出错。
当两台服务器都挂了,本机自己便会接替工作,但由于它是一台服务器,在访问数据过大时,不能独自承担,所以发布站点正在维护,防止服务器崩溃。
3.高可用集群(DR+Keepalived)

那如果调度器出现故障了,该怎么办呢?

一旦调度器损坏,所有的机制都将被破坏,为了防止这种情况的发生,需要进行添加备用调度器

解决方案:配置主备调度器,即再添加一个调度器server4 ,再用Keepalived实现lvs的高可用

Keepalived简介:

Keepalived是Linux下一个轻量级别的高可用解决方案。高可用:广义来讲,是指整个系统的高可用行;狭义的来讲就是主机的冗余和接管。
Keepalived起初是为LVS设计的,专门用来监控集群系统中各个服务节点的状态,它根据TCP/IP参考模型的第三、第四层、第五层交换机制检测每个服务节点的状态,
如果某个服务器节点出现异常,或者工作出现故障,Keepalived将检测到,并将出现的故障的服务器节点从集群系统中剔除,当提供该服务器结点恢复并且正常提供服务后,
keepalived又会自动将TCP服务的节点加入到集群中。这些工作全部是自动完成的,不需要人工干涉,需要人工完成的只是修复出现故障的服务节点。

后来Keepalived又加入了VRRP的功能,VRRP(VritrualRouterRedundancyProtocol,虚拟路由冗余协议)出现的目的是解决静态路由出现的单点故障问题,
通过VRRP可以实现网络不间断稳定运行,因此Keepalvied一方面具有服务器状态检测和故障隔离功能,另外一方面也有HAcluster功能。

健康检查和失败切换是keepalived的两大核心功能。所谓的健康检查,就是采用tcp三次握手,icmp请求,http请求,udp echo请求等方式
对负载均衡器后面的实际的服务器(通常是承载真实业务的服务器)进行保活;而失败切换主要是应用于配置了主备模式的负载均衡器,
利用VRRP维持主备负载均衡器的心跳,当主负载均衡器出现问题时,由备负载均衡器承载对应的业务,从而在最大限度上减少流量损失,并提供服务的稳定性。

Keepalvied的工作原理:

Keepalived工作在TCP/IP参考模型的三层、四层、五层:

网络层(3): Keepalived通过ICMP协议向服务器集群中的每一个节点发送一个ICMP数据包(有点类似与Ping的功能),
如果某个节点没有返回响应数据包,那么认为该节点发生了故障,Keepalived将报告这个节点失效,并从服务器集群中剔除故障节点。

传输层(4): Keepalived在传输层里利用了TCP协议的端口连接和扫描技术来判断集群节点的端口是否正常,比如对于常见的WEB服务器80端口。
或者SSH服务22端口,Keepalived一旦在传输层探测到这些端口号没有数据响应和数据返回,就认为这些端口发生异常,
然后强制将这些端口所对应的节点从服务器集群中剔除掉。

应用层(5): Keepalived的运行方式也更加全面化和复杂化,用户可以通过自定义Keepalived工作方式,
例如:可以通过编写程序或者脚本来运行Keepalived,而Keepalived将根据用户的设定参数检测各种程序或者服务是否允许正常,
如果Keepalived的检测结果和用户设定的不一致时,Keepalived将把对应的服务器从服务器集群中剔除。

安装包:

keepalived-2.0.6.tar.gz

实验环境:

server1   主调度器       172.25.66.1
server4   备用调度器     172.25.66.4

server2   后端服务器     172.25.66.2
server3   后端服务器     172.25.66.3

1.配置主调度器

#1.下载安装包
[root@server1 html]# cd /mnt
[root@server1 mnt]# ls
keepalived-2.0.6.tar.gz  ldirectord-3.9.5-3.1.x86_64.rpm
#2.解压
[root@server1 mnt]# tar zxf keepalived-2.0.6.tar.gz 
[root@server1 mnt]# ls
keepalived-2.0.6  keepalived-2.0.6.tar.gz  ldirectord-3.9.5-3.1.x86_64.rpm
[root@server1 mnt]# cd keepalived-2.0.6
[root@server1 keepalived-2.0.6]# pwd
/mnt/keepalived-2.0.6
#3.源码编译三部曲:报错,有依赖性
[root@server1 keepalived-2.0.6]# ./configure  --prefix=/usr/local/keepalived --with-init=SYSV
#解决依赖性:安装 openssl-devel
[root@server1 keepalived-2.0.6]# yum install -y openssl-devel
#再次编译,没有error即可
[root@server1 keepalived-2.0.6]# ./configure  --prefix=/usr/local/keepalived --with-init=SYSV

注意:出现 no acceptable C compiler found in $PATH报错,如何解决?

[root@server1 keepalived-2.0.6]# ./configure  --prefix=/usr/local/keepalived --with-init=SYSV
.........
configure: error: in `/mnt/keepalived-2.0.6':
configure: error: no acceptable C compiler found in $PATH
See `config.log' for more details

在这里插入图片描述
安装gcc即可

[root@server1 keepalived-2.0.6]# yum install -y gcc
[root@server1 keepalived-2.0.6]# ./configure  --prefix=/usr/local/keepalived --with-init=SYSV

在这里插入图片描述

[root@server1 keepalived-2.0.6]# make && make install
[root@server1 keepalived-2.0.6]# cd /usr/local/keepalived/etc/rc.d/init.d
[root@server1 init.d]# ls
keepalived
#4.给脚本一个可执行权限
[root@server1 init.d]# chmod +x keepalived 
[root@server1 init.d]# ll
total 4
-rwxr-xr-x 1 root root 1308 Jan 25 16:05 keepalived
#5.制作软链接
[root@server1 init.d]# ln -s /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
[root@server1 init.d]# ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
[root@server1 init.d]# ln -s /usr/local/keepalived/etc/keepalived /etc/
[root@server1 init.d]# ln -s /usr/local/keepalived/sbin/keepalived /sbin/
#6.关闭健康检查服务,因为高可用自带健康检查
[root@server1 init.d]# /etc/init.d/ldirectord stop
Stopping ldirectord... success
#开机不启动
[root@server1 init.d]# chkconfig ldirectord off
#查看vip
[root@server1 init.d]# ip addr show eth1

在这里插入图片描述

#7.移除vip,因为keepalived会自动添加vip,实现vip的漂移
[root@server1 init.d]# ip addr del 172.25.66.100/24 dev eth1
RTNETLINK answers: Cannot assign requested address
[root@server1 init.d]# ip addr show eth1
#8.编写配置文件
[root@server1 init.d]# cd /etc/keepalived/
[root@server1 keepalived]# ls
keepalived.conf  samples
[root@server1 keepalived]# vim keepalived.conf 
########################## 
! Configuration File for keepalived

global_defs {
   notification_email {             #邮件报警
       root@localhost
   }
   notification_email_from keepalived@localhost     #何种身份报警
   smtp_server 127.0.0.1            #本机
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   #vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state MASTER              #指定该节点为主节点
    interface eth1            #绑定虚拟IP的网络接口,根据实际设置接口(我这里只有eth1接口!)
    virtual_router_id 51      #VRRP组名,两个节点设置一样,以指明各个节点同属一VRRP组
    priority 100              #优先级,数值在1~254,注意从节点必须比主节点的优先级别低
    advert_int 1              #组播信息发送间隔,两个节点需一致
    authentication {          #设置验证信息,两个节点需一致   
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {       #指定虚拟IP,两个节点需设置一样
        172.25.66.100         #vip
    }
}
virtual_server 172.25.66.100 80 {        #虚拟IP服务
    delay_loop 6              			 #设定检查间隔
    lb_algo rr               			 #指定LVS算法
    lb_kind DR                			 #指定LVS模式
    #persistence_timeout 50   			 #持久连接设置,会话保持时间  
    protocol TCP              			 #转发协议
 
    real_server 172.25.66.2 80 {         #后端实际TCP服务配置(rip)
        TCP_CHECK {                      #健康检查
        weight 1                         #权重
            connect_timeout 3            #延迟3秒
            retry 3                      #尝试3次
            delay_before_retry 3         #若还是不成功,则报错  
        }
    real_server 172.25.66.3 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            retry 3
            delay_before_retry 3
        }
    }
  }
}

在这里插入图片描述
在这里插入图片描述

#9.开启keepalived服务
[root@server1 keepalived]# /etc/init.d/keepalived start
Starting keepalived:                                       [  OK  ]
#发现keepalived会自动添加vip
[root@server1 ~]# ip a

在这里插入图片描述

#10.将编译好的脚本文件发送给辅调度器
[root@server1 keepalived]# scp -r  /usr/local/keepalived/ root@172.25.66.4:/usr/local

2.配置备用调度器

#配置负载均衡yum源
[root@server4 ~]# vim /etc/yum.repos.d/rhel-source.repo 
#################
[LoadBalancer]
name=LoadBalancer
baseurl=http://172.25.66.254/rhel6.5/LoadBalancer
enabled=1
[root@server4 ~]# yum clean all
[root@server4 ~]# yum repolist

在这里插入图片描述

[root@server4 ~]# yum install -y ipvsadm -y 
[root@server4 ~]# ipvsadm -l
[root@server4 ~]# ipvsadm -A -t 172.25.66.100:80 -s rr
[root@server4 ~]# ipvsadm -a -t 172.25.66.100:80 -r 172.25.66.2:80 -g
[root@server4 ~]# ipvsadm -a -t 172.25.66.100:80 -r 172.25.66.3:80 -g
[root@server4 ~]# ipvsadm -l

在这里插入图片描述

#1.查看年脚本是否有可执行权限,若是没有需要自己添加
[root@server4 ~]# cd /usr/local/keepalived/etc/rc.d/init.d
[root@server4 init.d]# ll
total 4
-rwxr-xr-x 1 root root 1308 Jan 25 16:40 keepalived
#2.制作软链接
[root@server4 init.d]# ln -s /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
[root@server4 init.d]# ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
[root@server4 init.d]# ln -s /usr/local/keepalived/etc/keepalived /etc/
[root@server4 init.d]# ln -s /usr/local/keepalived/sbin/keepalived /sbin/
#3.更改配置文件
[root@server4 init.d]# cd /etc/keepalived/
[root@server4 keepalived]# ls
keepalived.conf  samples
[root@server4 keepalived]# vim keepalived.conf
##########################
18     state BACKUP    #备用调度器
21     priority 50     #更改优先级,只需比主调度器低即可

在这里插入图片描述

#4.开启keepalived服务
[root@server4 keepalived]# /etc/init.d/keepalived start
Starting keepalived:                                       [  OK  ]

测试:

1.检测能否自动添加vip,实现调度

#keepalived会自动添加vip
[root@server1 ~]# ip a

在这里插入图片描述

[root@server4 ~]# ip a

在这里插入图片描述

#实现负载均衡
[root@foundation66 ~]# curl 172.25.66.100
<h1>www.westos.org ---- server2</h1>
[root@foundation66 ~]# curl 172.25.66.100
<h1>www.westos.org ---- server3</h1>
[root@foundation66 ~]# curl 172.25.66.100
<h1>www.westos.org ---- server2</h1>
[root@foundation66 ~]# curl 172.25.66.100
<h1>www.westos.org ---- server3</h1>

2.模拟某个后端服务器出现故障,检测高可用是否能实现健康检查

#模拟server3出现故障
[root@server3 ~]# cat /var/www/html/index.html
<h1>www.westos.org ---- server3</h1>
#发现有报错,以为没有实现健康检查?不不不,这是因为有延迟
[root@foundation66 ~]# curl 172.25.66.100
<h1>www.westos.org ---- server3</h1>
[root@foundation66 ~]# curl 172.25.66.100
curl: (7) Failed connect to 172.25.66.100:80; Connection refused
[root@foundation66 ~]# curl 172.25.66.100
<h1>www.westos.org ---- server3</h1>
[root@foundation66 ~]# curl 172.25.66.100
curl: (7) Failed connect to 172.25.66.100:80; Connection refused
#等待一会儿发现,没有报错。即说明keepalived自带健康检查
[root@foundation66 ~]# curl 172.25.66.100
<h1>www.westos.org ---- server3</h1>
[root@foundation66 ~]# curl 172.25.66.100
<h1>www.westos.org ---- server3</h1>
[root@foundation66 ~]# curl 172.25.66.100
<h1>www.westos.org ---- server3</h1>

3.模拟主调度器出现故障,检测高可用是否能实现vip的漂移

[root@server2 ~]# /etc/init.d/httpd start
Starting httpd: httpd: Could not reliably determine the server's fully qualified domain name, using 172.25.66.2 for ServerName
                                                           [  OK  ]
#模拟主调度器出现故障
[root@server1 ~]# /etc/init.d/keepalived stop
Stopping keepalived:                                       [  OK  ]
#发现vip发生了漂移
[root@server1 ~]# ip a

在这里插入图片描述

[root@server4 ~]# ip a

在这里插入图片描述
4.恢复主调度器,检测vip是否会漂移回来(会飘回来,因为主调度器的优先级高)

#恢复主调度器
[root@server1 ~]# /etc/init.d/keepalived start
Starting keepalived:                                       [  OK  ]
#发现vip飘回来了
[root@server1 ~]# ip a

在这里插入图片描述

[root@server4 ~]# ip a

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值