前言
上一篇中写了lvs单机版搭建的博客单机版lvs搭建,但是实际生产中如果直接使用单机版的lvs会存在两个问题,还是这张图,我们来说下会有哪几个问题。第一,lvs只在node01上搭建,这里就存在单点故障的问题。第二,如果后面node02和node03的服务挂了,对于lvs是不可知的。
基于上面的问题,keepalived诞生了,keepalived最开始诞生就是为了解决了lvs单点的问题。但实际上keepalived不仅用在lvs上,还可以用在任何需要做主备的实现高可用的场景。
一、keepalived是什么?
keepalived是一款软件,运行在用户态空间。可以保证机器间主备高可用。
我们就事论事,就比如现在单机版的lvs存在的问题,keepalived是如何解决高可用的问题呢?
第一,node01单点故障如何解决呢?
keepalived使用主备的模型,什么是主备呢?就是主的干活,备的就是备用,等主挂了,备的就直接变成主的。这里有个知识点就是,既然有个是当主的,那么备的是怎么知道主的挂了没?这里大家可以思考下,不外乎两种可能,第一种是主的定期告诉备的,说主还活着。第二种是备的定期来问下主的是否活着。结论是keepalived使用第一种的方式。主的主动告诉备的说主的还活着。为什么采用这种方式呢?理由是减少主的压力。你想下主的肯定是干活的,一直在处理别人发给他的数据,如果这个时候备的也来掺和,主的肯定处理的东西更多了。所以keepalived采用第一种方式,通过主的定期告诉备的还活着的消息,如果备的超过多少时间没有收到消息,那么备的就会出来竞选主。
第二,如果后面node02和node03的服务挂了,对于lvs是不可知的,如何解决呢?
keepalived会针对后面每个真实的real server 起一个进程,这个进程专门用来监控real server状态。如果real server 服务挂了,那么keepalived对应的进程捕获到消息后,会把lvs 中ipvsadm -ln看到的记录,移除掉后面的real server,直到这个real server启动后,才会在ipvsadm -ln中添加这条real server 记录。
二、实验搭建
1.实验拓扑图
2.网络地址规划
主要通过vmware搭建,网络地址规划如下
主机名 | IP地址 | 虚拟IP地址(vip) | 服务 |
centos7 | 192.168.226.128 | 192.168.226.100 | lvs服务 |
node01 | 192.168.226.129 | 192.168.226.100 | lvs服务 |
node02 | 192.168.226.130 | 192.168.226.100 | apache http服务 |
node03 | 192.168.226.131 | 192.168.226.100 | apache http服务 |
3.实验操作步骤
3.1 node02和node03服务搭建
这里和上一篇单机版lvs的node02和node03搭建是一样。直接参考单机版lvs搭建的第二大步骤中的1,2操作即可
3.2 centos7和node01的keepalived和lvs搭建
都执行下面的命令,安装keepalived和ipvsadm
yum install keepalived ipvsadm -y
安装后,按照规划,我们将node01设为keepalived中的主
修改keepalived的配置文件
修改之前,作为了一个好习惯,我们要先将配置文件备份下,万一弄坏了,还可以还原
我把node01修改的配置文件贴出来,这里有几个问题说下。
第一:一定要把vrrp_strict注释掉,如果不注释掉,明明keepalived已经在你机器的ens33弄了个子接口和ip,可是你就是不能访问。
第二:
cd /etc/keepalived
cp keepalived.conf keepalived.conf_bak
! Configuration File for keepalived
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注释掉,不然你访问虚拟的ip地址
#vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
#其实这里只有两个值可以写 MASTER和BACKUP 只是个标识,实际起作用的是下面priority 的数值,越大就是master。这个大家可以通过man 5 keepalived.conf 查看下对这个得解释
state MASTER
#换成你机器的接口
interface ens33
virtual_router_id 51
#
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
#这个大家可以通过man 5 keepalived.conf 参考里面的实例写
192.168.226.100/24 dev ens33 label ens33:1
}
}
# 下面是针对上面你在virtual_ipaddress 写的vip地址。实际映射到后面哪几个服务器,在这里配置
virtual_server 192.168.226.100 80 {
delay_loop 6
#采用轮询的方式,还有其他,还是通过man 5 keepalived.conf查找
lb_algo rr
#采用直接路由的的方式,还有其他比如NAT TUN(隧道),还是通过man 5 keepalived.conf查找
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.226.130 80 {
weight 1
# HTTP_GET是健康检查,就是我们的keepalived通过调用real server 根据响应码判断服务是否存活
#具体详情还是man 5 keepalived.conf查找
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.226.131 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
备机centos7上面的keepalived.conf配置文件和上面node01的配置差不多一样。
只是centos7备上面与上面的差别是
#备上面需要将state改成BACKUP,虽然我测试的结果是这个影响不大,但是为了让维护者直观知道,这里还是很有必要写成BACKUP的
state BACKUP
#作为备的,这里值一定要比主的小,上面我们node01作为主的设置为100,那么这里只要比100小就行
priority 80
3.3 启动keepalived
在启动keepalived之前先看下网卡情况
node01
centos7
在node01和centos7上启动keepalived
systemctl start keepalived
在查看下网卡情况
node01的ens33上多了一个子接口,IP为虚拟ip(vip)
centos7上没有像node01上多个子接口,理由很简单,同一个局域网内部可能出现两个相同的ip地址
访问vip测试
192.168.226.100
说明lvs搭建成功
3.4 keepalived高可用测试
针对高可用测试。我们就要回到最开始的两个问题
第一,单点故障模拟
我们在node01 上关闭keepalived服务查看lvs主是否移动到centos7这台备上面
在node01上执行
systemctl stop keepalived
在centos7上查看网卡是否多了vip
说明,centos7机器已经从备变成主,在页面访问vip,看是否正常。经过试验是正常访问的。
第二,模拟real server 挂掉后,keepalived是否感知
最开始的centos7的ipvsadm -ln
我们在node03上执行关闭服务操作
systemctl stop httpd
然后在centos7上查看是否把node03从ipvsadm -ln中剔除
可以看到192.168.226.131(node03)这条记录被删除了。
通过浏览器我们可以正常访问,但是只能访问到node02的机器
3.5 杂记
如果在上面操作的过程中,我们的node01机器被运维处理好了,keepalived重启,那么node01是否会重登主的地位?答案是会的。理由主要是从考虑成本的问题触发。理论上我们既然选择了一台当主机,那么这台主机一定是配置较高的,而备的一般不怎么用得到,所以备机的配置比较低。所以主的修好应该要抢回主的地址。
我们将node01的keepalived服务启动
systemctl start keepalived
总结
keepalived不仅用在lvs上面,只要有需要保证可靠性的地方,需要做主备的地方,我们都可以考虑下keepalived。而实际上keepalived只是一个软件,如果没有keepalived,我们只要懂得原理,我相信,我们也能够自己开发出一款类似的软件。