🚀 作者 :“二当家-小 D”
🚀 博主简介:⭐前荔枝 FM 架构师、阿里资深工程师||曾任职于阿里巴巴担任多个项目负责人,8 年开发架构经验,精通 java, 擅长分布式高并发架构, 自动化压力测试,微服务容器化 k8s 等
🚀 欢迎小伙伴们 点赞👍、收藏⭐、留言💬
🍅文末获取源码联系 配套笔记打包🍅

🔗往期文章传送门:
零基础入门高性能Nginx服务器(一)
玩转高性能Nginx服务器经典案例实战 (二)

Nginx性能优化和HTTPS配置实战(三)

Nginx整合OpenResty实战(四)

一、Ngnix高可用解决方案LVS+KeepAlived

1. 全链路高可用之Nginx基础架构问题分析

简介:讲解Nginx单点问题剖析

  • 全链路高可用之Nginx反向代理单点故障分析
    • dns轮训多个ip,假如某个nginx挂了,怎么办

image-20200810102128969

  • Nginx集群架构(vip )

image-20200810110142700

  • Nginx高可用解决方案-基础

    国际标准化组织(ISO)制定的一个用于计算机或通信系统间互联的标准体系。
    
    从低到高分别是:
    
    物理层、数据链路层、网络层、传输层、会话层、表示层和应用层
    
    四层工作在OSI第四层 也就是传输层
    
    七层工作在最高层,也就是应用层
    
    • F5、LVS(四层负载 tcp
      • 用虚拟ip+port接收请求,再转发到对应的真实机器
    • HAproxy、Nginx(七层负载)
      • 用虚拟的url或主机名接收请求,再转向相应的处理服务器

2. 业界主流的高可用方案 Linux虚拟服务器 LVS 讲解

简介:讲解业界主流高可用方案Linux虚拟服务器 LVS讲解

LVS是Linux Virtual Server,Linux虚拟服务器,是一个虚拟的服务器集群系统

项目是由章文嵩博士成立,是中国国内最早出现的自由软件项目之一

Linux2.4 内核以后,LVS 已经是 Linux 标准内核的一部分

软件负载解决的两个核心问题是:选谁、转发

image-20200824224413529

  • 提供了10多种调度算法: 轮询、加权轮询、最小连接、目标地址散列、源地址散列等

  • 三种负载均衡转发技术

    • NAT:数据进出都通过 LVS, 前端的Master既要处理客户端发起的请求,又要处理后台RealServer的响应信息,将RealServer响应的信息再转发给客户端, 容易成为整个集群系统性能的瓶颈; (支持任意系统且可以实现端口映射)
    • DR: 移花接木,最高效的负载均衡规则,前端的Master只处理客户端的请求,将请求转发给RealServer,由后台的RealServer直接响应客户端,不再经过Master, 性能要优于LVS-NAT; 需要LVS和RS集群绑定同一个VIP(支持多数系统,不可以实现端口映射)
    • TUNL:隧道技术,前端的Master只处理客户端的请求,将请求转发给RealServer,然后由后台的RealServer直接响应客户端,不再经过Master;(支持少数系统,不可以实现端口映射))

3. 业界主流的高可用方案 keepalived讲解

简介:讲解业界主流高可用方案keepalived讲解

  • 什么是keepalived
    • 核心:监控并管理 LVS 集群系统中各个服务节点的状态
keepalived是一个类似于交换机制的软件,核心作用是检测服务器的状态,如果有一台web服务器工作出现故障,Keepalived将检测到并将有故障的服务器从系统中剔除,使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成。

后来加入了vrrp(虚拟路由器冗余协议),除了为lvs提供高可用还可以为其他服务器比如Mysql、Haproxy等软件提供高可用方案
  • 安装
yum install -y keepalived

#路径
cd /etc/keepalived
  • 启动和查看命令
#启动
service keepalived start

#停止
service keepalived stop

#查看状态
service keepalived status

#重启
service keepalived restart

#停止防火墙
systemctl stop firewalld.service
  • 注意: 如果有缺少依赖可以执行下面的命令
yum install -y gcc
yum install -y openssl-devel
yum install -y libnl libnl-devel
yum install -y libnfnetlink-devel
yum install -y net-tools
yum install -y vim wget

4. Keepalived核心配置讲解

简介:Keepalived核心配置讲解

  • 配置/etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {

   router_id LVS_DEVEL # 设置lvs的id,在一个网络内应该是唯一的
   enable_script_security #允许执行外部脚本
}


#配置vrrp_script,主要用于健康检查及检查失败后执行的动作。
vrrp_script chk_real_server {
#健康检查脚本,当脚本返回值不为0时认为失败
    script "/usr/local/software/conf/chk_server.sh"
#检查频率,以下配置每2秒检查1次
    interval 2
#当检查失败后,将vrrp_instance的priority减小5
    weight -5
#连续监测失败3次,才认为真的健康检查失败。并调整优先级
    fall 3
#连续监测2次成功,就认为成功。但不调整优先级
    rise 2

    user root
}



#配置对外提供服务的VIP vrrp_instance配置

vrrp_instance VI_1 {

#指定vrrp_instance的状态,是MASTER还是BACKUP主要还是看优先级。
    state MASTER

#指定vrrp_instance绑定的网卡,最终通过指定的网卡绑定VIP
    interface ens33

#相当于VRID,用于在一个网内区分组播,需要组播域内内唯一。
    virtual_router_id 51

#本机的优先级,VRID相同的机器中,优先级最高的会被选举为MASTER
    priority 100

#心跳间隔检查,默认为1s,MASTER会每隔1秒发送一个报文告知组内其他机器自己还活着。
    advert_int 1

    authentication {
        auth_type PASS
        auth_pass 1111
    }

#定义虚拟IP(VIP)为192.168.159.100,可多设,每行一个
    virtual_ipaddress {
        192.168.159.100
    }

    #本vrrp_instance所引用的脚本配置,名称就是vrrp_script 定义的容器名
  track_script {
      chk_real_server
    }
}

