热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

lvs概述:1.LVS简介LVS的是LinuxVirtualServer的简写,翻译为Linux虚拟服务器,即一个虚拟的服务器集群系统

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 ----> clientvs: 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

www.westos.org ---- server2


#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

www.westos.org ---- server3


#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

www.westos.org ---- server3


[root@foundation66 ~]# curl 172.25.66.100

www.westos.org ---- server2


[root@foundation66 ~]# curl 172.25.66.100

www.westos.org ---- server3


[root@foundation66 ~]# curl 172.25.66.100

www.westos.org ---- server2


查看策略,发现确实它通过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

www.westos.org ---- server2


[root@foundation66 ~]# curl 172.25.66.100

www.westos.org ---- server2


[root@foundation66 ~]# curl 172.25.66.100

www.westos.org ---- server2


#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

www.westos.org ---- server2


[root@foundation66 ~]# curl 172.25.66.100

www.westos.org ---- server2


[root@foundation66 ~]# curl 172.25.66.100

www.westos.org ---- server2


[root@foundation66 ~]# arp -d 172.25.66.100
[root@foundation66 ~]# curl 172.25.66.100

www.westos.org ---- server3


[root@foundation66 ~]# curl 172.25.66.100

www.westos.org ---- server2


[root@foundation66 ~]# curl 172.25.66.100

www.westos.org ---- server3


在这里插入图片描述
那么怎样才能实现访问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

www.westos.org ---- server3


[root@foundation66 ~]# curl 172.25.66.100

www.westos.org ---- server2


[root@foundation66 ~]# arp -d 172.25.66.100
[root@foundation66 ~]# curl 172.25.66.100

www.westos.org ---- server3


[root@foundation66 ~]# curl 172.25.66.100

www.westos.org ---- server2


[root@foundation66 ~]# arp -d 172.25.66.100
[root@foundation66 ~]# curl 172.25.66.100

www.westos.org ---- server3


[root@foundation66 ~]# curl 172.25.66.100

www.westos.org ---- server2



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

www.westos.org ---- server2


