40-软件部署实战(上):部署方案及负载均衡、高可用组件介绍

40-软件部署实战(上):部署方案及负载均衡、高可用组件介绍

 。

 系统缺少高可用、弹性扩容等能力,是很脆弱的,遇到流量波峰、发布变更很容易出问题。在系统真正上线前,我们需要重新调整部署架构,来保证我们的系统具有负载均衡、高可用、弹性伸缩等核心运维能力。

 

第一种是传统的部署方式,基于物理机/虚拟机来部署,容灾、弹性伸缩能力要部署人员自己实现。

第二种是容器化部署方式,基于Docker、Kubernetes来部署,容灾、弹性伸缩等能力,可以借助Kubernetes自带的能力来实现。

IAM部署相关的两个组件,Nginx + Keepalived的相关功能。

部署方案

 

这里,我采用Nginx + Keepalived来部署一个高可用的架构,同时将组件都部署在内网,来保证服务的安全和性能。

部署需要两台物理机/虚拟机,组件之间通过内网访问。所需的服务器如下表所示:

图片

两台服务器均为腾讯云CVM,VIP(Virtual IP,虚拟IP)为10.0.4.99。部署架构如下图所示:

这里我来具体介绍下图中的部署架构。部署采用的这两台CVM服务器,一主一备,它们共享同一个VIP。 

主服务器上部署了iam-apiserveriam-authz-serveriam-pump和数据库mongodbredismysql。备服务器部署了iam-apiserveriam-authz-serveriam-pump。备服务器中的组件通过内网10.0.4.20访问主服务器中的数据库组件。

主备服务器同时安装了Keepalived和Nginx,通过Nginx的反向代理功能和负载均衡功能,实现后端服务iam-apiserveriam-authz-server的高可用,通过Keepalived实现Nginx的高可用。

 

通过以上部署方案,我们可以实现一个具有较高可用性的IAM系统,它主要具备下面这几个能力。

  • 高性能:可以通过Nginx的负载均衡功能,水平扩容IAM服务,从而实现高性能。
  • 具备容灾能力:通过Nginx实现IAM服务的高可用,通过Keepalived实现Nginx的高可用,从而实现核心组件的高可用。
  • 具备水平扩容能力:通过Nginx的负载均衡功能,实现IAM服务的水平扩容。
  • 高安全性:将所有组件部署在内网,客户端只能通过VIP:443端口访问Nginx服务,并且通过开启TLS认证和JWT认证,保障服务有一个比较高的安全性。因为是腾讯云CVM,所以也可以借助腾讯云的能力再次提高服务器的安全性,比如安全组、DDoS防护、主机安全防护、云监控、云防火墙等。

 接下来,我们看下这个部署方案中用到的两个核心组件,Nginx和Keepalived。 

Nginx安装和配置

Nginx功能简介

这里先简单介绍下Nginx。Nginx是一个轻量级、高性能、开源的HTTP服务器和反向代理服务器。IAM系统使用了Nginx反向代理和负载均衡的功能,下面我就来分别介绍下。

为什么需要反向代理呢?在实际的生产环境中,服务部署的网络(内网)跟外部网络(外网)通常是不通的,这就需要一台既能够访问内网又能够访问外网的服务器来做中转,这种服务器就是反向代理服务器。Nginx作为反向代理服务器,简单的配置如下:

server {
    listen      80;
    server_name  iam.marmotedu.com;
    client_max_body_size 1024M;

    location / {
        proxy_set_header Host $http_host;
        proxy_set_header X-Forwarded-Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass  http://127.0.0.1:8080/;
        client_max_body_size 100m;
    }
}

Nginx的反向代理功能,能够根据不同的配置规则转发到不同的后端服务器上。假如我们在IP为x.x.x.x的服务器上,用上面说的Nginx配置启动Nginx,当我们访问http://x.x.x.x:80/时,会将请求转发到http://127.0.0.1:8080/listen 80指定了Nginx服务器的监听端口,proxy_pass http://127.0.0.1:8080/则指定了转发路径。

