尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

LVS+KeepAlived+Nginx实现企业级业务高可靠部署的实战教程

LVS+KeepAlived+Nginx实现企业级业务高可靠部署的实战教程 在当今社会我们享受着便捷的IT服务包括政务、通信、银行、交通、网购、旅游等。这些服务背后是健壮安全的IT化架构提供支撑在某个节点故障后自动进行切换保证业务的高可用。当前主流的高可用解决方案为LVSLinux Virtual Server、Nginx、Keepalived的组合。LVS负责实现高效的负载均衡将用户请求合理分发至Nginx服务器Nginx服务器进行七层反向代理、动静态分离、SSL、缓存功能处理更为复杂的业务逻辑KeepAlived则承担LVS故障检测与主备切换、自动检测后端Nginx服务器健康状态(剔除和加入。通过三者的配合让整个服务处于安全稳定的状态。本文则详细介绍LVSKeepAlivedNginx企业级部署实战让我们一步步完成高可用IT架构的搭建。【整体架构】①LVSKeepalived2 台做四层转发 VIP高可用DR模式。②NginxN台做七层反向代理、动静态分离、SSL、缓存本文以2台Nginx为例。③VIP对外统一入口。对于单日百万级别访问量的业务会有N套“LVSKeepAlivedNginx”架构对应N个VIP地址。这些地址配置DNS服务器上实现一个域名对应多个VIP从而均衡业务流量。角色主机名IP虚拟 IPVIP172.16.1.100LVS主lvs-master172.16.1.101LVS备lvs-bcakup172.16.1.102Nginx节点1nginx-01172.16.1.200Nginx节点2nginx-02172.16.1.201【部署推荐】①LVS建议以物理机进行部署避免虚机因为迁移而引发脑裂问题②Nginx服务器建议采用虚机形式部署提升可横向扩展性和资源利用效率【部署流程】一、临时关闭所有服务器防火墙和selinux后续建议开启防火墙并放通策略。# systemctl stop firewalld# systemctl disable firewalld# setenforce 0二、LVS服务器上安装keepalive和LVS执行命令# yum install -y keepalived ipvsadm三、加载IPVS内核模块并永久生效配置modprobe ip_vsmodprobe ip_vs_rrmodprobe ip_vs_wrrmodprobe ip_vs_sh#永久让模块生效需要写到对应配置文件。echo ip_vs /etc/modules-load.d/ipvs.confecho ip_vs_rr /etc/modules-load.d/ipvs.confecho ip_vs_wrr /etc/modules-load.d/ipvs.confecho ip_vs_sh /etc/modules-load.d/ipvs.conf四、本文采用DR模式首先在主LVS服务器上执行。其配置文件路径为/etc/keepalived/keepalived.conf下图为keepalived部分配置文件的截图。五、按照规划要求修改keepalived.conf文件如下所示下面本文详细介绍各个参数含义global_defs {router_id lvs_master #配置其keepalived标识同一集群名称不能重复建议与hostname保持一致。}# 健康Nginx健康状态脚本vrrp_script check_nginx {script /etc/keepalived/check_nginx.sh #执行检查的脚本interval 2 #间隔2sweight -60 #权重调整值关键脚本检测失败时当前节点的优先级会减60fall 2 #失败阈值连续2次检测失败判定为服务真的故障rise 2 #恢复阈值连续2次检测成功判定为服务恢复正常}#VRRP高可用实例段 vrrp_instance VI_1vrrp_instance VI_1 {state MASTER #指定其为主用interface enp4s1 # 实际网卡名virtual_router_id 61 #设置VRRP ID主备LVS的ID必须保持一致。priority 150 #设置优先级数值越大越为主用advert_int 1 #VRRP心跳间隔单位为秒#下面进行VRRP主备关系的鉴权信息主备LVS密码不一致建立不了主备关系。authentication {auth_type PASS #主用备用建立VRRP需要鉴权auth_pass Lvs_server2026! #一定不要用弱口令}#设置VIP地址并绑定到网卡virtual_ipaddress {172.16.1.100/24 dev enp4s1 label enp4s1:0 #绑定到enp4s1并起别名enp4s1:0}track_script {check_nginx}}# LVS转发规则的核心配置virtual_server 172.16.1.100 80 { #设置LVS虚拟服务监听的端口delay_loop 1 #LVS每隔多长时间检查后端真实服务器状态单位为秒lb_algo wrr #负载算法常见为加权wrr,轮询rr,哈希shlb_kind DR #LVS工作模式DR直接路由还有其它NAT、TUNpersistence_timeout 0 #会话保持时间protocol TCP #协议TCP# Nginx 01真实服务配置real_server 172.16.1.200 80 {weight 1 #权重TCP_CHECK {connect_timeout 3 #TCP超时时间单位秒nb_get_retry 3 #重试次数delay_before_retry 3 #重试间隔}}# Nginx 02real_server 172.16.1.201 80 {weight 1TCP_CHECK {connect_timeout 3}}}# 如果需要用 HTTPS 再加 443端口。配置含义与上相同。virtual_server 172.16.1.100 443 {delay_loop 1lb_algo wrrlb_kind DRpersistence_timeout 0protocol TCPreal_server 172.16.1.200 443 {weight 1TCP_CHECK {connect_timeout 3}}real_server 172.16.1.201 443 {weight 1TCP_CHECK {connect_timeout 3}}}六、备用LVS服务器与主用LVS服务器配置只有下面2处不同state BACKUPpriority 100七、两台LVS服务器上都需要放置检测脚本检测脚本路径为/etc/keepalived/check_nginx.sh检测脚本内容为#!/bin/bash# 脚本路径/etc/keepalived/check_nginx.sh# 功能适配Keepalived的vrrp_script检测后端Nginx健康状态# 返回值规范0检测成功有可用Nginx非0检测失败全部Nginx不可用# 配合vrrp_script的fall/rise参数连续2次失败则触发优先级调整# 配置参数根据你的实际环境修改# 后端Nginx服务器IP列表空格分隔填写你的2台Nginx IPNGINX_SERVERS(172.16.1.200 172.16.1.201)# Nginx健康检查端口默认80如有改动请修改如443CHECK_PORT80# 检测超时时间秒建议不超过interval的一半TIMEOUT1# 配置结束 # 初始化可用服务器计数AVAILABLE_COUNT0# 遍历检测每台Nginx服务器端口连通性检测for server in ${NGINX_SERVERS[]}; do# 使用nc检测端口timeout控制超时/dev/null屏蔽无关输出if timeout ${TIMEOUT} nc -z -w1 ${server} ${CHECK_PORT} /dev/null 21; then((AVAILABLE_COUNT))fidone# 根据可用数量返回结果Keepalived核心判断依据if [ ${AVAILABLE_COUNT} -gt 0 ]; then# 至少1台Nginx可用返回0检测成功exit 0else# 全部Nginx不可用返回1检测失败exit 1fi并且赋予这个脚本执行权限chmod x /etc/keepalived/check_nginx.sh七、启动KeepAlived服务并且设置成开机自启systemctl start keepalivedsystemctl enable keepalivedsystemctl status keepalived八、真实服务器的Nginx安装可以参考之前文章《Nginx在企业级生产环境部署与最佳实践》Nginx在企业级生产环境部署与最佳实践九、LVS使用的DR模式需要让Nginx响应VIP的请求但是不ARP广播VIP。因此在2台Nginx服务器上均需要进行配置。本文采用shell脚本实现。新建/usr/local/bin/lvs_nginx.sh文件然后在文件中写入下述内容#!/bin/bash# 检查是否为 root 用户执行if [ $UID -ne 0 ]; thenecho 错误必须以 root 权限执行此脚本exit 1fiVIP172.16.1.100case $1 instart)# 配置 ARP 忽略/通告参数避免 VIP 漂移echo 1 /proc/sys/net/ipv4/conf/all/arp_ignoreecho 2 /proc/sys/net/ipv4/conf/all/arp_announceecho 1 /proc/sys/net/ipv4/conf/lo/arp_ignoreecho 2 /proc/sys/net/ipv4/conf/lo/arp_announce# 配置 lo:0 别名接口兼容 ifconfig/ip 两种命令if command -v ifconfig /dev/null; thenifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP uproute add -host $VIP dev lo:0elseip addr add $VIP/32 dev lo label lo:0ip route add $VIP/32 dev lofiecho LVS-DR 模式已启用;;stop)# 关闭 lo:0 别名接口if command -v ifconfig /dev/null; thenifconfig lo:0 downelseip addr del $VIP/32 dev lo label lo:0ip route del $VIP/32 dev lofi# 恢复 ARP 参数默认值echo 0 /proc/sys/net/ipv4/conf/all/arp_ignoreecho 0 /proc/sys/net/ipv4/conf/all/arp_announceecho 0 /proc/sys/net/ipv4/conf/lo/arp_ignoreecho 0 /proc/sys/net/ipv4/conf/lo/arp_announceecho LVS-DR 模式已关闭;;*)echo Usage: $0 {start|stop}exit 1;;esac十、给脚本设置执行权限并且将启动脚本写到开机自启文件中chmod x /usr/local/bin/lvs_nginx.sh/usr/local/bin/lvs_nginx.sh startecho /usr/local/bin/lvs_nginx.sh start /etc/rc.localchmod x /etc/rc.local十一、给Nginx修改首页界面。这里我们分别给nginx-01和nginx-02修改主界面。echo “nginx-01” /usr/share/nginx/html/index.htmlecho “nginx-02” /usr/share/nginx/html/index.html如果想测试验证Nginx的高级特性动静分离和反向代理可以参考之前的文章《Nginx在企业级生产环境部署与最佳实践》Nginx在企业级生产环境部署与最佳实践十二、这里我们分别测试停止LVS查看业务状态。这时请求VIP业务不受影响。请求界面在nginx-01和nginx-02不断切换。十三、在这个时候我们再停掉其中一个Nginx这时LVS只将请求打给另外一台NginxLVS会自动剔除关掉的那个节点。【LVSNginxKeepAlived常见的运维命令】# 查看 LVS 连接ipvsadm -ln# 查看状态统计ipvsadm -l --stats# 清空规则ipvsadm -C# 日志跟踪journalctl -u keepalived -f# 查看 VIP 所在机器ip addr | grep 172.16.1.100
返回列表