# 定义对外提供服务的LVS的VIP以及port
virtual_server 192.168.159.100 80 {
    # 设置健康检查时间,单位是秒
    delay_loop 6

    # 设置负载调度的算法为rr
    lb_algo rr

    # 设置LVS实现负载的机制,有NAT、TUN、DR三个模式
    lb_kind NAT

    # 会话保持时间
    persistence_timeout 50

   #指定转发协议类型(TCP、UDP)
    protocol TCP

    # 指定real server1的IP地址

    real_server 192.168.159.146 80 {
        # 配置节点权值,数字越大权重越高
        weight 1

        # 健康检查方式
        TCP_CHECK {                  # 健康检查方式
            connect_timeout 10       # 连接超时
            retry 3           # 重试次数
            delay_before_retry 3     # 重试间隔
            connect_port 80          # 检查时连接的端口
        }

    }

}

image-20200824224413529

  • 配置注意

    router_id后面跟的自定义的ID在同一个网络下是一致的
    
    state后跟的MASTER和BACKUP必须是大写;否则会造成配置无法生效的问题
    
    interface 网卡ID;要根据自己的实际情况来看,可以使用以下方式查询 ip a  查询
    
    在BACKUP节点上,其keepalived.conf与Master上基本一致,修改state为BACKUP,priority值改小即可
    
    authentication主备之间的认证方式,一般使用PASS即可;主备的配置必须一致,不能超过8位
    

5. 架构系列之Nginx高可用方案相关环境准备

简介:准备Nginx+Lvs+KeepAlive相关软件环境

  • 配置Nginx, 修改网页

image-20200824224413529

  • 启动keepalived
#启动
service keepalived start

#停止
service keepalived stop

#查看状态
service keepalived status

#重启
service keepalived restart

#停止防火墙
systemctl stop firewalld.service

6. 架构系列之Nginx+LVS+KeepAlived方案实施《上》

简介:Nginx+Lvs+KeepAlive高可用方案实施《上》

  • 根据需求配置多个节点
  • 演示
    • 如果其中keepalived挂了,那就会vip就会分发到另外一个keepalived节点,响应正常
    • 如果某个realServer挂了,比如是Nginx挂了,那对应keepalived节点存活依旧可以转发过去,但是响应失败

image-20200824224413529

7. 架构系列之Nginx+LVS+KeepAlived方案实施《下》

简介:Nginx+Lvs+KeepAlive高可用方案实施《下》

  • 解决问题
    • 如果某个realServer挂了,比如是Nginx挂了,那对应keepalived节点存活依旧可以转发过去,但是响应失败

image-20200824224540783

  • 脚本监听
#配置vrrp_script,主要用于健康检查及检查失败后执行的动作。
vrrp_script chk_real_server {
#健康检查脚本,当脚本返回值不为0时认为失败
    script "/usr/local/software/conf/chk_server.sh"
#检查频率,以下配置每2秒检查1次
    interval 2
#当检查失败后,将vrrp_instance的priority减小5
    weight -5
#连续监测失败3次,才认为真的健康检查失败。并调整优先级
    fall 3
#连续监测2次成功,就认为成功。但不调整优先级
    rise 2

    user root
}

  • chk_server.sh脚本内容(需要 chmod +x chk_server.sh)
#!/bin/bash
#检查nginx进程是否存在
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" -eq "0" ]; then
    service keepalived stop
    echo 'nginx server is died.......'
fi
  • 常见问题
vip能ping通,vip监听的端口不通: 第一个原因:nginx1和nginx2两台服务器的服务没有正常启动

vip ping不通: 核对是否出现裂脑,常见原因为防火墙配置所致导致多播心跳失败,核对keepalived的配置是否正确
  • 特别注意: 需要关闭selinux,不然sh脚本可能不生效

    • getenforce 查看
    • setenforce 0 关闭
  • 生产环境问题

    • VIP : 阿里云(LBS)、华为云、腾讯云、AWS

二、 Nginx高性能原理

Nginx基础架构master-worker进程剖析

简介:Nginx基础架构模型剖析

  • master 进程负责管理 Nginx 本身和其他 worker 进程

img

  • 高性能原理
    • nginx 通过 多进程 + io多路复用(epoll) 实现了高并发
    • 采用多个worker 进程实现对 多cpu 的利用 通过eopll 对 多个文件描述符 事件回调机制

img

  • 拓展:linux I/O多路复用有select,poll,epoll
I/O模式一般分为同步IO和异步IO。

同步IO会阻塞进程,异步IO不会阻塞进程。

目前linux上大部分用的是同步IO,异步IO在linux上还不太成熟(有部分)

同步IO又分为阻塞IO,非阻塞IO,IO多路复用, 很多人对这个就有疑问了????

同步IO会阻塞进程,为什么也包括非阻塞IO? 因为非阻塞IO虽然在请求数据时不阻塞,但真正数据来临时,也就是内核数据拷贝到用户数据时,此时进程是阻塞的。


推荐书籍《Unix网络编程》
推荐课程《高并发架构-Netty百万连接实战》

今天的文章就先分享到这里了,需要资料包和完整笔记可以联系我哦!

资料获取📚
完整代码和笔记已经准备好,如果有问题,可以在评论区留言讨论💬
原创不易,别忘了点赞👍+收藏⭐哦!
点击下方链接即可获取完整资料压缩包🎁,快来领取吧!↓↓↓↓

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