Nginx另一个常用的功能是七层负载均衡。所谓的负载均衡,就是指当Nginx收到一个HTTP请求后,会根据负载策略将请求转发到不同的后端服务器上。比如iam-apiserver部署在两台服务器A和B上,当请求到达Nginx后,Nginx会根据A和B服务器上的负载情况,将请求转发到负载较小的那台服务器上。

这里要求iam-apiserver是无状态的服务。Nginx有多种负载均衡策略,可以满足不同场景下的负载均衡需求。

Nginx安装步骤

接下来,我就来介绍下如何安装和配置Nginx。

我们分别在10.0.4.2010.0.4.21服务器上执行如下步骤,安装Nginx。

在CentOS 8.x系统上,我们可以使用yum命令来安装,具体安装过程可以分为下面4个步骤。

第一步,安装Nginx:

$ sudo yum -y install nginx

第二步,确认Nginx安装成功:

$ nginx -v
nginx version: nginx/1.14.1

第三步,启动Nginx,并设置开机启动:

$ sudo systemctl start nginx
$ sudo systemctl enable nginx

Nginx默认监听80端口,启动Nginx前要确保80端口没有被占用。当然,你也可以通过修改Nginx配置文件/etc/nginx/nginx.conf修改Nginx监听端口。

第四步,查看Nginx启动状态:

$ systemctl status nginx

输出中有active (running)字符串,说明成功启动。如果Nginx启动失败,你可以查看/var/log/nginx/error.log日志文件,定位错误原因。

Keepalived安装和配置

Nginx自带负载均衡功能,并且当Nginx后端某个服务器故障后,Nginx会自动剔除该服务器,将请求转发到可用的服务器,通过这种方式实现后端API服务的高可用。但是 Nginx是单点的,如果Nginx挂了,后端的所有服务器就都不能访问,所以在实际生产环境中,也需要对Nginx做高可用。

业界最普遍采用的方法是通过Keepalived对前端Nginx实现高可用。Keepalived + Nginx的高可用方案具有服务功能强大、维护简单等特点。

接下来,我们来看下如何安装和配置Keepalived。

Keepalived安装步骤

我们分别在10.0.4.2010.0.4.21服务器上执行下面5个步骤,安装Keepalived。

第一步,下载Keepalived的最新版本(这门课安装了当前的最新版本 2.1.5):

$ wget https://www.keepalived.org/software/keepalived-2.1.5.tar.gz

第二步,安装Keepalived:

$ sudo yum -y install openssl-devel # keepalived依赖OpenSSL,先安装依赖
$ tar -xvzf keepalived-2.1.5.tar.gz
$ cd keepalived-2.1.5
$ ./configure --prefix=/usr/local/keepalived
$ make
$ sudo make install

第三步,配置Keepalived:

$ sudo mkdir /etc/keepalived # 安装后,默认没有创建/etc/keepalived目录
$ sudo cp /usr/local/keepalived/etc/keepalived/keepalived.conf  /etc/keepalived/keepalived.conf
$ sudo cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/keepalived

Keepalived的systemd uint配置,默认使用了/usr/local/keepalived/etc/sysconfig/keepalived作为其EnvironmentFile,我们还需要把它修改为/etc/sysconfig/keepalived文件。编辑/lib/systemd/system/keepalived.service文件,设置EnvironmentFile,值如下:

EnvironmentFile=-/etc/sysconfig/keepalived

第四步,启动Keepalived,并设置开机启动:

$ sudo systemctl start keepalived
$ sudo systemctl enable keepalived

这里要注意,Keepalived启动时不会校验配置文件是否正确,所以我们要小心修改配置,防止出现意想不到的问题。

第五步,查看Keepalived的启动状态:

$ systemctl status keepalived

输出中有active (running)字符串,说明成功启动。Keepalived的日志保存在/var/log/messages中,你有需要的话可以查看。

Keepalived配置文件解析

Keepalived的默认配置文件为/etc/keepalived/keepalived.conf,下面是一个Keepalived配置:

