基于keepalived的LVS的搭建

负载均衡-基于keepalived的LVS的搭建

Posted by 石福鹏 on 2021-03-13
Estimated Reading Time 9 Minutes
Words 2.4k In Total
Viewed Times

前面几节都说了负载均衡,是如何负载的

但是会有些隐患:

1、负载均衡服务器的单点故障问题
负载均衡服务器一直是单点的,这就存在隐患,如果挂机,整个请求都进不来;

2、Real-server的部分挂掉
另外,Real-server中部分服务也会挂掉,但是负载均衡服务器对负载的服务器都有记录,所以请求还是会进入到挂掉的服务器,没有应用层去接受并处理这个数据包;所以这样并不会返回成功;会让一部分客户端出现问题

解决问题:

一、负载均衡服务器的单点故障问题

单点故障的解决方式:单点就是一个节点,那么我们就用N个

2个思路:多点;

形式:a)主备(有主机,backup备用机);b)主主(所有的lvs都是主)

前者用的比较多,那么主备怎么实现?

那备机怎么知道主机挂了?

1、方向性

a、备机主动轮巡询问主机
缺点: 如果有好几台备机,那么备机每个单位时间询问主机挂没挂,那这些健康检查的请求都需要主机响应,主机的网卡上既要接受正常的请求数据包,还要接受心跳包,对主或多或少有压力

b、主周期性的向外发出广播包
但是只要牵扯到网络,就没有一次性确认的说法,因为网络中有很多不确定因素,一般会有重试机制

2、效率性

举个例子:皇上和皇子们,有两三天,皇上没来上朝,那么皇子们就可以登基了,这就牵扯到一个效率性的问题了,这么多皇子,哪一个来登基。一般来说,就是这个太子(长兄为父)来登基,这就相当于加权。

就效率性上来说,如果没有一定的规则,那么就会争抢,争抢好多轮可能都不会有结果,但是如果加了一个条件,即每一个备机上都加了一个权重值,即争抢制度->推让制,基本上一轮投票就可以投出来。

根据上面的分析,我们采用主备模型 来解决隐患

主备和主从需要注意区分:

主备是,只要主在,备就在旁边待着,等主挂了,备再上;

主从是,主从来写作,主做主的事情,从做从的事情

一般主从里面,主又是单点,所以主里面又会做主从来实现高可用

二、Real-server的部分挂掉

如何确定一个real_server挂机了

这里很多人会考虑到使用ping,需要注意,网络有七层,而ping IP,这个IP在网络层,能ping通只能代表网络是没问题的,连握手都确定不了,所以ping肯定是不行的

最简单的方式:访问一下;底层即验证的是应用层的http协议:发请求,。判断返回200 OK状态码

三、keepalived

是一个通用的工具,主要作为高可用(HA)实现

Nginx 可以作为公司的负载均衡来用,nginx作为单点故障,也可以用keepalived解决高可用问题

代替人自动运维,解决单点故障,实现高可用

1、监控自己的服务

2、Master通告自己还活着,Backup监听Master状态,Master挂了,一堆Backup推举出一个新的Master

3、配置VIP,添加lvs配置,添加ipvs(即网络高并发负载均衡(三)这节中最后讲的配置)

4、对后端的server做健康检查,如果某一台挂了,就要把负载均衡服务器中的那台服务器的条目删掉

在负载均衡服务器上,安装keepalived

前提:网络负载均衡实践手册这节课中对的负载均衡服务器做了一系列的配置,都要清除掉(keepalived会帮忙做这些事情),但是real-server不需要清除

四、实战

1、把ipvs的配置清掉、把VIP的配置也清掉

通过ifconfigipvsadm -ln 查看配置的东西都在,执行下面的命令清理ipvs

1
ipvsadm -C

image-20210311171454270

把VIP卸载

1
ifconfig eth0:8 down

2、新增一台裸机node04,在node01、node04上安装应用程序keepalived

1
yum  install keepalived -y ipvsadm -y

注意:安装了keepalived之后,就可以读配置文件去配置内核的ipvs的模块,相当于说keepalived可以替代ipvsadm这个命令

但是后面还要用一下,所以还是装一下,但是不装不影响

3、配置

/etc/keepalived/目录,为了安期间,给配置文件keepalived.conf文件做个备份

1
cp keepalived.conf keepalived.conf.bak
1
vi keepalived.conf

Vrrp: 虚拟路由冗余协议

