IP | 服务器 | 服务 |
---|---|---|
192.168.1.10 | lb-node1 | Nginx、keepalived |
192.168.1.11 | lb-node2 | Nginx、keepalived |
[root@lb-node1 /]# yum install -y keepalived
[root@lb-node1 /]# yum install -y psmisc
[root@lb-node1 ~]# systemctl start keepalived.service
[root@lb-node1 ~]# systemctl enable keepalived.service
[root@lb-node1 ~]# vim /soft/scripts/check_nginx.sh
#!/bin/bash
if [ "$(ps -ef | grep "nginx: master process"| grep -v grep )" == "" ]
then
/usr/bin/systemctl restart nginx.service #检测到nginx宕机尝试拉起一次
sleep 5
if [ "$(ps -ef | grep "nginx: master process"| grep -v grep )" == "" ]
then
killall keepalived #拉起失败杀死keepalived,备机获取vip
fi
fi
[root@lb-node1 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
vrrp_script chk_nginx {
script "/soft/scripts/check_nginx.sh"
interval 10 #每10s检查一次
weight -20
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 150 #优先级,主备之间最好相差50
advert_int 1 #心跳间隔(如果1秒没通信,备节点马上接管)
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_nginx
}
virtual_ipaddress {
192.168.1.100/24
}
}
vrrp_instance VI_2 {
state BACKUP
interface eth0
virtual_router_id 52
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_nginx
}
virtual_ipaddress {
192.168.1.100/24
}
}
//备机的配置文件
slave配置配置文件与master区别:
......
......
state BACKUP #主机为MASTER,备用机为BACKUP
...
priority 100
// ip漂移测试
[root@lb-node1 ~]# ip a |grep eth0
2: eth0: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
inet 192.168.1.11/32 brd 192.168.1.11 scope global noprefixroute eth0
inet 192.168.1.100/24 scope global eth0
[root@lb-node1 ~]#
//模拟master故障,此时备机获取192.168.1.100的VIP
[root@lb-node1 ~]# systemctl stop keepalived.service
[root@lb-node2 ~]# ip a |grep eth0
2: eth0: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
inet 192.168.1.11/32 brd 192.168.1.11 scope global noprefixroute eth0
inet 192.168.1.100/24 scope global eth0
[root@lb-node2 ~]#
#!/bin/bash
#description: Config realserver
VIP=192.168.1.100
/etc/rc.d/init.d/functions
case "$1" in
start)
/sbin/ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP
/sbin/route add -host $VIP dev lo:0
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
sysctl -p >/dev/null 2>&1
echo "RealServer Start OK"
;;
stop)
/sbin/ifconfig lo:0 down
/sbin/route del $VIP >/dev/null 2>&1
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_ignore
echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
echo "RealServer Stoped"
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac
exit 0
// 分别在主从机上执行 sh realserver.sh start 就可实现负载均衡及高可用集群了;
[root@lb-node1 /soft/scripts]# ip a |grep -E "lo|eth0"
1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet 192.168.1.100/32 brd 192.168.1.100 scope global lo:0
2: eth0: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
inet 192.168.1.10/24 brd 192.168.1.255 scope global noprefixroute eth0
inet 192.168.1.100/24 scope global secondary eth0
inet6 2409:8a28:8a8:e3c0:b6d2:ec3c:3557:2609/64 scope global noprefixroute dynamic
[root@lb-node1 /soft/scripts]#
[root@lb-node2 scripts]# ip a |grep -E "lo|eth0"
1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet 192.168.1.100/32 brd 192.168.1.100 scope global lo:0
2: eth0: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
inet 192.168.1.11/32 brd 192.168.1.11 scope global noprefixroute eth0
[root@lb-node2 scripts]#
inet 10.0.0.11/24 scope global secondary eth0
[root@lb01 ~]# /etc/init.d/keepalived stop #停止Master上Keepalived
[root@lb01 ~]# ip addr|grep 10.0.0.11 #VIP已经从Master端移除
[root@lb02 ~]# ip addr|grep 10.0.0.11 #Backup上Keepalived接管资源
inet 10.0.0.11/24 scope global secondary eth0
[root@lb01 ~]# /etc/init.d/keepalived start #启动Master_keepalived
[root@lb01 ~]# ip addr|grep 10.0.0.11 #Master继续接管资源
inet 10.0.0.11/24 scope global secondary eth0
1.5.9Keepalived配置文件详解
1 ! Configuration File for keepalived #注释
2
3 global_defs {
4 notification_email {
5 [email protected] #5-7发邮件给谁
6
7
8 }
9 notification_email_from [email protected] #发邮件发件人
10 smtp_server 192.168.200.1 #邮件服务器地址
11 smtp_connect_timeout 30 #超时时间
12 router_id Nginx_01 #主备ID不能一样
13 }
14
15 vrrp_instance VI_1 { #实例名称(建议不修)
16 state MASTER #服务器的状态(仅仅是傀儡)
17 interface eth0 #通信端口
18 virtual_router_id 51 #实例的ID
19 priority 150 #优先级,主备之间最好相差50
20 advert_int 1 #心跳间隔(如果一秒没通信备节点马上接管)
21 authentication {
22 auth_type PASS #PASS认证类型,此参数备节点设置和主节点相同
23 auth_pass 1111 #密码是1111,此参数备节点设置和主节点相同
24 }
25 virtual_ipaddress { #vip(可以多个)
26 10.0.0.11/24 #26-28配置vIP地址,绑定在eth0 因为(interface eth0)
29 }
30 }
q全局定义块部分:主要设置Keepalived的通知机制和标识
1、第4-9行是email通知参数。作用:当LVS发生切换或RS等有故障时,会发邮件报警。这是可选配,notifucation_email指定在keepalived发生事件时,需要发给的email地址,可以有多个,每行一个。
2、smtp_server指定发送邮件的smtp服务器,如果本机开启了sendmail,就可以使用上面默认配置实现邮件发送。
3、第10行是Lvs负载均衡器标示(rote_id)。在一个局域网内,它应该是唯一的。
4、大括号”{}” 用来分隔定义块,因此必须成对出现。如果漏写了,keepalived运行时,不会得到预期的结果。由于定义块内存在嵌套关系,因此很容易遗漏结尾处的花括号,这点要特别注意。
qVRRP定义块
1、第13行为VRRP实例vrrp_instance,每个Vrrp实例可以认为是一个keepalived实例,在配置中VRRP实例可以有多个。
(1)第14行实例状态state.只有Master和Backup两种状态,并且需要大写这些单词。其中MASTER为工作状态。BACKUP为备用状态。当MASTER所在的服务器失效时,BACKUP所在的系统会自动把它的状态有BACKUP变换成MASTER,当失效的MASTER所在的系统恢复时,BACKUP从MASTER恢复到BACKUP状态。
(2)通信接口interface。对外提供服务的网络结构,如eth0,eth1当前主流的服务器有2个或2个以上的网络接口,在选择服务器接口时,一定要搞清楚了。
(3)lvs_sync_daemon_interface。负载均衡器之间的监控接口,类似于HA HeartBeat的心跳线。
(4)第16行为虚拟路由标示virtual_route_id是一致的,同时在整个keepalived内是唯一的。
(5)第17行为优先级priority,这是一个数字,数值愈大,优先级越高。在同一个vrrp_instance里,MASTER的优先级 BACKUP。若MASTER的priority值为150,那么BACKUP的priority只能在149或者跟小的数值(官方建议相差50)。
(6)第18行同步通知间隔advert_int。MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位为秒。
(7)第19-22行验证authentication.包含验证类型和验证密码。类型主要有PASS、AH两种,通常使用的类型为PASS,据说AH使用时有问题。验证密码为明文,同一vrrp实例MASTER与BACKUP使用相同的密码才能正常通信,这里官方推荐用明文即可。
2、第23-27行为虚拟ip地址virtual_ipaddress。可以配置多个IP地址,每个地址占一行,需要指定子网掩码。
注意:这个ip必须与我们在lvs客户端设定的vip相一致。