【nginx】starrocks通过nginx实现负载均衡、故障转移与flink运行SR实战

文章目录

  • 一. 通过nginx实现starrocks负载均衡与故障转移
    • 1. 架构逻辑与nginx配置
    • 2. nginx相关知识:`stream`模块和`http`模块
      • 2.1. `stream`模块
      • 2.2. `http`模块
  • 二. 使用flink 消费SR实战
    • 1. Expect: 100-continue 问题
      • 1.1. `Expect: 100-continue`的逻辑
      • 1.2. 问题分析与解决
    • 2.no live upstreams while connecting to upstream
    • 3.recv() failed (104: Connection reset by peer) while reading response header from upstream(ing)
    • 4.transmit chunk rpc failed

starrocks官网介绍了starrocks 负载均衡 的实现方式,其中可以 通过代码均衡负载、 通过 JDBC Connector 均衡负载, 通过 ProxySQL 均衡负载 等三种方式实现负载均衡。

 
本文通过nginx的方式实现flink消费sr数据时的负载均衡。并解决flink在运行sr任务中遇到的问题。

一. 通过nginx实现starrocks负载均衡与故障转移

1. 架构逻辑与nginx配置

大致逻辑:

flink请求Nginx负载均衡服务器,根据规则(hash、轮询)将请求转发到选定的FE_Server 进程。其中

  • 9031用于通过jdbc方式与Starrocks进行交互,其中可以在flink任务运行前、后,在jobmanager中执行pre-sql、post-sql。
  • 8031用于通过Starrocks的streamload方式来写入数据到Starrocks。
    在这里插入图片描述

nginx的定位

Nginx作为反向代理,upstream绑定多个FE节点,既可以实现负载均衡,又能实现故障自动切换。

故障转移

  1. 当请求到某个server失败时(由proxy_next_upstream判断),nginx会请求下个upstream server
  2. 当转发请求max_fails次还未成功,则判断为此机器dead,nginx就不再转发请求到此节点,直到fail_timeout后,nginx将此节点加回运行节点列表。

负载均衡

因为Starrocks中fe只有follower和leader,且follower和leader谁接收请求效果都一致,所以这里设置为轮询规则(默认规则),均匀地(weight决定)转发请求到各个FE节点。

#user  nobody;
worker_processes  4;

events {
    worker_connections  1024;
}

# 用于负载均衡flink中对Starrocks的jdbc请求
stream{
   upstream starrocks-tcp1{
       # hash $remote_add consistent;
        server hostname1:9030 weight=1 max_fails=3 fail_timeout=60s; #Leader
        server hostname2:9030 weight=1 max_fails=3 fail_timeout=60s; #Follower
        server hostname3:9030 weight=1 max_fails=3 fail_timeout=60s; #Follower
    }

    server
    {
      #proxy 代理的nginx监听端口,可自行修改
       listen 9031;
       proxy_pass starrocks-tcp1;
       proxy_timeout 60s;
       proxy_connect_timeout 30s;
     }
}

