keepalived实现lvs调度
实验目的:
用keepalived实现使用lvs的dr模式来做调度,调度算法使用rr模式方便测试。
实验环境:
网卡均为eth0,保证集群中每台服务器的时间时相同的,用ntpdate可以同步,然后关闭selinux和iptables。
虚拟ip为172.16.10.1和172.16.10.2(双主模型,所以需要两个虚拟ip)
两台调度器ip地址分别为172.16.200.101和172.16.200.102
两台节点ip地址为172.16.10.3和172.16.10.4
实验过程:
2.配置节点服务器,设置arp响应级别和虚拟ip,将这些配置写到一个脚本中,方便管理,如下(注意,这里要实现双主模型,而且是DR模型,所以节点主机和调度器的vip要一致,而双主模型需要两个前端的虚拟IP,所以节点主机也需要配置两个VIP):
在两个节点的/root目录下,创建文件lvs.sh,然后写入脚本
vim lvs.sh
#!/bin/bash
vip=172.16.10.2
vip2=172.16.200.100
mask=255.255.255.255
iface="lo:0"
iface2="lo:1"
case $1 in
start)
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
ifconfig $iface $vip netmask $mask broadcast $vip up
ifconfig $iface2 $vip2 netmask $mask broadcast $vip2 up
route add -host $vip dev $iface
route add -host $vip2 dev $iface2
;;
stop)
ifconfig $iface down
ifconfig $iface2 down
echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
;;
*)
echo "Usage: $(basename $0) start|stop"
;;
esac
bash lvs.sh start #执行脚本,加上start参数
执行完成后可以用ip a l命令来查看两个虚拟ip有没有创建成功。
3.在两台调度器上执行如下操作:
yum -y install keepalived nginx #安装keepalived和nginx
echo "sorry form 172.16.10.1" > /usr/share/nginx/html/index.html #这里安装nginx是为了实现sorry服务器,当节点都出问题时,调度器的nginx会放回echo的内容。调度器2上echo的是 172.16.10.2,这样方便区分是由哪个调度器工作的
service nginx start
ifconfig eth0:0 172.16.10.2 netmask 255
.255.255.255 broadcast 172.16.10.2 up #在eth0上添加vip
我们可以先装个ipvsadm,手动配置lvs来测试以下,合适了再去配置keepalived
yum -y install ipvsadm
ipvsadm -A -t 172.16.10.2:80 -s rr
ipvsadm -a -t 172.16.10.2:80 -r 172.16.10.3 -g
ipvsadm -a -t 172.16.10.2:80 -r 172.16.10.4 -g
然后访问172.16.10.2就可以调度到后端的两个节点提供服务,使用for i in {1..10};do curl http://172.16.10.2;done,就会发现3和4交替出现。 ,将这个调度器的vip删除,在另一台节点上同样上述操作,验证时候需要在客户端先arp -d 172.16.10.2`将自己的arp缓存删除,不然还是会去找之前的调度器的。
测试成功后,我们就可以去部署keepalived了:
首先,将ipvsadm手动做的lvs先清空,这样才会不影响keepalived配置,如下:
ifconfig eth0:0 down
ipvsadm -C
然后配置keepliaved:
我们先来实现lvs的dr模式,使用主备模式
vim /etc/keepalived/keepalived.conf
#配置文件中有很多virtual_server段,我们只保留第一个,剩下的给注释了就行
#下面分别为调度器1和调度器2的配置
调度器1的配置文件
! Configuration File for keepalived
global_defs {
notification_email {
feng@mageedu.com
}
notification_email_from admin@mageedu.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id node1
vrrp_mcast_group4 224.224.224.224
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 16
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.16.10.2
}
}
virtual_server 172.16.10.2 80 {
delay_loop 6
lb_algo rr
lb_kind DR
nat_mask 255.255.0.0
protocol TCP
sorry_server 127.0.0.1 80
real_server 172.16.10.3 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 172.16.10.4 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
vrrp_instance VI_2 {
state BACKUP
interface eth0
virtual_router_id 61
priority 95
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.16.200.100
}
}
virtual_server 172.16.200.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR
nat_mask 255.255.0.0
protocol TCP
sorry_server 127.0.0.1 80
real_server 172.16.10.3 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 172.16.10.4 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
第二台调度器配置如下
! Configuration File for keepalived
global_defs {
notification_email {
feng@mageedu.com
}
notification_email_from admin@mageedu.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id node2
vrrp_mcast_group4 224.224.224.224
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 16
priority 95
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.16.10.2
}
}
virtual_server 172.16.10.2 80 {
delay_loop 6
lb_algo rr
lb_kind DR
nat_mask 255.255.0.0
protocol TCP
sorry_server 127.0.0.1 80
real_server 172.16.10.3 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 1
}
}
real_server 172.16.10.4 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 1
}
}
}
vrrp_instance VI_2 {
state MASTER
interface eth0
virtual_router_id 61
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.16.200.100
}
}
virtual_server 172.16.200.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR
nat_mask 255.255.0.0
protocol TCP
sorry_server 127.0.0.1 80
real_server 172.16.10.3 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 1
}
}
real_server 172.16.10.4 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 1
}
}
}
完成后在将两个调度器中的keepalived都启动(注意keepalived不能重启,有时候配置会不生效,所以如果之前已经启动了,那么关闭后在启动)
service keepalived start
测试:
在测试主机上修改/etc/hosts文件,添加如下内容
172.16.200.100test.io
172.16.10.2test.io
然后用一个小循环来测试:
[root@localhost named]# for i in {1..10};do curltest.io ;done
返回结果为172.16.10.3和172.16.10.4交替出现,实验成功
nginx双主模型高可用集群
1.在两台调度器上,设置nginx服务配置文件,这里使用的nginx版本为1.10.2,所以配置文件可能有点细微差别
vim /etc/nginx/nginx.conf
在http上下文中定义组
upstream webapp {
server 172.16.10.3;
server 172.16.10.4;
}
vim /etc/nginx/conf.d/test.conf #注意:先将默认的default去掉,要不测试会报错
server {
listen 80 default;
server_nametest.io;
location / {
proxy_pass http://webapp;
}
}
nginx -t
nginx -s reload
2.在两台调度器上,修改keepalived配置文件:
先将vrrp_instance VI_1和vrrp_instance VI_2这两个上下文中的virtual_server先注释掉(virtual_server就是lvs的配置段,注释掉以防和nginx段冲突)
然后在global段中定义nginx检测功能,这段的意思就是当检测到nginx服务不存在时,就将这个调度器的权重减去10,注意减去的权重不能小于主和备的差,不然减去之后主调度器的权重还是表备用的高,如下:
vrrp_script chk_nginx {
script "killall -o nginx"
interval 2
weight -10
fall 2
rise 2
}
然后在两个vrrp_instance中,都调用nginx检测功能:
在vrrp_instance VI_1和2中都加入这段内容
track_script {
chk_nginx
}
然后关闭keepalived,再启动进行测试,两个ip交替出现证明实验成功