[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

www.westos.org ---- server2


[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

www.westos.org ---- server2


[root@foundation66 ~]# curl 172.25.66.100

www.westos.org ---- server3


[root@foundation66 ~]# curl 172.25.66.100

www.westos.org ---- server2


[root@foundation66 ~]# curl 172.25.66.100

www.westos.org ---- server3


在这里插入图片描述

#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 gatefallback=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

www.westos.org ---- server2


[root@foundation66 ~]# curl 172.25.66.100

www.westos.org ---- server2


[root@foundation66 ~]# curl 172.25.66.100

www.westos.org ---- server2


那若是两个后端服务器(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
####################

网站正在维护.....


在这里插入图片描述

# 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

网站正在维护.....


[root@foundation66 ~]# curl 172.25.66.100

网站正在维护.....


[root@foundation66 ~]# curl 172.25.66.100

网站正在维护.....


总结:

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

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.4server2 后端服务器 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 keepalivedglobal_defs {notification_email { #邮件报警root@localhost}notification_email_from keepalived@localhost #何种身份报警smtp_server 127.0.0.1 #本机smtp_connect_timeout 30router_id LVS_DEVELvrrp_skip_check_adv_addr#vrrp_strictvrrp_garp_interval 0vrrp_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 PASSauth_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 1TCP_CHECK {connect_timeout 3retry 3delay_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

www.westos.org ---- server2


[root@foundation66 ~]# curl 172.25.66.100

www.westos.org ---- server3


[root@foundation66 ~]# curl 172.25.66.100

www.westos.org ---- server2


[root@foundation66 ~]# curl 172.25.66.100

www.westos.org ---- server3


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

#模拟server3出现故障
[root@server3 ~]# cat /var/www/html/index.html

www.westos.org ---- server3


#发现有报错,以为没有实现健康检查?不不不,这是因为有延迟
[root@foundation66 ~]# curl 172.25.66.100

www.westos.org ---- server3


[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

www.westos.org ---- server3


[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

www.westos.org ---- server3


[root@foundation66 ~]# curl 172.25.66.100

www.westos.org ---- server3


[root@foundation66 ~]# curl 172.25.66.100

www.westos.org ---- server3


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

在这里插入图片描述


推荐阅读
  • Ihavetwomethodsofgeneratingmdistinctrandomnumbersintherange[0..n-1]我有两种方法在范围[0.n-1]中生 ... [详细]
  • 用阿里云的免费 SSL 证书让网站从 HTTP 换成 HTTPS
    HTTP协议是不加密传输数据的,也就是用户跟你的网站之间传递数据有可能在途中被截获,破解传递的真实内容,所以使用不加密的HTTP的网站是不 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • 解决Bootstrap DataTable Ajax请求重复问题
    在最近的一个项目中,我们使用了JQuery DataTable进行数据展示,虽然使用起来非常方便,但在测试过程中发现了一个问题:当查询条件改变时,有时查询结果的数据不正确。通过FireBug调试发现,点击搜索按钮时,会发送两次Ajax请求,一次是原条件的请求,一次是新条件的请求。 ... [详细]
  • 本文将详细介绍如何在Mac上安装Jupyter Notebook,并提供一些常见的问题解决方法。通过这些步骤,您将能够顺利地在Mac上运行Jupyter Notebook。 ... [详细]
  • 如何在Linux服务器上配置MySQL和Tomcat的开机自动启动
    在Linux服务器上部署Web项目时,通常需要确保MySQL和Tomcat服务能够随系统启动而自动运行。本文将详细介绍如何在Linux环境中配置MySQL和Tomcat的开机自启动,以确保服务的稳定性和可靠性。通过合理的配置,可以有效避免因服务未启动而导致的项目故障。 ... [详细]
  • 在软件开发过程中,经常需要将多个项目或模块进行集成和调试,尤其是当项目依赖于第三方开源库(如Cordova、CocoaPods)时。本文介绍了如何在Xcode中高效地进行多项目联合调试,分享了一些实用的技巧和最佳实践,帮助开发者解决常见的调试难题,提高开发效率。 ... [详细]
  • MySQL的查询执行流程涉及多个关键组件,包括连接器、查询缓存、分析器和优化器。在服务层,连接器负责建立与客户端的连接,查询缓存用于存储和检索常用查询结果,以提高性能。分析器则解析SQL语句,生成语法树,而优化器负责选择最优的查询执行计划。这一流程确保了MySQL能够高效地处理各种复杂的查询请求。 ... [详细]
  • Ubuntu 22.04 安装搜狗输入法详细指南及常见问题解决方案
    本文将详细介绍如何在 Ubuntu 22.04 上安装搜狗输入法,并提供常见问题的解决方法。包括下载安装包、更新源、安装依赖项等步骤。 ... [详细]
  • 事件是程序各部分之间的一种通信方式,也是异步编程的一种实现形式。本文将详细介绍EventTarget接口及其相关方法,以及如何使用监听函数处理事件。 ... [详细]
  • 兆芯X86 CPU架构的演进与现状(国产CPU系列)
    本文详细介绍了兆芯X86 CPU架构的发展历程,从公司成立背景到关键技术授权,再到具体芯片架构的演进,全面解析了兆芯在国产CPU领域的贡献与挑战。 ... [详细]
  • 短暂的人生中,IT和技术只是其中的一部分。无论换工作还是换行业,最终的目标是成功、荣誉和收获。本文探讨了技术人员如何跳出纯技术的局限,实现更大的职业发展。 ... [详细]
  • 三角测量计算三维坐标的代码_双目三维重建——层次化重建思考
    双目三维重建——层次化重建思考FesianXu2020.7.22atANTFINANCIALintern前言本文是笔者阅读[1]第10章内容的笔记,本文从宏观的角度阐 ... [详细]
  • 浅析python实现布隆过滤器及Redis中的缓存穿透原理_python
    本文带你了解了位图的实现,布隆过滤器的原理及Python中的使用,以及布隆过滤器如何应对Redis中的缓存穿透,相信你对布隆过滤 ... [详细]
  • 本文介绍如何使用OpenCV和线性支持向量机(SVM)模型来开发一个简单的人脸识别系统,特别关注在只有一个用户数据集时的处理方法。 ... [详细]
author-avatar
我要知道521无敌
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有