# 用于负载均衡flink中通过Starrocks的streamload方式put数据到sr的请求
http {
    include       mime.types;
    include /usr/local/nginx/conf.d/*.conf;
    client_max_body_size 10240m;
    default_type  application/octet-stream;
    sendfile        on;
    # 用于管理HTTP长连接生命周期的参数。它定义了一个TCP连接在完成最后一次数据传输后,
    # 仍然保持打开状态等待新的请求的最大时间。
    keepalive_timeout  600;

   upstream starrocks-tcp2
    {
      #ip_hash;
      # 当连续转发请求3次还未成功,则判断为此机器dead,并等待60后重试此机器。
      server hostname1:8030 weight=1 max_fails=3 fail_timeout=60s; #Leader
      server hostname2:8030 weight=1 max_fails=3 fail_timeout=60s; #Follower
      server hostname3:8030 weight=1 max_fails=3 fail_timeout=60s; #Follower

    }
    server
    {
       # proxy 代理的nginx监听端口
       # 通过监听8031端口下所有请求,将请求转发到sr的8030端口。
       listen 8031;
       location / {
          proxy_pass       http://starrocks-tcp2;
          # 添加请求头
          proxy_set_header expect "100-continue";
          # 故障转移策略:当出现如下返回时,nginx将会尝试与下一台机器进行链接。
          proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
        }
     } 
  }

 

2. nginx相关知识:stream模块和http模块

Nginx的stream模块和http模块是用来处理不同类型的流量的。

2.1. stream模块

stream模块被设计来处理TCP和UDP流量。这是非HTTP的普通TCP或UDP流量,可以应用于任何依赖于TCP或UDP的服务,比如邮件服务器、数据库连接甚至自定义的网络协议。

这里通过stream模块实现了Starrocks jdbc协议下的反向代理,如下。flink通过9031端口访问Starrocks时,先经过nginx,然后转发到upstream下某一个server中。

stream{
   upstream starrocks-tcp1{
       # hash $remote_add consistent;
        server hostname1:9030 weight=1 max_fails=3 fail_timeout=60s; #Leader
        server hostname2:9030 weight=1 max_fails=3 fail_timeout=60s; #Follower
        server hostname3:9030 weight=1 max_fails=3 fail_timeout=60s; #Follower
    }

    server
    {
      #proxy 代理的nginx监听端口,可自行修改
       listen 9031;
       proxy_pass starrocks-tcp1;
       proxy_timeout 60s;
       proxy_connect_timeout 30s;
     }
}

 

2.2. http模块

http模块主要处理HTTP流量。它为HTTP和HTTPS请求提供了反向代理、负载均衡、缓存等功能。此外,它还可以处理基于HTTP的其他协议,如WebSocket。

flink通过8031端口访问Starrocks时,同样经过nginx,nginx转发请求到的upstream中某台server,最终通过streamload方式将数据写到Starrocks。

# 用于负载均衡flink中通过Starrocks的streamload方式put数据到sr的请求

http {
    include       mime.types;
    include /usr/local/nginx/conf.d/*.conf;
    client_max_body_size 10240m;
    default_type  application/octet-stream;
    sendfile        on;
    # 用于管理HTTP长连接生命周期的参数。它定义了一个TCP连接在完成最后一次数据传输后,
    # 仍然保持打开状态等待新的请求的最大时间。
    keepalive_timeout  600;

   upstream starrocks-tcp2
    {
      #ip_hash;
      # 当连续转发请求3次还未成功,则判断为此机器dead,并等待60后重试此机器。
      server hostname1:8030 weight=1 max_fails=3 fail_timeout=60s; #Leader
      server hostname2:8030 weight=1 max_fails=3 fail_timeout=60s; #Follower
      server hostname3:8030 weight=1 max_fails=3 fail_timeout=60s; #Follower

    }
    server
    {
       # proxy 代理的nginx监听端口
       # 通过监听8031端口下所有请求,将请求转发到sr的8030端口。
       listen 8031;
       location / {
          proxy_pass       http://starrocks-tcp2;
          # 添加请求头
          proxy_set_header expect "100-continue";
          # 故障转移策略:当出现如下返回时,nginx将会尝试与下一台机器进行链接。
          proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
        }
     } 

  }

 
总的来说,stream模块适用于处理TCP或UDP流量,而http模块则用来处理HTTP及HTTPS流量。

 

二. 使用flink 消费SR实战

简述: 通过flink sql 实现source SR->sink SR的任务。
说明:flink版本1.16.1,数据量为3300万左右,并发为1,任务时长为1小时5分钟。

以下是在使用flink运行SR任务遇到的问题与解决方式

1. Expect: 100-continue 问题

1.1. Expect: 100-continue的逻辑

http clients发送带有Expect: 100-continueheader的post(put)请求时,是在告诉server端我准备要发送大负载的数据了。

server端接收到此请求时,可以做如下response:

  1. 拒绝:通过返回401/405并逐步关闭连接来拒绝请求。
  2. 接受:通过发送100 Continue,之后客户端将发送有效载荷。
  3. 要求客户端以未更改的方式重新发送原始请求(包括原始头部和有效载荷),通过回复一个417 Expectation Failed

curl在即将发送大型有效载荷时,它会自动发送Expect: 100-continue头部。curl 命令添加Expect: 100-continue header请求时,等待server的response。server评估Content-Length header值,然后决定是否终止请求或接受。
在等待(默认)一秒钟获取response后,curl将数据发送到POST请求的主体中。

参考:
About the HTTP Expect: 100-continue header
the Expect header is all about

 

1.2. 问题分析与解决

当通过flink通过streamload(http client)方式put数据到SR之前,添加了100-continue

        String loadUrl =
                host
                        + "/api/"
                        + bufferEntity.getDatabase()
                        + "/"
                        + bufferEntity.getTable()
                        + "/_stream_load";



try (CloseableHttpClient httpclient = httpClientBuilder.build()) {
            HttpPut httpPut = new HttpPut(loadUrl);
...
            httpPut.setHeader("Expect", "100-continue");
...
            try (CloseableHttpResponse resp = httpclient.execute(httpPut)) {
                HttpEntity respEntity = getHttpEntity(resp);
                if (respEntity == null) return null;
                return (Map<String, Object>) JSON.parse(EntityUtils.toString(respEntity));
            }
        }

但实际运行过程当中出现:

2024-01-22 18:04:01,875 INFO  com.dtstack.chunjun.connector.starrocks.streamload.StarRocksStreamLoadVisitor 
- [dealStreamLoadResult] get loadResult msg = There is no 100-continue header

2024-01-22 18:04:01,875 INFO  
com.dtstack.chunjun.connector.starrocks.streamload.StarRocksStreamLoadVisitor
- [dealStreamLoadResult] get loadResult status = FAILED


简化日志:{"status":"FAILED","msg":"There is no 100-continue header"}

也就说nginx转发请求时丢掉了Expect: 100-continue 的header,至于为什么丢失,这里暂不分析。

那既然这样我们在http模块中添加Expect: 100-continue header。如下。添加之后数据写入问题解决。

    server
    {
       # proxy 代理的nginx监听端口
       # 通过监听8031端口下所有请求,将请求转发到sr的8030端口。
       listen 8031;
       location / {
          proxy_pass       http://starrocks-tcp2;
          # 添加请求头
          proxy_set_header expect "100-continue";
          # 故障转移策略:当出现如下返回时,nginx将会尝试与下一台机器进行链接。
          proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
        }
     } 

 

2.no live upstreams while connecting to upstream

问题描述:当任务运行到40多分钟时,出现如下报错

2024/01/24 14:53:14 [error] 6581#0: *3093 no live upstreams while connecting to upstream, client: xxx, 
server: , request: "PUT /api/radar_test/test_qnmanager_data/_stream_load HTTP/1.1", upstream: 
"http://starrocks-tcp2/api/radar_test/test_qnmanager_data/_stream_load", host: "nginx-node:8031"

2024/01/24 14:53:16 [error] 6581#0: *3095 no live upstreams while connecting to upstream, client: xxx, 
server: , request: "PUT /api/radar_test/test_qnmanager_data/_stream_load HTTP/1.1", upstream: 
"http://starrocks-tcp2/api/radar_test/test_qnmanager_data/_stream_load", host: "nginx-node:8031"

导致任务失败。日志大概的意思是:使用的是 HTTP/1.1 在nginx接收客户端的请求后,转发到SR集群,出现no live upstreams while connecting to upstream 的错误,也就是说SR集群中的FE不能提供服务,或者nginx不能提供可用的FE服务器。

no live upstreams while connecting to upstream错误解释:当链接upstreams没有在线的upstreams。upstreams指的是被代理的服务端,upstream块中server节点们。

 

排查:

查看SR fe节点状态,如下fe节点正常。

mysql -hHost1 -P9031 -uroot -p1111 radar_test       

SHOW PROC '/frontends';  

在这里插入图片描述

此时基本可以确定是nginx不能发送向SR的FEs发送请求,导致flink任务失败。

通过前面的分析,目前可能的情况有:

  1. 上游服务器连接超时: Nginx 在尝试连接上游服务器时,如果超过了设定的连接超时时间,可能会将该服务器标记为不可用。确保连接超时时间配置合理,不要设置得过短。
  2. 上游服务器端口问题: 确保 Nginx 配置中指定的上游服务器端口是正确的,而且上游服务器正在监听该端口。
  3. DNS 解析问题: 如果上游服务器使用域名而不是 IP 地址配置,可能存在 DNS 解析问题。确保 DNS 配置正确,可以通过手动进行 DNS 查询来检查。

分别分析:

  1. nginx监听端口的问题,如下端口没有问题:
    在这里插入图片描述
  2. dns也没有问题
    在这里插入图片描述
    在这里插入图片描述
  1. 上游服务器连接超时
    先看之前nginx的配置:
http {
...
    # 用于管理HTTP长连接生命周期的参数。它定义了一个TCP连接在完成最后一次数据传输后,
    # 仍然保持打开状态等待新的请求的最大时间。
    # keepalive_timeout  60;
     keepalive_timeout  600;

   upstream starrocks-tcp2
    {
      #ip_hash;
      # 当连续转发请求1次还未成功,则判断为此机器dead,并等待600后重试此机器。
      server hostname1:8030 weight=1 max_fails=1 fail_timeout=600s; #Leader
      server hostname2:8030 weight=1 max_fails=1 fail_timeout=600s; #Follower
      server hostname3:8030 weight=1 max_fails=1 fail_timeout=600s; #Follower
    }
    server
    {
       listen 8031;
       location / {
          proxy_pass       http://starrocks-tcp2;
          proxy_set_header expect "100-continue";
          # 故障转移策略:当出现如下返回时,nginx将会尝试与下一台机器进行链接。
          # proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
        }
     } 
  }

问题分析:

flink写3000万数据到SR是频繁触发请求的场景,很容易导致请求失败,这里关于故障转移的配置为:max_fails=1fail_timeout=600s,意思是只要请求失败,就将server判定为dead,并且10分钟之后才重试,那这里就有可能出现:三台节点某次处理请求都失败,导致长达10分钟upstream不可用,即报错:no live upstreams while connecting to upstream

改进配置:max_fails=3 fail_timeout=60s,降低server故障转移的频率与缩短故障时间,降低因为请求导致的高故障率。

其次改进TCP连接超时时间keepalive_timeout 60;,避免过长的时间导致TCP空闲连接浪费资源。

再有丰富nginx捕获异常的能力:proxy_next_upstream error timeout http_500 http_502 http_503 http_504;

 
 

3.recv() failed (104: Connection reset by peer) while reading response header from upstream(ing)

recv() failed (104: Connection reset by peer) 表示nginx接收客户端的数据时连接被对端(peer)重置。

参考:
Connection reset by peer 错误定位

HTTP keepalive:链接测试详解

 

4.transmit chunk rpc failed

2024-01-24 18:13:31,621 WARN  org.apache.flink.runtime.taskmanager.Task - Source: source[1] -> Sink: sink[2] (1/1)#0 (a4cbae5aa8bbd03aaf344721b498f489_cbc357ccb763df2852fee8c4fc7d55f2_0_0) switched from RUNNING to FAILED with failure cause: com.dtstack.chunjun.throwable.ChunJunRuntimeException: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: transmit chunk rpc failed:10304bfb-ba98-11ee-ab87-1070fda9b63f
	at com.dtstack.chunjun.connector.jdbc.source.JdbcInputFormat.nextRecordInternal(JdbcInputFormat.java:227)
	at com.dtstack.chunjun.source.format.BaseRichInputFormat.nextRecord(BaseRichInputFormat.java:199)
	at com.dtstack.chunjun.source.format.BaseRichInputFormat.nextRecord(BaseRichInputFormat.java:67)
	at com.dtstack.chunjun.source.DtInputFormatSourceFunction.run(DtInputFormatSourceFunction.java:125)
	at org.apache.flink.streaming.api.operators.StreamSource.run(StreamSource.java:110)
	at org.apache.flink.streaming.api.operators.StreamSource.run(StreamSource.java:67)
	at org.apache.flink.streaming.runtime.tasks.SourceStreamTask$LegacySourceFunctionThread.run(SourceStreamTask.java:333)
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: transmit chunk rpc failed:10304bfb-ba98-11ee-ab87-1070fda9b63f
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
	at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
	at com.mysql.jdbc.Util.getInstance(Util.java:408)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:944)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3933)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3869)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:864)
	at com.mysql.jdbc.MysqlIO.nextRow(MysqlIO.java:1992)
	at com.mysql.jdbc.RowDataDynamic.nextRecord(RowDataDynamic.java:366)
	at com.mysql.jdbc.RowDataDynamic.next(RowDataDynamic.java:346)
	at com.mysql.jdbc.ResultSetImpl.next(ResultSetImpl.java:6303)
	at com.dtstack.chunjun.connector.jdbc.source.JdbcInputFormat.nextRecordInternal(JdbcInputFormat.java:224)
	... 6 more

flink任务为source:SR -> sink: SR ,其中通过jdbc的方式拉取SR数据,在任务执行50分钟时出现此错误:传输rpc数据块时失败。有可能是jdbc链接设置的问题,也有可能是SR传输数据时的问题。这里通过设置SR参数:brpc_socket_max_unwritten_bytes=8589934592,增大传输数据的大小,解决问题。

 

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

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

相关文章

【Linux系统学习】2.Linux基础命令

Linux基础命令 Linux的目录结构 Linux命令入门 目录切换相关命令(cd/pwd) 相对路径、绝对路径和特殊路径符 创建目录命令(mkdir) 文件操作命令part1(touch、cat、more&#xff09; 文件操作命令part2(cp、mv、rm&#xff09; 查找命令(which、find&#xff09; grep、wc和管道符…

【踏雪无痕的痕一】——认知的心病

目录 一、背景介绍二、思路&方案三、过程1.教育是最大的"炸片"2.逻辑对等性的认知(时间的保证)3.不要去猜一个人怎么想&#xff0c;要看一个人怎么做4.改变一个人的基础5.你想过和你能过上什么生活完全取决于你自己 四、总结 一、背景介绍 大多数人都只愿意看到…

结构体数组所有元素(1亿个元素)初始化为相同的值

一个结构体数组&#xff0c;有1亿个元素&#xff0c;每个元素都要初始化为相同的值&#xff0c;如果没有现成的语法直接支持这样的初始化操作&#xff0c;就得用for循环写&#xff0c;会不会非常耗时&#xff1f; 如果结构体里的成员都是一些简单的基本数据类型&#xff0c;整…

AJAX——认识URL

1 什么是URL&#xff1f; 统一资源定位符&#xff08;英语&#xff1a;Uniform Resource Locator&#xff0c;缩写&#xff1a;URL&#xff0c;或称统一资源定位器、定位地址、URL地址&#xff09;俗称网页地址&#xff0c;简称网址&#xff0c;是因特网上标准的资源的地址&…

【书生·浦语大模型实战营】学习笔记1

大模型成为发展通用人工智能的重要途经 专用模型&#xff1a;针对特定任务&#xff0c;一个模型解决一个问题 通用大模型&#xff1a;一个模型应对多种任务、多种模态 书生浦语大模型系列 上海人工智能实验室 轻量级、中量级、重量级 7B 和 123B的轻量级和中量级大模型都是开源…

【C++】map与set的常见使用

目录 1.关联式容器与序列式容器 2.键值对与pair 3.set 4.map 4.1map的插入与修改 4.2map的迭代器使用 4.3map中[ ]的巧妙用法 1.关联式容器与序列式容器 序列式容器(vector、list、deque…)&#xff1a;其底层为线性序列的数据结构&#xff0c;里面存储的是元素本身。 …

【Make编译控制 01】程序编译与执行

目录 一、编译原理概述 二、编译过程分析 三、编译动静态库 四、执行过程分析 一、编译原理概述 make&#xff1a; 一个GCC工具程序&#xff0c;它会读 makefile 脚本来确定程序中的哪个部分需要编译和连接&#xff0c;然后发布必要的命令。它读出的脚本&#xff08;叫做 …

JAVA设计模式之建造者模式详解

建造者模式 1 建造者模式介绍 建造者模式 (builder pattern), 也被称为生成器模式 , 是一种创建型设计模式. 定义: 将一个复杂对象的构建与表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 **建造者模式要解决的问题 ** 建造者模式可以将部件和其组装过程分开…

内网渗透靶场02----Weblogic反序列化+域渗透

网络拓扑&#xff1a; 攻击机&#xff1a; Kali: 192.168.111.129 Win10: 192.168.111.128 靶场基本配置&#xff1a;web服务器双网卡机器&#xff1a; 192.168.111.80&#xff08;模拟外网&#xff09;10.10.10.80&#xff08;模拟内网&#xff09;域成员机器 WIN7PC192.168.…

【开源】基于JAVA+Vue+SpringBoot的人事管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 管理员功能模块2.2 普通员工功能模块2.3 答辩文案 三、系统展示四、核心代码4.1 查询职称4.2 新增留言回复4.3 工资申请4.4 工资审核4.5 员工请假 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的人…

AWS云用户创建

问题 需要给工友创建AWS云的用户&#xff0c;这里假设使用分配给自己AWS开发者IAM账号&#xff0c;给别人创建aws IAM账号。 登录系统 打开页面&#xff1a;https://xxx.signin.aws.amazon.com/console&#xff0c;使用分配的开发者账号登录。如下图&#xff1a; 创建用户…

T-Sql 也能更新修改查询JSON?

今天看见一个澳洲项目里面使用了 JSON_VALUE 这样的函数解析 JSON 我倍感诧异&#xff0c;我印象当中Sql Server并不支持JOSN的相关操作&#xff0c;他最多只把JSON当成一个字符串来存储&#xff0c;更不要说去解析&#xff0c;查询和更新了 我随后查询了下此函数&#xff0c;…

开放平台技术架构设计与实现的实战总结

开放平台是企业向外部开发者提供API接口和服务的平台&#xff0c;促进生态系统的建设和业务拓展。本文将介绍开放平台技术架构的设计原则和实现方法&#xff0c;帮助读者了解如何构建一个稳健、安全且易于扩展的开放平台。 1. 什么是开放平台&#xff1f; - 解释了开放平台…

【深度学习】Softmax实现手写数字识别

实训1&#xff1a;Softmax实现手写数字识别 相关知识点: numpy科学计算包&#xff0c;如向量化操作&#xff0c;广播机制等 1 任务目标 1.1 简介 本次案例中&#xff0c;你需要用python实现Softmax回归方法&#xff0c;用于MNIST手写数字数据集分类任务。你需要完成前向计算…

【开源】SpringBoot框架开发厦门旅游电子商务预订系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 景点类型模块2.2 景点档案模块2.3 酒店管理模块2.4 美食管理模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 学生表3.2.2 学生表3.2.3 学生表3.2.4 学生表 四、系统展示五、核心代码5.1 新增景点类型5.2 查询推荐的…

HiveSQL——连续增长问题

注&#xff1a;参考文章&#xff1a; SQL连续增长问题--HQL面试题35_sql判断一个列是否连续增长-CSDN博客文章浏览阅读2.6k次&#xff0c;点赞6次&#xff0c;收藏30次。目录0 需求分析1 数据准备3 小结0 需求分析假设我们有一张订单表shop_order shop_id,order_id,order_time…

飞天使-k8s知识点15-kubernetes散装知识点4-CNI网络插件与kubectl

文章目录 CNI 网络插件安装任意节点运行kubectlAPI的版本区别与废弃API查询 CNI 网络插件安装 这里将以 Calico 为例&#xff0c;提供在 Kubernetes 1.20.6 版本上安装 CNI 插件的步骤。请注意&#xff0c;具体的步骤可能会因 CNI 插件的类型和你的特定环境而略有不同。设置 Ku…

Linux中孤儿/僵尸进程/wait/waitpid函数

孤儿进程&#xff1a; 概念&#xff1a;若子进程的父进程已经死掉&#xff0c;而子进程还存活着&#xff0c;这个进程就成了孤儿进程。 为了保证每个进程都有一个父进程&#xff0c;孤儿进程会被init进程领养&#xff0c;init进程成为了孤儿进程的养父进程&#xff0c;当孤儿…

Nginx 配置 SSL证书

成功配置SSL证书后&#xff0c;您将能够通过HTTPS加密通道安全访问Nginx服务器。 一、准备材料 SSL证书绑定的域名已完成DNS解析&#xff0c;即您的域名与主机IP地址相互映射。您可以通过DNS验证证书工具&#xff0c;检测域名DNS解析是否生效。具体操作&#xff1a; 【1】登录…

熵权法Python代码实现

文章目录 前言代码数据熵权法代码结果 前言 熵权法做实证的好像很爱用&#xff0c;matlab的已经实现过了&#xff0c;但是matlab太大了早就删了&#xff0c;所以搞一搞python实现的&#xff0c;操作空间还比较大 代码 数据 import pandas as pd data [[100,90,100,84,90,1…