- keepalived实现httpd负载均衡机高可用
- 环境
- keepalived安装
- 在主备机上分别安装httpd
- keepalived配置
- 查看VIP在哪里
- 让keepalived监控httpd负载均衡机
- 配置keepalived加入监控脚本的配置
- 测试
Keepalived一个基于VRRP 协议来实现的 LVS 服务高可用方案,可以利用其来解决单点故障。一个LVS服务会有2台服务器运行Keepalived,一台为主服务器(MASTER),一台为备份服务器(BACKUP),但是对外表现为一个虚拟IP,主服务器会发送特定的消息给备份服务器,当备份服务器收不到这个消息的时候,即主服务器宕机的时候, 备份服务器就会接管虚拟IP,继续提供服务,从而保证了高可用性
Keepalived 提供了很好的高可用性保障服务,它可以检查服务器的状态,如果有服务器出现问题,Keepalived 会将其从系统中移除,并且同时使用备份服务器代替该服务器的工作,当这台服务器可以正常工作后,Keepalived 再将其放入服务器群中,这个过程是 Keepalived 自动完成的,不需要人工干涉,我们只需要修复出现问题的服务器即可。
keepalived实现httpd负载均衡机高可用 环境| 系统信息 | 主机名 | IP |
|---|---|---|
| centos8 | master | 192.168.172.142 |
| centos8 | slave | 192.168.172.143 |
配置主keepalived
//关闭防火墙及selinux [root@localhost ~]# systemctl disable --now firewalld Removed /etc/systemd/system/multi-user.target.wants/firewalld.service. Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service. [root@localhost ~]# setenforce 0 [root@localhost ~]# sed -ri 's/^(SELINUX=).*/1disabled/g' /etc/selinux/config //配置网络源 [root@localhost ~]# wget -O /etc/yum.repos.d/CentOS-base.repo https://mirrors.aliyun.com/repo/Centos-8.repo --2021-10-21 18:34:24-- https://mirrors.aliyun.com/repo/Centos-8.repo Resolving mirrors.aliyun.com (mirrors.aliyun.com)... 45.253.17.214, 45.253.17.217, 103.43.210.117, ... Connecting to mirrors.aliyun.com (mirrors.aliyun.com)|45.253.17.214|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 2595 (2.5K) [application/octet-stream] Saving to: '/etc/yum.repos.d/CentOS-base.repo' /etc/yum.repos 100%[====>] 2.53K --.-KB/s in 0s 2021-10-21 18:34:25 (49.1 MB/s) - '/etc/yum.repos.d/CentOS-base.repo' saved [2595/2595] [root@localhost ~]# sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-base.repo [root@localhost ~]# yum -y install epel-release vim wget gcc gcc-c++ //安装keepalived [root@localhost ~]# yum -y install keepalived //查看安装生成的文件 [root@localhost ~]# rpm -ql keepalived /etc/keepalived #配置目录 /etc/keepalived/keepalived.conf #主配置文件 /etc/sysconfig/keepalived /usr/bin/genhash /usr/lib/.build-id /usr/lib/.build-id/0a /usr/lib/.build-id/0a/410997e11c666114ca6d785e58ff0cc248744e /usr/lib/.build-id/6f /usr/lib/.build-id/6f/ba0d6bad6cb5ff7b074e703849ed93bebf4a0f /usr/lib/systemd/system/keepalived.service #服务控制文件 /usr/libexec/keepalived /usr/sbin/keepalived /usr/share/doc/keepalived /usr/share/doc/keepalived/AUTHOR /usr/share/doc/keepalived/ConTRIBUTORS /usr/share/doc/keepalived/COPYING /usr/share/doc/keepalived/ChangeLog /usr/share/doc/keepalived/README /usr/share/doc/keepalived/TODO /usr/share/doc/keepalived/keepalived.conf.HTTP_GET.port /usr/share/doc/keepalived/keepalived.conf.IPv6 /usr/share/doc/keepalived/keepalived.conf.PING_CHECK /usr/share/doc/keepalived/keepalived.conf.SMTP_CHECK /usr/share/doc/keepalived/keepalived.conf.SSL_GET /usr/share/doc/keepalived/keepalived.conf.SYNOPSIS /usr/share/doc/keepalived/keepalived.conf.UDP_CHECK /usr/share/doc/keepalived/keepalived.conf.conditional_conf /usr/share/doc/keepalived/keepalived.conf.fwmark /usr/share/doc/keepalived/keepalived.conf.inhibit /usr/share/doc/keepalived/keepalived.conf.misc_check /usr/share/doc/keepalived/keepalived.conf.misc_check_arg /usr/share/doc/keepalived/keepalived.conf.quorum /usr/share/doc/keepalived/keepalived.conf.sample /usr/share/doc/keepalived/keepalived.conf.status_code /usr/share/doc/keepalived/keepalived.conf.track_interface /usr/share/doc/keepalived/keepalived.conf.virtual_server_group /usr/share/doc/keepalived/keepalived.conf.virtualhost /usr/share/doc/keepalived/keepalived.conf.vrrp /usr/share/doc/keepalived/keepalived.conf.vrrp.localcheck /usr/share/doc/keepalived/keepalived.conf.vrrp.lvs_syncd /usr/share/doc/keepalived/keepalived.conf.vrrp.routes /usr/share/doc/keepalived/keepalived.conf.vrrp.rules /usr/share/doc/keepalived/keepalived.conf.vrrp.scripts /usr/share/doc/keepalived/keepalived.conf.vrrp.static_ipaddress /usr/share/doc/keepalived/keepalived.conf.vrrp.sync /usr/share/man/man1/genhash.1.gz /usr/share/man/man5/keepalived.conf.5.gz /usr/share/man/man8/keepalived.8.gz /usr/share/snmp/mibs/KEEPALIVED-MIB.txt /usr/share/snmp/mibs/VRRP-MIB.txt /usr/share/snmp/mibs/VRRPv3-MIB.txt
备服务器上安装keepalived
//关闭防火墙与SELINUX [root@localhost ~]# systemctl disable --now firewalld Removed /etc/systemd/system/multi-user.target.wants/firewalld.service. Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service. [root@localhost ~]# setenforce 0 [root@localhost ~]# sed -ri 's/^(SELINUX=).*/1disabled/g' /etc/selinux/config //配置网络源 [root@localhost ~]# wget -O /etc/yum.repos.d/CentOS-base.repo https://mirrors.aliyun.com/repo/Centos-8.repo --2021-10-21 18:34:34-- https://mirrors.aliyun.com/repo/Centos-8.repo Resolving mirrors.aliyun.com (mirrors.aliyun.com)... 103.43.210.116, 45.253.17.216, 45.253.17.217, ... Connecting to mirrors.aliyun.com (mirrors.aliyun.com)|103.43.210.116|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 2595 (2.5K) [application/octet-stream] Saving to: '/etc/yum.repos.d/CentOS-base.repo' /etc/yum.repos 100%[====>] 2.53K --.-KB/s in 0s 2021-10-21 18:34:36 (55.9 MB/s) - '/etc/yum.repos.d/CentOS-base.repo' saved [2595/2595] [root@localhost ~]# sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-base.repo [root@localhost ~]# yum -y install epel-release vim wget gcc gcc-c++ //安装keepalived [root@localhost ~]# yum -y install keepalived在主备机上分别安装httpd
在master上安装nginx
在master上安装httpd [root@localhost ~]# yum -y install httpd [root@localhost ~]# cd /usr/share/httpd/noindex/ [root@localhost noindex]# ls index.html [root@localhost noindex]# echo 'web1' > index.html [root@localhost noindex]# systemctl enable --now httpd Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
访问
在slave上安装nginx
[root@localhost ~]# yum -y install httpd [root@localhost noindex]# systemctl enable --now httpd Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
访问
配置主keepalived
[root@localhost ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id lb02
}
vrrp_instance VI_1 {
state BACKUP
interface ens160
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass xux
}
virtual_ipaddress {
192.168.172.250
}
}
virtual_server 192.168.172.250 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.172.142 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.172.143 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
[root@localhost ~]# systemctl enable keepalived
Created symlink /etc/systemd/system/multi-user.target.wants/keepalived.service → /usr/lib/systemd/system/keepalived.service.
配置备keepalived
[root@localhost ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id lb01
}
vrrp_instance VI_1 {
state MASTER
interface ens160
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass xux
}
virtual_ipaddress {
192.168.172.250
}
}
virtual_server 192.168.172.250 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.172.142 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.172.143 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
查看VIP在哪里
在MASTER上查看
[root@localhost ~]# ip a 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 valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens160: mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 00:0c:29:f9:d6:50 brd ff:ff:ff:ff:ff:ff inet 192.168.172.142/24 brd 192.168.172.255 scope global noprefixroute ens160 valid_lft forever preferred_lft forever inet 192.168.172.250/32 scope global ens160 valid_lft forever preferred_lft forever
在SLAVE上查看
[root@localhost ~]# ip a
1: lo:
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens160:
link/ether 00:0c:29:db:3c:14 brd ff:ff:ff:ff:ff:ff
inet 192.168.172.143/24 brd 192.168.172.255 scope global noprefixroute ens160
valid_lft forever preferred_lft forever
## 修改内核参数,开启监听VIP功能 此步可做可不做,该功能可用于仅监听VIP的时候 在master上修改内核参数 ```shell [root@localhost ~]# echo 'net.ipv4.ip_nonlocal_bind = 1' >>/etc/sysctl.conf [root@localhost ~]# sysctl -p net.ipv4.ip_nonlocal_bind = 1 [root@localhost ~]# cat /proc/sys/net/ipv4/ip_nonlocal_bind 1
在slave上修改内核参数
[root@localhost ~]# echo 'net.ipv4.ip_nonlocal_bind = 1' >>/etc/sysctl.conf [root@localhost ~]# sysctl -p net.ipv4.ip_nonlocal_bind = 1 [root@localhost ~]# cat /proc/sys/net/ipv4/ip_nonlocal_bind 1让keepalived监控httpd负载均衡机
keepalived通过脚本来监控httpd负载均衡机的状态
在master上编写脚本
[root@localhost ~]# mkdir /scripts
[root@localhost ~]# cd /scripts/
[root@localhost scripts]# vim check_h.sh
#!/bin/bash
httpd_status=$(ps -ef|grep -Ev "grep|$0"|grep 'bhttpdb'|wc -l)
if [ $httpd_status -lt 1 ];then
systemctl stop keepalived
fi
[root@localhost scripts]# chmod +x check_h.sh
[root@localhost scripts]# ll
total 4
-rwxr-xr-x. 1 root root 140 Oct 21 19:20 check_h.sh
[root@localhost scripts]# vim notify.sh
#!/bin/bash
VIP=$2
sendmail (){
subject="${VIP}'s server keepalived state is translate"
content="`date +'%F %T'`: `hostname`'s state change to master"
echo $content | mail -s "$subject" 2296243938@qq.com
}
case "$1" in
master)
httpd_status=$(ps -ef|grep -Ev "grep|$0"|grep 'bhttpdb'|wc -l)
if [ $httpd_status -lt 1 ];then
systemctl start httpd
fi
sendmail
;;
backup)
httpd_status=$(ps -ef|grep -Ev "grep|$0"|grep 'bhttpdb'|wc -l)
if [ $httpd_status -gt 0 ];then
systemctl stop httpd
fi
;;
*)
echo "Usage:$0 master|backup VIP"
;;
esac
[root@localhost scripts]# chmod +x notify.sh
在slave上编写脚本
[root@localhost ~]# cat /scripts/notify.sh
#!/bin/bash
VIP=$2
sendmail (){
subject="${VIP}'s server keepalived state is translate"
content="`date +'%F %T'`: `hostname`'s state change to master"
echo $content | mail -s "$subject" 2296243938@qq.com
}
case "$1" in
master)
httpd_status=$(ps -ef|grep -Ev "grep|$0"|grep 'bhttpdb'|wc -l)
if [ $httpd_status -lt 1 ];then
systemctl start httpd
fi
sendmail
;;
backup)
httpd_status=$(ps -ef|grep -Ev "grep|$0"|grep 'bhttpdb'|wc -l)
if [ $httpd_status -gt 0 ];then
systemctl stop httpd
fi
;;
*)
echo "Usage:$0 master|backup VIP"
;;
esac
[root@localhost scripts]# cat check_h.sh
#!/bin/bash
httpd_status=$(ps -ef|grep -Ev "grep|$0"|grep 'bhttpdb'|wc -l)
if [ $httpd_status -lt 1 ];then
systemctl stop keepalived
fi
[root@localhost scripts]# chmod +x notify.sh
[root@localhost scripts]# chmod +x check_h.sh
配置keepalived加入监控脚本的配置
配置主keepalived
[root@localhost ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id lb01
}
vrrp_script httpd_check {
script "/scripts/check_h.sh"
interval 1
weight -20
}
vrrp_instance VI_1 {
state MASTER
interface ens160
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass xux
}
virtual_ipaddress {
192.168.172.250
}
track_script {
httpd_check
}
notify_master "/scripts/notify.sh master 192.168.172.250"
notify_backup "/scripts/notify.sh backup 192.168.172.250"
}
virtual_server 192.168.172.250 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.172.142 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.172.143 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
[root@localhost ~]# systemctl restart keepalived
配置备keepalived
backup无需检测nginx是否正常,当升级为MASTER时启动nginx,当降级为BACKUP时关闭
[root@localhost ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id lb02
}
vrrp_instance VI_1 {
state BACKUP
interface eth160
virtual_router_id 51
priority 90
nopreempt
advert_int 1
authentication {
auth_type PASS
auth_pass xux
}
virtual_ipaddress {
192.168.172.250
}
notify_master "/scripts/notify.sh master 192.168.172.250"
notify_backup "/scripts/notify.sh backup 192.168.172.250"
}
virtual_server 192.168.172.250 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.172.142 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.172.143 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
[root@localhost ~]# systemctl restart keepalived
测试


