搭建环境
- 已关闭防火墙,关闭selinux;
- 所用服务器IP地址如下:
IP地址 | 服务器 | 服务 |
---|---|---|
192.168.91.129 | master | keepalived、nginx |
192.168.91.130 | backup | keepalived、nginx |
192.168.91.254(VIP) | master、backup | ---------------------- |
搭建步骤
配置keepalived
- 配置192.168.91.129和192.168.91.130网络源
[root@master ~]# curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
[root@master ~]# sed -i 's/$releasever/7/g' /etc/yum.repos.d/CentOS-Base.repo
[root@master ~]# yum -y install epel-release
[root@master ~]# yum -y install keepalived nginx
[root@master ~]# scp /etc/yum.repo/CentOS-Base.repo root@192.168.91.130:/etc/yum.repo.d/
[root@backup ~]# yum -y install epel-release
[root@backup ~]# yum -y install keepalived nginx
- 启动192.168.91.129和192.168.91.130的nginx服务,并查看端口
-
配置192.168.91.129(master)的/etc/keepalived/keepalived.conf配置文件
[root@master ~]# cp -a /etc/keepalived/keepalived.conf{,.bak}
[root@master ~]# cat > /etc/keepalived/keepalived.conf << EOF
! Configuration File for keepalived
global_defs {
router_id 001
}
vrrp_instance VI_1 {
state MASTER
interface eno16777736
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.91.254
}
}
virtual_server 192.168.91.254 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.91.129 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.91.130 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
EOF
- 配置192.168.91.129(backup)的/etc/keepalived/keepalived.conf配置文件(注:route_id不同)
[root@master ~]# cat > /etc/keepalived/keepalived.conf << EOF
! Configuration File for keepalived
global_defs {
router_id 002
}
vrrp_instance VI_1 {
state BACKUP ##修改初始状态为BACKUP
interface eno16777736
virtual_router_id 51
priority 90 ##低于MASTER优先级
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.91.254
}
}
virtual_server 192.168.91.254 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.91.129 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.91.130 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
EOF
- 启动master和backup上的keepalived服务,并设置开机自动启动
[root@master ~]# systemctl start keepalived
[root@master ~]# systemctl enable keepalived
ln -s '/usr/lib/systemd/system/keepalived.service' '/etc/systemd/system/multi-user.target.wants/keepalived.service'
- 查看虚拟IP地址在哪个服务器上
## master上的IP地址 ##
2: eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:47:34:cd brd ff:ff:ff:ff:ff:ff
inet 192.168.91.129/24 brd 192.168.91.255 scope global eno16777736
valid_lft forever preferred_lft forever
inet 192.168.91.254/32 scope global eno16777736
valid_lft forever preferred_lft forever
## backup上的IP地址 ##
2: eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:39:25:f5 brd ff:ff:ff:ff:ff:ff
inet 192.168.91.130/24 brd 192.168.91.255 scope global eno16777736
valid_lft forever preferred_lft forever
脚本监控nginx
让keepalived监控nginx负载均衡机
- 在192.168.91.129服务器(master)创建脚本存放位置,并编写脚本
[root@master ~]# mkdir /etc/keepalived/scripts
[root@master ~]# vim /etc/keepalived/scripts/check_n.sh
#!/bin/bash
nginx_status=$(ps aux | grep -Ev "grep|$0" | grep '\bnginx\b' | wc -l)
if [ $nginx_status -lt 1 ];then
systemctl stop keepalived
fi
[root@master ~]# chmod +x /etc/keepalived/scripts/check_n.sh
[root@master ~]# ll /etc/keepalived/scripts/check_n.sh
-rwxr-xr-x. 1 root root 146 Nov 1 02:45 /etc/keepalived/scripts/check_n.sh
[root@master ~]# vim /etc/keepalived/scripts/notify.sh
#!/bin/bash
VIP=$2
function sendmail () {
subject="${VIP}'s server keepalived state is change."
connect="$(date +'%F %T'): $(hostname)'s state change to master"
echo $connect | mail -s "$subject" <收件人>
}
case "$1" in
master)
nginx_status=$(ps aux | grep -Ev "grep|$0" | grep '\bnginx\b' | wc -l)
if [ $nginx_status -lt 1 ];then
systemctl start nginx
fi
sendmail
;;
backup)
nginx_status=$(ps aux | grep -Ev "grep|$0" | grep '\bnginx\b' | wc -l)
if [ $nginx_status -gt 0 ];then
systemctl stop nginx
fi
sendmail
;;
*)
echo "Usage:$0 master|backup VIP"
;;
esac
[root@master ~]# chmod +x /etc/keepalived/scripts/notify.sh
[root@master ~]# ll /etc/keepalived/scripts/notify.sh
-rwxr-xr-x. 1 root root 596 Nov 1 02:55 /etc/keepalived/scripts/notify.sh8
- 在192.168.91.130服务器(backup)创建脚本存放位置,并编写脚本
[root@backup ~]# mkdir /etc/keepalived/scripts
[root@backup ~]# vim /etc/keepalived/scripts/notify.sh
#!/bin/bash
VIP=$2
function sendmail () {
subject="${VIP}'s server keepalived state is translate."
content="$(date +'%F %T'): $(hostname)'s state change to master."
echo $connect | mail -s "$subjecj" liyangwanjia@126.com
}
case "$1" in
master)
nginx_status=$(ps aux | grep -Ev "grep|$0" | grep '\bnginx\b' | wc -l)
if [ $nginx_status -lt 1 ];then
systemctl start nginx
fi
sendmail
;;
backup)
nginx_status=$(ps aux | grep -Ev "grep|$0" | grep '\bnginx\b' | wc -l)
if [ $nginx_status -gt 0 ];then
systemctl stop nginx
fi
sendmail
;;
*)
echo "Usage:$0 master|backup VIP"
;;
[root@backup ~]# chmod +x /etc/keepalived/scripts/notify.sh
[root@backup ~]# ll /etc/keepalived/scripts/notify.sh
-rwxr-xr-x. 1 root root 604 Nov 1 04:01 /etc/keepalived/scripts/notify.sh
配置keepalived加入监控脚本的设置
- 配置192.168.91.129(master)的/etc/keepalived/keepalived.conf配置文件
global_defs {
router_id 002
}
vrrp_script nginx_check {
script "/etc/keepalived/scripts/check_n.sh" ##执行监控脚本
interval 1 ##1秒钟执行一次
weight -20
}
......
virtual_ipaddress {
192.168.91.254
}
track_script {
nginx_check
}
## 执行脚本,发送邮件报警。当状态从BACKUP改变为MASTER时发送邮件 ##
notify_master "/etc/keepalived/scripts/notify.sh master 192.168.91.254"
## 执行脚本,发送邮件报警。当状态从MASTER改变为BACKUP时发送邮件 ##
notify_backup "/etc/keepalived/scripts/notify.sh backup 192.168.91.254"
......
- 配置192.168.91.130(backup)的/etc/keepalived/keepalived.conf配置文件
[root@backup ~]# vim /etc/keepalived/keepalived.conf
......
virtual_ipaddress {
192.168.91.254
}
notify_master "/etc/keepalived/scripts/notify.sh master 192.168.91.254"
notify_backup "/etc/keepalived/scripts/notify.sh backup 192.168.91.254"
......
- 当master这台服务器中nginx服务挂掉后,keepalived服务监控到后会将自己停止掉
[root@master ~]# ip a
2: eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:47:34:cd brd ff:ff:ff:ff:ff:ff
inet 192.168.91.129/24 brd 192.168.91.255 scope global eno16777736
valid_lft forever preferred_lft forever
inet 192.168.91.254/32 scope global eno16777736
valid_lft forever preferred_lft forever
[root@master ~]# ps aux|grep -E "keepalived|nginx"
root 60367 0.0 0.2 121148 2092 ? Ss 12:03 0:00 nginx: master process /usr/sbin/nginx
nginx 60368 0.0 0.3 121612 3312 ? S 12:03 0:00 nginx: worker process
nginx 60369 0.0 0.3 121612 3312 ? S 12:03 0:00 nginx: worker process
root 60376 0.0 0.1 119144 1376 ? Ss 12:03 0:00 /usr/sbin/keepalived -D
root 60377 0.0 0.2 119264 2588 ? S 12:03 0:00 /usr/sbin/keepalived -D
root 60378 0.0 0.2 121240 2464 ? S 12:03 0:00 /usr/sbin/keepalived -D
[root@master ~]# systemctl stop nginx
[root@master ~]# ps aux|grep -E "keepalived|nginx"
root 65627 0.0 0.0 112640 992 pts/1 S+ 12:16 0:00 grep --color=auto -E keepalived|nginx
- 当master服务器出现问题后,VIP会跳到BACKUP上,并发送邮件
[root@backup ~]# ip a
2: eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:39:25:f5 brd ff:ff:ff:ff:ff:ff
inet 192.168.91.130/24 brd 192.168.91.255 scope global eno16777736
valid_lft forever preferred_lft forever
inet 192.168.91.254/32 scope global eno16777736
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe39:25f5/64 scope link
valid_lft forever preferred_lft forever