# 全局定义,定义全局的配置选项
global_defs {
# 指定keepalived在发生切换操作时发送email,发送给哪些email
# 建议在keepalived_notify.sh中发送邮件
  notification_email {
    acassen@firewall.loc
  }
  notification_email_from Alexandre.Cassen@firewall.loc # 发送email时邮件源地址
    smtp_server 192.168.200.1 # 发送email时smtp服务器地址
    smtp_connect_timeout 30 # 连接smtp的超时时间
    router_id VM-4-21-centos # 机器标识,通常可以设置为hostname
    vrrp_skip_check_adv_addr # 如果接收到的报文和上一个报文来自同一个路由器,则不执行检查。默认是跳过检查
    vrrp_garp_interval 0 # 单位秒,在一个网卡上每组gratuitous arp消息之间的延迟时间,默认为0
    vrrp_gna_interval 0 # 单位秒,在一个网卡上每组na消息之间的延迟时间,默认为0
}
# 检测脚本配置
vrrp_script checkhaproxy
{
  script "/etc/keepalived/check_nginx.sh" # 检测脚本路径
    interval 5 # 检测时间间隔(秒)
    weight 0 # 根据该权重改变priority,当值为0时,不改变实例的优先级
}
# VRRP实例配置
vrrp_instance VI_1 {
  state BACKUP  # 设置初始状态为'备份'
    interface eth0 # 设置绑定VIP的网卡,例如eth0
    virtual_router_id 51  # 配置集群VRID,互为主备的VRID需要是相同的值
    nopreempt               # 设置非抢占模式,只能设置在state为backup的节点上
    priority 50 # 设置优先级,值范围0~254,值越大优先级越高,最高的为master
    advert_int 1 # 组播信息发送时间间隔,两个节点必须设置一样,默认为1秒
# 验证信息,两个节点必须一致
    authentication {
      auth_type PASS # 认证方式,可以是PASS或AH两种认证方式
        auth_pass 1111 # 认证密码
    }
  unicast_src_ip 10.0.4.21  # 设置本机内网IP地址
    unicast_peer {
      10.0.4.20             # 对端设备的IP地址
    }
# VIP,当state为master时添加,当state为backup时删除
  virtual_ipaddress {
    10.0.4.99 # 设置高可用虚拟VIP,如果是腾讯云的CVM,需要填写控制台申请到的HAVIP地址。
  }
  notify_master "/etc/keepalived/keepalived_notify.sh MASTER" # 当切换到master状态时执行脚本
    notify_backup "/etc/keepalived/keepalived_notify.sh BACKUP" # 当切换到backup状态时执行脚本
    notify_fault "/etc/keepalived/keepalived_notify.sh FAULT" # 当切换到fault状态时执行脚本
    notify_stop "/etc/keepalived/keepalived_notify.sh STOP" # 当切换到stop状态时执行脚本
    garp_master_delay 1    # 设置当切为主状态后多久更新ARP缓存
    garp_master_refresh 5   # 设置主节点发送ARP报文的时间间隔
    # 跟踪接口,里面任意一块网卡出现问题,都会进入故障(FAULT)状态
    track_interface {
      eth0
    }
  # 要执行的检查脚本
  track_script {
    checkhaproxy
  }
}

这里解析下配置文件,大致分为下面4个部分。

  • global_defs:全局定义,定义全局的配置选项。
  • vrrp_script checkhaproxy:检测脚本配置。
  • vrrp_instance VI_1:VRRP实例配置。
  • virtual_server:LVS配置。如果没有配置LVS+Keepalived,就不用设置这个选项。这门课中,我们使用Nginx代替LVS,所以无需配置virtual_server(配置示例中不再展示)。

只有在网络故障或者自身出问题时,Keepalived才会进行VIP切换。但实际生产环境中,我们往往使用Keepalived来监控其他进程,当业务进程出故障时切换VIP,从而保障业务进程的高可用。

