install keepalived

  1. 需求
  2. 源码安装keepalived
  3. 配置负载均衡
  4. 配置realserver
  5. 启动keepalived
  6. 验证

需求

1.有4台服务器,如下

hostname ip 作用
test1 10.0.1.201 keepalived master
test2 10.0.1.202 keepalived backup
real1 10.0.1.203 realserver 1,安装nginx
real2 10.0.1.204 realserver 2,安装nginx

2.本次试验的虚拟IP:10.0.1.200

3.4台服务器同处于一个局域网中
4.要求:同一时间只能有一台服务器的nginx处理请求流量,假如现在是real2在处理请求,real1处于standby状态,将real2的nginx关闭,real1自动接管real2的流量

源码安装keepalived

1
2
3
4
5
6
7
8
wget https://www.keepalived.org/software/keepalived-2.0.17.tar.gz
tar xf keepalived-2.0.17.tar.gz
cd keepalived-2.0.17/
mkdir /opt/keepalived
./configure --prefix=/opt/keepalived
make -j2
make install
# 安装完成

配置负载均衡

1.修改配置文件
/opt/keepalived/etc/keepalived/keepalived.conf

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
39
40
41
42
43
44
45
46
47
48
49
50
51
! Configuration File for keepalived

global_defs {

router_id LVS_TEST_1
vrrp_skip_check_adv_addr

}

vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.1.200
}

}

virtual_server 10.0.1.200 80 {
delay_loop 6 #设置健康检查时间,单位是秒
lb_algo fo # 设置负载调度算法,为了满足其中一台服务器只是作热备,这里使用fo算法,非常关键
lb_kind DR #设置LVS实现LB机制,有NAT、TUNN和DR三个模式可选
#persistence_timeout 50 #保持客户端的请求在这个时间段内全部发到同一个真实服务器,单位为秒
protocol TCP

real_server 10.0.1.203 80 {
weight 1
TCP_CHECK {
connect_timeout 2 #表示2秒无响应,则超时
retry 2 #表示重试次数
delay_before_retry 1 #表示重试间隔
connect_port 80
}
}
real_server 10.0.1.204 80 {
weight 2 # 如果没看错的话,fo算法是从权重最高的之中选一台作为负载服务器
TCP_CHECK {
connect_timeout 2 #表示2秒无响应,则超时
retry 2 #表示重试次数
delay_before_retry 1 #表示重试间隔
connect_port 80
}
}
}

2.将keepalived的目录/opt/keepalived整个复制到test2,并只修改其中的三项:
state,router_id,priority
state为backup的服务器,其priority必须要小于master服务器的priority值

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
! Configuration File for keepalived

global_defs {

router_id LVS_TEST_2
vrrp_skip_check_adv_addr

}

vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 100
advert_int 1

authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.1.200
}
}

virtual_server 10.0.1.200 80 {
delay_loop 6 #设置健康检查时间,单位是秒
lb_algo fo # 设置负载调度算法,为了满足其中一台服务器只是作热备,这里使用fo算法,非常关键
lb_kind DR #设置LVS实现LB机制,有NAT、TUNN和DR三个模式可选
#persistence_timeout 50 #保持客户端的请求在这个时间段内全部发到同一个真实服务器,单位为秒
protocol TCP

real_server 10.0.1.203 80 {
weight 1
TCP_CHECK {
connect_timeout 2 #表示2秒无响应,则超时
retry 2 #表示重试次数
delay_before_retry 1 #表示重试间隔
connect_port 80
}
}
real_server 10.0.1.204 80 {
weight 2
TCP_CHECK {
connect_timeout 2 #表示2秒无响应,则超时
retry 2 #表示重试次数
delay_before_retry 1 #表示重试间隔
connect_port 80
}
}

}

3.打开内核转发

1
2
sudo sed -i 's/#net.ipv4.ip_forward=1/net.ipv4.ip_forward=1/' /etc/sysctl.conf
sysctl -p

配置realserver

1.由于是DR转发,所以realserver需要arp抑制
分别在real1和real2上执行

1
2
3
4
5
#!/bin/bash
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce

2.配置vip到realserver的lo:0接口

分别在real1和real2上执行

1
2
3
VIP=‘10.0.1.200’
ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP
route add -host $VIP dev lo:0

3.为了快捷,使用docker启动nginx
分别在real1和real2上执行:

1
2
3
docker run -d --name nginx -p 80:80 -v /opt/html:/usr/share/nginx/html nginx
hostname > /opt/html/index.html
# 为了测试效果,把主机名作为请求返回的结果,以确定是哪个服务器响应的请求

docker运行后,验证一下网嶡请求是否能正常返回:
curl 10.0.1.203
curl 10.0.1.204

启动keepalived

分别在test1和test2上执行

1
2
#!/bin/bash
/opt/keepalived/sbin/keepalived -f /opt/keepalived/etc/keepalived/keepalived.conf

验证

1.模拟一切OK的情况
curl 10.0.1.200
请求N次,返回的结果都为real2的主机名,为符合预期结果:同一时间,只能一台服务器提供服务
2.模拟real2的nginx异常退出的情况
在real2上执行:docker stop nginx,然后执行:curl 10.0.1.200
请求N次,返回的结果都为real1的主机名,为符合预期结果:将real2的nginx关闭,real1自动接管real2的流量

3.恢复一切正常后,再模拟keepalived master异常退出的情况
将test1的keepalived进程杀掉:killall keepalived
然后执行N次:curl 10.0.1.200
返回的结果都为real2的主机名,为符合预期结果:同一时间,只能一台服务器提供服务

4.恢复一切正常后,再模拟keepalived master服务器宕机的情况
将test1的keepalived进程杀掉:killall keepalived
将real2的nginx关闭:docker stop nginx
然后执行N次:curl 10.0.1.200
返回的结果都为real1的主机名,为符合预期结果:将real2的nginx关闭,real1自动接管real2的流量

5.恢复一切正常后,再模拟keepalived backup服务器宕机的情况
将test2的keepalived进程杀掉:killall keepalived
将real2的nginx关闭:docker stop nginx
然后执行N次:curl 10.0.1.200
返回的结果都为real1的主机名,为符合预期结果:将real2的nginx关闭,real1自动接管real2的流量


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 rootid@126.com

文章标题:install keepalived

本文作者:Shawn

发布时间:2019-07-30, 14:57:42

最后更新:2019-07-30, 17:24:30

原始链接:https://gitrootid.github.io/2019/07/30/tools/install-keepalived_/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