配置一:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.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 # 这里state=MASTER 代表当前的机器是主机 如果是备机的话,这里为BACKUP
interface eth0 # 企业中不太可能只有一个网络,所以一般会给服务器安装多个网卡,即使这块网卡挂了,不影响其他的网络
virtual_router_id 51 # 虚拟路由ID 标识ID
priority 100 #权重值
advert_int 1 #
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { # VIP 负载均衡服务器的IP
192.168.200.16
192.168.200.17
192.168.200.18
}
}

virtual_server 192.168.200.100 443 {
delay_loop 6
}

这里有个小技巧,Linux中有个帮助文档,没有安装的安装一下

1
yum install man -y

比如配置到上面的virtual_ipaddress不会配置了,

1
man 5 keepalived keepalived.conf

通过帮助中心看到:

1
2
3
4
5
6
virtual_ipaddress {
<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL>
192.168.200.17/24 dev eth1
192.168.200.18/24 dev eth2 label eth2:1
}
# ip地址/掩码 桥接器 网络设备 权重值 label标签

主:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.150.100/24 dev eth0 label eth0:3 # eth0:3 # 子接口
}
}

备:只需要修改state、priority

1
2
3
4
5
6
7
8
9
10
11
12
13
14
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.150.100/24 dev eth0 label eth0:3 # eth0:3 # 子接口
}
}

配置二:(对lvs的配置-即使用ipvsadm做的一些配置)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
virtual_server 192.168.150.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR # 模型
nat_mask 255.255.255.0
# 保持客户端的请求在这个时间段内全部发到同一个真实服务器,
# 实验环境的时候暂时使用0,生产环境在调整成适合的时间
persistence_timeout 0
protocol TCP

# 以上的配置相当于之前配置中的ipvsadm -A... 命令
# 下面的配置出口 RIP
real_server 192.168.150.12 80 {
weight 1
# 对real-server的健康检查
HTTP_GET {
url {
path /
status_code 200 # 判断是否是200状态码
}
connect_timeout 3
nb_get_retry 3 # 重试次数
delay_before_retry 3 # 间隔时间
}
}
real_server 192.168.150.13 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}

上面的配置中有一点小知识点:

当你需要复制HTTP_GET这个对象体,一些vi 命令是需要知道的,

将光标移动到12行的最前面,然后按:.,$-1y,然后回车,就会提示xx行 lines yanked,就复制成功了

然后将光标移动到24行的最前面,然后按下p,就粘过来了

.代表光标所在位置

,到哪里

$ 文件的最后一行

$-1即36行的位置

y复制

同理,node04有需要配置一遍

前面的配置拷贝过来覆盖一下就好了,在node01的/etc/keepalived/目录下

1
2
3
scp ./keepalivd.conf root@node04:/etc/keepalived/  # scp 远程拷贝
# 或者
scp ./keepalivd.conf root@node04:`pwd` # `pwd` 打印当前的工作路径

然后把 state MASTER 改成 state BACKUP ;权重改成50,其他不需要修改

4、启动

1
service keepalived start 

然后可以尝试使用将主机的网卡down掉,来测试是否起作用

另外可以测试当real-server一台挂掉,到node02节点下:

1
service httpd stop

刷新页面,发现只会访问13这台服务器了,

5、通过造成keepalived异常退出,而出现的一个bug

做HA是有第三方软件keepalived来做的,但是keepalived是一个程序,就有可能存在程序异常退出

通过ps - fe | grep kee 找到keepalived进程,并强制杀掉kill -9 [进程Id]

程序正常退出和异常退出是不一样的,正常退出一般都是有回收方法的,关闭或者释放一些资源。而强制退出,就是还没来的及关闭或者释放这些

针对上面说的,强制退出,就会导致keepalived没有收回VIP,内核配置也没有收回。这个时候,node01上面依然有VIP,但是keepalived进程已经没有了,所以没有了广播自己还存活的通知。所以备机就不知道主机还存活,所以备机的网卡就会升级成VIP

所以负载均衡服务器出现两台主机,这就回造成客户端收到的数据包混乱,破坏数据的原子性;具体表现可能就是一个连接的三次握手可能负载在不同的服务器,造成连接不成功或者丢弃数据包的情况

这里的keepalived同样是单兵作战,这个时候我们又想到了集群,想到了zookeeper来解决这个不可靠的问题


如果您喜欢此博客或发现它对您有用,则欢迎对此发表评论。 也欢迎您共享此博客,以便更多人可以参与。 如果博客中使用的图像侵犯了您的版权,请与作者联系以将其删除。 谢谢 !