为了让Keepalived感知到Nginx的运行状况,我们需要指定vrrp_script脚本,vrrp_script脚本可以根据退出码,判断Nginx进程是否正常,0正常,非0不正常。当不正常时,Keepalived会进行VIP切换。为了实现业务进程的监控,我们需要设置vrrp_scripttrack_script

vrrp_script checkhaproxy
{
    script "/etc/keepalived/check_nginx.sh"
    interval 3
    weight -20
}

vrrp_instance test
{
    ...
    track_script
    {
        checkhaproxy
    }
    ...
}

这里,我介绍下上面配置中的一些配置项。

  • script:指定脚本路径。
  • interval:表示Keepalived执行脚本的时间间隔(秒)。
  • weight:检测权重,可以改变priority的值。例如,-20表示检测失败时,优先级-20,成功时不变。20表示检测成功时,优先级+20,失败时不变。

总结

 我们可以基于物理机/虚拟机来部署IAM应用,在部署IAM应用时,需要确保整个应用具备高可用和弹性扩缩容能力。你可以通过Nginx的反向代理功能和负载均衡功能实现后端服务iam-apiserver和iam-authz-server的高可用,通过Keepalived实现Nginx的高可用,通过Nginx + Keepalived组合,来实现IAM应用的高可用和弹性伸缩能力。

课后练习

  1. Keepalived的主备服务器要接在同一个交换机上。思考下,如果交换机故障,如何实现整个系统的高可用?
  2. iam-pump是有状态的服务,思考下,如何实现iam-pump的高可用?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/531104.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

成为嵌入式工程师以后才明白的道理

1. 刚开始,不要太在乎薪水20多岁的年纪,一人吃饱,全家不饿,太看重薪水,反而会错过很多机会,而且经验不足时,薪水相差也不大。在开始前我有一些资料,是我根据网友给的问题精心整理了一…

大数据相关组件安装及使用

自学大数据相关组件 持续更新中。。。 一、linux安装docker 1、更新yum sudo yum update2、卸载docker旧版本 sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine3、…

【文件IO】JavaIO详解

一.文件的相关概念 什么是文件? 文件是计算机中存储信息的基本单位。文件通常指的是存储在计算机或其他数字存储设备上的一段信息的集合,这些信息可以是文本、图片、音频、视频等不同格式的数据。 文件路径: 文件的路径可以分为两类 相对路径:先指定一个"当前…

批量把GBK文本编码换成UTF-8

因为工作团队协作原因,有的同事使用gbk,有的使用utf-8,不方便,于是商量便统一换成utf-8,但是项目文件太多,所以百度搜索于是有了用python脚本一键实现的方案,以下为步骤. 本人亲测可用!!!(只在win11上亲测可用) 以下代码只实现对.c和.h文件的编码转换 1.电脑安装python脚本: …

css文字颜色渐变

