Keepalived + Nginx:负载均衡+高可用服务 --keepalived介绍及应用
keepalived -- 综合架构高可用服务
01. 内容说明:
1) 负载均衡遗留知识点补充
2) 高可用服务的概念介绍
3) 部署安装高可用服务
4) 高可用服务配置文件参数说明
5) 高可用服务VRRP协议原理
6) 高可用服务常见问题(脑裂文件)
7) 高可用服务如何进行监控
8) 高可用服务实现双主配置
02. 回顾负载均衡企业实践应用
https://www.cnblogs.com/moox/p/12775455.html
03. 高可用服务介绍说明
避免负载均衡服务出现单点问题
设置主备负载均衡服务器,备负载均衡服务器会时时监控主服务器的运行情况
当主负载均衡服务器出现故障时,备服务器自动接管主服务器作为主负载均衡服务器

keepalived高可用服务的原理示意图



04. 高可用服务的原理

05. 如何实现部署高可用服务
利用keepalived软件实现,keepalived是管理LVS的软件
-
作用:
- 为LVS服务而诞生出来的:k8s + 容器技术docker 容器<--镜像<--仓库(春节抢红包)
keepalived + LVS负载均衡软件(4层)--4层只能识别端口信息
- 为LVS服务而诞生出来的:k8s + 容器技术docker 容器<--镜像<--仓库(春节抢红包)
-
实现高可用服务功能
- 管理LVS负载均衡负载功能
- 实现对LVS集群节点健康检查功能-healthcheck
- 作为系统网络服务的高可用服务-- failover
06. 高可用keepalived服务部署流程
第一个历程: 准备高可用服务架构
## 克隆安装两台一样的负载均衡服务器lb01-10.0.0.5和lb02-10.0.0.6(用lb01克隆)
grep 5 /etc/sysconfig/network-scripts/ifcfg-eth[01]
sed -i 's/5/6/g' /etc/sysconfig/network-scripts/ifcfg-eth[01]
hostnamectl set-hostname lb02
systemctl restart network.service
第二个历程: 安装部署keepalived软件
(所有负载均衡服务器上:lb01和lb02)
yum install -y keepalived
yum -ql keepalived -- 查看安装的配置文件,如/etc/keepalived/keepalived.conf
第三个历程: 编写keepalived配置文件
man keepalived.conf 可以看到keepalived.conf分为三个部分
GLOBAL CONFIGURATION --- 全局配置部分
VRRPD CONFIGURATION --- VRRP协议配置部分
LVS CONFIGURATION --- LVS服务管理配置部分
- 配置项说明/etc/keepalived/keepalived.conf
[root@lb01 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived ## 注释信息
## 全局配置部分
global_defs { --- 全局配置部分
notification_email { --- 设置发送邮件信息的收件人
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from oldboy@163.com --- 设置连接的邮件服务器信息
smtp_server 163.smtp.xxx_
smtp_connect_timeout 30
## 以上为全局配置中的邮件配置,可以不用配置,全部删除,使用监控替代。
router_id LVS_DEVEL --- 高可用集群主机身份标识(集群中主机身份标识名称不能重复)
}
## vrrp 实例配置-- 一个服务可以起多个主进程
vrrp_instance oldboy { --- Vrrp协议家族 oldboy
state MASTER --- 标识所在家族中的身份 (MASTER/BACKUP)
interface eth0 --- 指定虚拟IP地址出现在什么网卡上
virtual_router_id 51 --- 标识家族身份信息 多台高可用服务配置要一致
priority 100 --- 设定优先级 优先级越高,就越有可能成为主,决定是否是master
advert_int 1 --- 定义组播包发送的间隔时间(秒) 主和备配置一样 1 s
authentication { --- 实现通讯需要有认证过程
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { --- 配置虚拟IP地址信息,启动服务时在master主机上会生成虚拟IP地址
192.168.200.16
192.168.200.17
192.168.200.18
}
}
## 下方为LVS配置,暂且跳过
- lb01(主master)配置信息:
[root@lb01 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id lb01
}
vrrp_instance oldboy {
state MASTER
interface eth0
virtual_router_id 51
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3/24
}
}
- lb02(备backup)配置信息:
! Configuration File for keepalived
global_defs {
router_id lb02
}
vrrp_instance oldboy {
state BACKUP
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3/24
}
}
第三个历程: 启动keepalived服务
systemctl start keepalived
ip a show
## 在master主机上能看到虚拟IP地址10.0.0.3,在backup上没有;
## 当master10.0.0.5主机挂起或其他情况时,backup10.0.0.6主机会自动接管称为master并产生虚拟ip10.0.0.3;
## 当10.0.0.5主机重启启动恢复正常时,会抢占10.0.0.6再次称为master。
## 用户访问10.0.0.3时,就等价于访问master所在负载服务器
第四个历程: 修改域名和IP地址解析关系
-
Windows host解析
10.0.0.3 www.moox.com -
keepalived抓包详情

07. 高可用服务企业应用
1. keepalived -- 脑裂问题
高可用服务常见异常问题---脑裂问题

-
出现原因:
高可用备服务器接收不到主服务器发送的组播包,备服务器上会自动生成VIP地址-
物理原因:
高可用集群之间通讯线路出现问题,如主备之间通讯的心跳线断开 -
逻辑原因:
有安全策略阻止,如备服务器开启了防火墙,此时收不到主的组播包,就认为自己是主,产生vip地址
抓包vrrp可以看到现象
-
-
如何解决脑裂问题:
-
01.最直接的解决办法:
服务器都有VIP时,直接关闭其中其余任意服务器的keepalived服务,保留一台 -
02.进行监控,发出告警:
备服务器出现VIP地址的原因:
a 主服务器出现故障
b 出现脑裂问题 -
03.脚本监控,邮件通知:
vim /server/scripts/check_keepalived.sh
#!/bin/bash ip a s eth0|grep "10.0.0.3" >/dev/null if [ $? -eq 0 ] then echo "keepalived服务出现异常,请进行检查"|mail -s 异常告警-keepalived 2144865225@qq.com fi ## 163邮箱配置见扩展介绍 ## 测试:备服务器开启防火墙后执行脚本 -
-
PS:shell脚本进行比较判断
-eq 等于 -lt 小于 -le 小于等于 -ne 不等于 -gt 大于 -ge 大于等于
2. keepalived-- 实时监控自动释放vip
如何实现master(10.0.0.5)keepalived服务自动释放vip地址资源?
nginx(皇帝) + keepalived(妃子): nginx服务停止(皇帝死了),keepalived也必须停止(殉情)
- 第一个历程: 编写监控nginx服务状态监控
vim /server/scripts/check_web.sh -- 注意脚本名不要包含服务名如nginx
#!/bin/bash
num=`ps -ef|grep -c nginx`
if [ $num -lt 2 ]
then
systemctl stop keepalived
echo "10.0.0.5 nginx service failed.keepalived service has been stopped" |mail -s nginx服务异常 2144865225@qq.com
fi
-
第二个历程: 测试监控脚本
systemctl start nginx keepalived systemctl stop nginx.service sh /server/scripts/check_web.sh ps -ef|grep keepalived ## 然后检查邮箱是否收到 -
第三个历程: 实时监控nginx服务状态---keepalived配置文件
- 配置文件/etc/keepalived.keepalived.conf内容解释
## 定义监控脚本check_web=/server/scripts/check_web.sh ## 位置:放在global_defs模块和vrrp_instance模块之间 vrrp_script check_web { script "/server/scripts/check_web.sh" --- 定义需要监控脚本(脚本是执行权限) interval 2 --- 执行脚本的间隔时间(秒) weight 2 --- 扩展部分介绍 } ## 调用执行监控脚本$check_web ## 位置:放在vrrp_instance模块中 track_script { check_web --- 调用执行你的脚本信息 }- 最终keepalived.conf信息配置
[root@lb01 scripts]# cat /etc/keepalived/keepalived.conf ! Configuration File for keepalived ## 全局变量 global_defs { router_id lb01 } ## 实时监控脚本定义 vrrp_script check_web { script "/server/scripts/check_web.sh" interval 3 weight 2 } vrrp_instance moox { state MASTER interface eth0 virtual_router_id 51 priority 150 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.0.0.3/24 } ## 实时监控脚本调用 track_script { check_web } }- 测试步骤
chmod +x /server/scripts/check_web.sh systemctl restart nginx keepalived systemctl stop nginx ps -ef|grep keeplived ## 服务没有了 ip a show ## 没有VIP:10.0.0.3-
注意点:以上配置能实现当master主机nginx停止时,也停掉Keepalived,将VIP给backup主机接管;
但当原来的master主机nginx再次启动恢复正常时,也需要气孔keepalived才可以。
实际上:keepalived可以不停止服务,只需要修改配置文件即可。
3. keepalived -- 双主配置
如何高可用集群双主配置?
不同的客户端固定设置访问不同的负载时,负载可能都是双主

-
第一个历程: 编写lb01服务器keepalived配置文件
## 文件中没有加上实时监控脚本配置,按需要自行添加 [root@lb01 keepalived]# cat keepalived.conf ! Configuration File for keepalived global_defs { router_id lb01 } vrrp_script check_web { script "/server/scripts/check_web.sh" interval 2 weight 2 } vrrp_instance oldboy { state MASTER interface ens33 virtual_router_id 51 priority 150 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.0.0.3/24 } # track_script { # check_web # } } vrrp_instance oldgirl { state BACKUP interface ens33 virtual_router_id 52 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.0.0.4/24 } # track_script { # check_web # } } -
第二个历程: 编写lb02服务器keepalived配置文件
[root@lb02 keepalived]# cat keepalived.conf ! Configuration File for keepalived global_defs { router_id lb02 } vrrp_instance oldboy { state BACKUP interface ens33 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.0.0.3/24 } } vrrp_instance oldgirl { state MASTER interface ens33 virtual_router_id 52 priority 150 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.0.0.4/24 } }- 检查
systemctl restart nginx keepalived ip a show -- lb01有vip:10.0.0.3 lb02有vip:10.0.0.4 == 双主 curl -H host:www.moox.com 10.0.0.7 -
第三个历程: 编写Windows域名和IP地址解析信息
10.0.0.3 www.moox.com
10.0.0.4 bbs.moox.com
-
进行抓包查看:
www.oldboy.com --- 10.0.0.3(10.0.0.5) 10.0.0.1 --- 10.0.0.3 10.0.0.5 --- 10.0.0.7 10.0.0.7 --- 10.0.0.5 10.0.0.3 --- 10.0.0.1 bbs.oldboy.com --- 10.0.0.4(10.0.0.6) 10.0.0.1 --- 10.0.0.4 10.0.0.6 --- 10.0.0.7 10.0.0.7 --- 10.0.0.6 10.0.0.4 --- 10.0.0.1
4. Keepalived+ nginx --安全访问配置
高可用服务安全访问配置(负载均衡服务)
由于负载均衡必须使用外网地址,不能使用内网地址。
为了保护外网地址不受攻击,可以使用监听虚拟IP地址,即keepalived产生的master的VIP
-
第一个历程: 修改nginx负载均衡文件/etc/nginx/conf.d/lb.conf
upstream oldboy { server 10.0.0.7:80; server 10.0.0.8:80; server 10.0.0.9:80; } server { listen 10.0.0.3:80; ## 设置为监听虚拟IP地址,保护实际的外网IP地址10.0.0.5 server_name www.oldboy.com; location / { proxy_pass http://oldboy; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; proxy_next_upstream error timeout http_404 http_502 http_403; } } server { listen 10.0.0.4:80; server_name bbs.oldboy.com; location / { proxy_pass http://oldboy; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; } } -
第二个历程: 修改内核文件
异常问题:- 如何设置监听网卡上没有的地址
解决: 需要修改内核信息
echo 'net.ipv4.ip_nonlocal_bind = 1' >>/etc/sysctl.conf sysctl -p - 如何设置监听网卡上没有的地址
-
第三个历程: 重启nginx负载均衡服务
systemctl restart nginx -- 注意,修改配置文件ip地址时,只能restart,不能reload
08. 高可用服务内容总结
-
- 负载均衡服务扩展补充
根据用uri信息进行负载均衡(动静分离架构)
根据user_agent信息进行负载均衡(手机用户和浏览器访问用户页面信息可以不一致)
- 负载均衡服务扩展补充
-
- 高可用服务作用(避免出现单点故障)
-
- keepalived高可用服务
- 管理LVS负载均衡软件
- 实现高可用功能(vrrp原理)
- keepalived高可用服务
-
- keepalived服务配置文件
-
- keepalived服务企业应用
- 可能出现脑裂问题 --- 脚本编写
- 如何实现自动释放资源 --- 脚本(监控web服务) 修改keepalived文件
- 如何实现双主配置 --- 编写keepalived配置文件 编写多个vrrp实例
- 如何实现负载均衡安全访问 --- 编写负载均衡nginx配置文件 配置监听vip地址信息
- keepalived服务企业应用
09.扩展:
- 如何实现keepalived服务实时监控---while循环
- 预习: zbbix监控服务 (基础部分(手工配置)+高级部分(自动监控))
克隆好一台zabbix服务器 --- zabbix软件安装好 yum - nginx服务停止 keepalived服务也自动停止
nginx服务启动 keepalived服务自动恢复 ??? --- weight
weight参数:
权重值参数,主要用于和优先级priority进行运算
-
重要知识点01:
求和运算: weight数值必须是正数 weight + priority 自动提升优先级, 使主机可以成为主服务器
求差运算: weight数值必须是负数 weight + priority 自动降低优先级, 使主机可以成为备服务器 -
重要知识点02:
运行一个脚本, 执行脚本结束之后, 脚本的执行结果可以为真 看脚本执行返回值 $?==0
运行一个脚本, 执行脚本结束之后, 脚本的执行结果可以为假 看脚本执行返回值 $$<>0 -
重要知识点03:
如何将知识01 + 知识02
- 权重值为正数(10):
1. 脚本运行后为真,返回值为0 weight(10) + priority(150) = priority(160)
2. 脚本运维后为假,返回值为1 priority(150)
- 权重值为负数(-10):
1. 脚本运行后为真,返回值为0 priority(150)
2. 脚本运维后为假,返回值为1 weight(-10) + priority(150)= priority(140)
@163邮件服务配置
-
申请并配置163企业邮箱
-
编写Linux配置文件/etc/mail.rc
set from=zhangfd2020@163.com smtp=smtp.163.com set smtp-auth-user=zhangfd2020@163.com smtp-auth-password=******** smtp-auth=login -
启动邮件服务
systemctl start postfix.service -
邮件功能测试
echo 123456|mail -s moox_test 2144865225@qq.com mail -s "邮件测试" 2144865225@qq.com </etc/host
作者:moox
出处:http://www.cnblogs.com/moox/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
浙公网安备 33010602011771号