background: linear-gradient(to top, #C3F8B3, #66FFFF);-webkit-background-clip: text;-webkit-text-fill-color: transparent; 效果

户外骑行存档(图新地球与运动健康App)经验分享

0序 之前天天加班熬夜,身体素质有些下降,在锻炼的过程中喜欢上了骑行,周周骑、天天骑。 骑行会产生很多的轨迹(有很多朋友不喜欢装很多app,就用手机自带的运动健康,也有喜欢专业运动app的,道理…

通过 Cookie、Redis共享Session 和 Spring 拦截器技术,实现对用户登录状态的持有和清理(四)

本篇内容对应 “2.5 开发登录、退出功能” 小节 “4.7 优化登陆模块” 小节 2.6 显示登录信息 2.7 账号设置 2.8 检查登录状态 登录功能的流程是什么? UUID为什么不会重复? 因为UUID是基于mac物理地址、时间戳、随机数等信息生成。因此UUID居于极高的唯…

在B站看课的进度助手

效果 代码 BilibiliVideoDurationCrawler import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import java.io.IOException; import java.text.ParseException; import java.util.ArrayList; imp…

【教程】混淆Dart 代码

什么是代码混淆? 代码混淆是一种将应用程序二进制文件转换为功能上等价,但人类难于阅读和理解的行为。在编译 Dart 代码时,混淆会隐藏函数和类的名称,并用其他符号替代每个符号,从而使攻击者难以进行逆向工程。 Flut…

每日一题:有效的数独

请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图) 注…

教你构建一个优秀的SD Prompt

构建一个优秀的Prompt 在使用Stable Diffusion AI时,构建一个有效的提示(Prompt)是至关重要的第一步。这个过程涉及到创造性的尝试和对AI行为的理解。这里我会对如何构建一个好的Prompt进行一个总结。 什么是一个好的提示词 构建有效的提示是使用Stable Diffusion AI或其…

职场商务英语口语柯桥外语培训之“手机欠费”用英文怎么说?

大家天天玩手机, 肯定会碰到 “欠费”“没电”“关机” 这些情况, 那么问题来了, 你知道用英语怎么说? 一起来和小编来学习下吧 今天,一起来学习一下吧。 ● 手机欠费 英语怎么说? ● 肯定有同学要…

二手车商的套路

https://www.dongchedi.com/article/7126394624675578405 https://www.dongchedi.com/article/7126394624675578405 现在,有越来越多的人去了解二手车,二手车相对于新车来说,更加的亲民划算。很多新车需要四五十万,而二手车有可…

信息素养与终身学习解锁题目搜索之道的新引擎【文末送书】

文章目录 信息素养:搜索前的准备终身学习:搜索后的深化新引擎的构建与运行 搜索之道:信息素养与终身学习的新引擎【文末送书】 随着互联网的快速发展和信息技术的日益成熟,搜索已经成为获取知识和信息的主要途径之一。然而&#x…

浙大恩特客户资源管理系统 RegulatePriceAction SQL注入漏洞复现

0x01 产品简介 浙大恩特客户资源管理系统是一款针对企业客户资源管理的软件产品。该系统旨在帮助企业高效地管理和利用客户资源,提升销售和市场营销的效果。 0x02 漏洞概述 浙大恩特客户资源管理系统 RegulatePriceAction接口存在 SQL 注入漏洞,攻击者可通过输入恶意 SQL …

47 转置卷积【李沐动手学深度学习v2课程笔记】

1. 转置卷积 卷积层和汇聚层通常会减少下采样输入图像的空间维度(高和宽),卷积通常来说不会增大输入的高和宽,要么保持高和宽不变,要么会将高宽减半,很少会有卷积将高宽变大的。可以通过 padding 来增加高…

layui复选框勾选取消勾选事件监听

监听事件放置位置&#xff1a; form.on(checkbox(equipInputClick), function(data){var a data.elem.checked;var val data.value;if(a true){}else{}});html部分 <input lay-filter"equipInputClick" type"checkbox" lay-skin"primary&quo…

Leetcode 23.合并K个升序链表

心路历程&#xff1a; 第一反应是直接暴力求解出来&#xff0c;因为题中也没有关于复杂度的要求。写完发现竟然也通过了&#xff0c;后来发现这道题本来考察的是分治算法&#xff0c;不过能解决问题就行吧。 从评论区看到了一句话很有意思&#xff1a;链表的题能暴力做出来的…

Vue 移动端(H5)项目怎么实现页面缓存(即列表页面进入详情返回后列表页面缓存且还原页面滚动条位置)keep-alive简单使用

一、需求 产品要求&#xff1a;Vue移动端项目进入列表页&#xff0c;列表页需要刷新&#xff0c;而从详情页返回列表页&#xff0c;列表页则需要缓存并且还原页面滚动条位置 二、实现思路 1、使用Vue中的keep-alive组件&#xff0c;keep-alive提供了路由缓存功能 2、因为我项…

优先级队列

优先级队列的基本使用 模拟实现上面的接口函数&#xff0c;优先级队列不是队列&#xff0c;而是类似一个堆一样的东西&#xff0c;我们先来试试它的接口函数是怎么个样子的。 需要包含的头文件是queue。 #include<iostream> #include<queue> using namespace std;…