当前位置: 首页 > news >正文

基于ZooKeeper搭建Hadoop高可用集群

ZooKeeper搭建Hadoop高可用集群

在之前安装的Hadoop3.3.6集群中HDFS NameNode 和 YARN ResourceManager 都是单节点,集群不具有高可用性。

HDFS 高可用架构

在这里插入图片描述
HDFS 高可用架构主要组件:

Active NameNode 和 Standby NameNode: 两台 NameNode 形成互备,一台处于 Active 状态,为主 NameNode,另外一台处于 Standby 状态,为备 NameNode,只有主 NameNode 才能对外提供读写服务。

主备切换控制器 ZKFailoverController:ZKFailoverController 作为独立的进程运行,对 NameNode 的主备切换进行总体控制。ZKFailoverController 能及时检测到 NameNode 的健康状况,在主 NameNode 故障时借助 Zookeeper 实现自动的主备选举和切换,当然 NameNode 目前也支持不依赖于 Zookeeper 的手动主备切换。

Zookeeper 集群:为主备切换控制器提供主备选举支持。

共享存储系统:共享存储系统是实现 NameNode 的高可用最为关键的部分,共享存储系统保存了 NameNode 在运行过程中所产生的 HDFS 的元数据。主 NameNode 和 NameNode 通过共享存储系统实现元数据同步。在进行主备切换的时候,新的主 NameNode 在确认元数据完全同步之后才能继续对外提供服务。

DataNode 节点:除了通过共享存储系统共享 HDFS 的元数据信息之外,主 NameNode 和备 NameNode 还需要共享 HDFS 的数据块和 DataNode 之间的映射关系。DataNode 会同时向主 NameNode 和备 NameNode 上报数据块的位置信息。

基于 QJM 的共享存储系统的数据同步机制

在这里插入图片描述

Active NameNode 首先把 EditLog 提交到 JournalNode 集群,然后 Standby NameNode 再从 JournalNode 集群定时同步 EditLog,当 Active NameNode 宕机后, Standby NameNode 在确认元数据完全同步之后就可以对外提供服务。

需要说明的是向 JournalNode 集群写入 EditLog 是遵循 “过半写入则成功” 的策略,所以你至少要有 3 个 JournalNode 节点,当然你也可以继续增加节点数量,但是应该保证节点总数是奇数。同时如果有 2N+1 台 JournalNode,那么根据过半写的原则,最多可以容忍有 N JournalNode 节点挂掉。

NameNode 主备切换

NameNode 实现主备切换的流程下图所示:
在这里插入图片描述

  1. HealthMonitor 初始化完成之后会启动内部的线程来定时调用对应 NameNodeHAServiceProtocol RPC 接口的方法,对 NameNode 的健康状态进行检测。

  2. HealthMonitor 如果检测到 NameNode 的健康状态发生变化,会回调 ZKFailoverController 注册的相应方法进行处理。

  3. 如果 ZKFailoverController 判断需要进行主备切换,会首先使用 ActiveStandbyElector 来进行自动的主备选举。

  4. ActiveStandbyElector 与 Zookeeper 进行交互完成自动的主备选举。

  5. ActiveStandbyElector 在主备选举完成后,会回调ZKFailoverController 的相应方法来通知当前的 NameNode 成为主 NameNode 或备 NameNode。

  6. ZKFailoverController 调用对应 NameNode 的 HAServiceProtocol RPC 接口的方法将 NameNode 转换为 Active 状态或 Standby 状态。

YARN高可用

YARN ResourceManager 的高可用与 HDFS NameNode 的高可用类似,但是 ResourceManager 不像 NameNode ,没有那么多的元数据信息需要维护,所以它的状态信息可以直接写到 Zookeeper 上,并依赖 Zookeeper 来进行主备选举。
在这里插入图片描述

高可用集群搭建

集群准备

按照高可用的设计目标:需要保证至少有两个 NameNode (一主一备)两个 ResourceManager (一主一备) ,同时为满足“过半写入则成功”的原则,需要至少要有 3 个 JournalNode 节点。这里使用三台
主机进行搭建。

所有服务器都安装有 JDK,linux JDK安装

搭建好 ZooKeeper 集群(hadoop版本为3.3.6建议zookeeper版本3.6.3), ZooKeeper3.6.3 集群搭建

1、关闭网络防火墙

# 查看网络防火墙状态
sudo systemctl status firewalld
# 立即停止 firewalld
sudo systemctl stop firewalld
# 防止重启后再次启动,可以禁用防火墙服务
sudo systemctl disable firewalld

2、配置三台机器的节点映射

设置IP映射,在/etc/hosts添加如下内容(每个节点都需修改,)

sudo vi /etc/hosts
192.168.10.100 hadoop100 hadoop100.centos.com 
192.168.10.101 hadoop101 hadoop101.centos.com
192.168.10.102 hadoop102 hadoop102.centos.com

编译生效

source /etc/profile

一、安装java 1.8JDK

java 1.8JDK安装
(每个节点都需要安装,安装的版本和目录保持一致)

二、配置节点间免密登录

1 生成密匙

在每台主机上使用 ssh-keygen 命令生成公钥私钥对:

ssh-keygen

连按三次
在这里插入图片描述

2 免密登录

将 hadoop001 的公钥写到本机和远程机器的 ~/ .ssh/authorized_key 文件中:

ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop100 依次输入yes,root用户的密码
ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop101
ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop102

3 验证免密登录

依次输入,可成功跳转后exit回到hadoop100

ssh hadoop100
exit;
ssh hadoop101
exit;
ssh hadoop102
exit;

4、报错处理

Permission denied (publickey,gssapi-keyex,gssapi-with-mic).

修改SSH 配置允许公钥认证


vi /etc/ssh/sshd_config
#将PasswordAuthentication设置成为yes(一般在文件的末尾几行):
PermitRootLogin yes
PubkeyAuthentication yes
PasswordAuthentication yes#vi中使用查找功能快速定位
#进入普通模式(如果您已经在插入模式中),按 Esc 键。
#输入 / 后跟您想要搜索的词或短语。
#按 Enter 键进行搜索。
#n 键:移动到下一个匹配项。
#N 键:移动到上一个匹配项。
#例如,要搜索单词 "PermitRootLogin ",您将输入:/PermitRootLogin #修改完成后重启ssh服务
systemctl restart sshd.service
# 查看ssh服务状态
sudo systemctl status sshd

三、 Hadoop安装

1、下载hadoop

hadoop3.3.6官方下载

2、解压缩hadoop-3.3.6.tar.gz 文件

tar -zxvf /opt/soft/hadoop-3.3.6.tar.gz -C /opt/app-z:使用 gzip 解压缩算法。这是用来解压 .gz 结尾的文件的
-x:提取归档文件的内容
-f:指定要处理的归档文件的名称,后面跟着文件名 hadoop-3.3.6.tar.gz
-C:指定解压后的文件应放置在哪个目录下。在这里,目录是 /opt/app

解压后即可,看到/opt/app/hadoop-3.3.6文件夹

3、配置Hadoop环境变量

vim /etc/profile.d/my_env.sh配置JAVA和Hadoop环境变量(每台机器都需要配置

vim /etc/profile.d/my_env.sh
export JAVA_HOME=/usr/java/jdk1.8.0_281-amd64
export HADOOP_HOME=/opt/app/hadoop-3.3.6
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

修改后执行【source /etc/profile】命令使其生效

4、配置Hadoop的配置文件

# 进入修改目录
cd /opt/app/hadoop-3.3.6/etc/hadoop/

** (1)、修改 hadoop-env.sh**

export JAVA_HOME=/usr/java/jdk1.8.0_431

** (2)、修改配置文件yarn-env.sh 在文件末尾加上**

export JAVA_HOME=/usr/java/jdk1.8.0_431

(3) 修改配置文件 workers
指定dataNode工作节点。

#删除原有 localhost,添加如下内容
#【不能有空格和空行】
hadoop100
hadoop101
hadoop102

注: 修改下面文件中存在,配置放入其中,且只保留一组的

(4) 修改配置文件core-site.xml

<configuration>
<!-- 设置默认使用的文件系统 Hadoop支持file、HDFS、GFS、ali|Amazon云等文件系统 --><property><name>fs.defaultFS</name>  <value>hdfs://hadoop100:8020</value>  </property>  
<!-- 指定Hadoop的临时文件的本地存放路径 --><property><name>hadoop.tmp.dir</name><value>/var/log/hadoop/tmp</value></property><property><!-- ZooKeeper 集群的地址 --><name>ha.zookeeper.quorum</name><value>hadoop101:2181,hadoop101:2182,hadoop101:2183</value></property><property><!-- ZKFC 连接到 ZooKeeper 超时时长 --><name>ha.zookeeper.session-timeout.ms</name><value>10000</value></property><!-- 设置HDFS web UI用户身份 --><property><name>hadoop.http.staticuser.user</name><value>root</value></property>
<!-- 配置该root(superUser)允许通过代理访问的主机节点 --><property><name>hadoop.proxyuser.root.hosts</name><value>*</value></property>
<!-- 配置该root(superUser)允许通过代理用户所属组 --><property><name>hadoop.proxyuser.root.groups</name><value>*</value></property>
<!-- 配置该root(superUser)允许通过代理的用户--><property><name>hadoop.proxyuser.root.groups</name><value>*</value></property>
</configuration>

(5) 修改配置文件hdfs-site.xml

<configuration>
<!-- 指定HDFS的数据分块的备份数量 --><property><name>dfs.replication</name><value>3</value></property><!-- 指定HDFS的主节点的元数据文件的本地存放路径 --><property><name>dfs.namenode.name.dir</name><value>/opt/app/hadoop-3.3.6/name</value></property>
<!-- 指定HDFS的数据节点的数据文件的本地存放路径 --><property><name>dfs.datanode.data.dir</name><value>/opt/app/hadoop-3.3.6/data</value></property>
<property><!-- 集群服务的逻辑名称 --><name>dfs.nameservices</name><value>mycluster</value></property><property><!-- NameNode ID 列表--><name>dfs.ha.namenodes.mycluster</name><value>nn1,nn2</value></property><property><!-- nn1 的 RPC 通信地址 --><name>dfs.namenode.rpc-address.mycluster.nn1</name><value>hadoop100:8020</value></property><property><!-- nn2 的 RPC 通信地址 --><name>dfs.namenode.rpc-address.mycluster.nn2</name><value>hadoop101:8020</value></property><property><!-- nn1 的 http 通信地址 --><name>dfs.namenode.http-address.mycluster.nn1</name><value>hadoop100:50070</value></property><property><!-- nn2 的 http 通信地址 --><name>dfs.namenode.http-address.mycluster.nn2</name><value>hadoop101:50070</value></property><property><!-- NameNode 元数据在 JournalNode 上的共享存储目录 --><name>dfs.namenode.shared.edits.dir</name><value>qjournal://hadoop100:8485;hadoop101:8485;hadoop102:8485/mycluster</value></property><property><!-- Journal Edit Files 的存储目录 --><name>dfs.journalnode.edits.dir</name><value>/home/hadoop/journalnode/data</value></property><property><!-- 配置隔离机制,确保在任何给定时间只有一个 NameNode 处于活动状态 --><name>dfs.ha.fencing.methods</name><value>sshfence</value></property><property><!-- 使用 sshfence 机制时需要 ssh 免密登录 --><name>dfs.ha.fencing.ssh.private-key-files</name><value>/root/.ssh/id_rsa</value></property><property><!-- SSH 超时时间 --><name>dfs.ha.fencing.ssh.connect-timeout</name><value>30000</value></property><property><!-- 访问代理类,用于确定当前处于 Active 状态的 NameNode --><name>dfs.client.failover.proxy.provider.mycluster</name><value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value></property><property><!-- 开启故障自动转移 --><name>dfs.ha.automatic-failover.enabled</name><value>true</value></property>
</configuration>

(6) 修改配置文件yarn-site.xml

<configuration><property><!--配置 NodeManager 上运行的附属服务。需要配置成 mapreduce_shuffle 后才可以在 
Yarn 上运行 MapReduce 程序。--><name>yarn.nodemanager.aux-services</name><value>mapreduce_shuffle</value></property><property><!-- 是否启用日志聚合 (可选) --><name>yarn.log-aggregation-enable</name><value>true</value></property><property><!-- 聚合日志的保存时间 (可选) --><name>yarn.log-aggregation.retain-seconds</name><value>86400</value></property><property><!-- 启用 RM HA --><name>yarn.resourcemanager.ha.enabled</name><value>true</value></property><property><!-- RM 集群标识 --><name>yarn.resourcemanager.cluster-id</name><value>my-yarn-cluster</value></property><property><!-- RM 的逻辑 ID 列表 --><name>yarn.resourcemanager.ha.rm-ids</name><value>rm1,rm2</value></property><property><!-- RM1 的服务地址 --><name>yarn.resourcemanager.hostname.rm1</name><value>hadoop100</value></property><property><!-- RM2 的服务地址 --><name>yarn.resourcemanager.hostname.rm2</name><value>hadoop101</value></property><property><!-- RM1 Web 应用程序的地址 --><name>yarn.resourcemanager.webapp.address.rm1</name><value>hadoop100:8088</value></property><property><!-- RM2 Web 应用程序的地址 --><name>yarn.resourcemanager.webapp.address.rm2</name><value>hadoop101:8088</value></property><property><!-- ZooKeeper 集群的地址 --><name>yarn.resourcemanager.zk-address</name><value>hadoop101:2181,hadoop101:2182,hadoop101:2183</value></property><property><!-- 启用自动恢复 --><name>yarn.resourcemanager.recovery.enabled</name><value>true</value></property><property><!-- 用于进行持久化存储的类 --><name>yarn.resourcemanager.store.class</name>     <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value></property><property><name>yarn.resourcemanager.zk-state-store.parent-path</name><value>/rmstore</value>
</property>
</configuration>

(7) 修改配置文件mapred-site.xml

<configuration>
<!-- 指定MapReduce所使用的外部管理框架,这里使用Hadoop 3.3.6自带的YARN资源管理器 --><property><name>mapreduce.framework.name</name><value>yarn</value></property></configuration>

5、修改hadoop启动命令

# 进入到启动命令所在位置hadoop安装路径下的sbin目录下
cd /opt/app/hadoop-3.3.6/sbin

修改start-dfs.sh,stop-dfs.sh,在文件顶部添加

HDFS_ZKFC_USER=root
HDFS_JOURNALNODE_USER=root
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root
HDFS_DATANODE_USER=root
HDFS_DATANODE_SECURE_USER=root
#HADOOP_SECURE_DN_USER=root

修改 start-yarn.sh,stop-yarn.sh,在文件顶部添加

YARN_RESOURCEMANAGER_USER=root
HADOOP_SECURE_DN_USER=yarn
YARN_NODEMANAGER_USER=root

6 、分发程序

拷贝 Hadoop 安装文件到集群节点

scp -qr /opt/app/hadoop-3.3.6 hadoop101:/opt/app
scp -r /opt/app/hadoop-3.3.6 hadoop102:/opt/app

7、 初始化

1 启动ZooKeeper
分别到服务器上启动 ZooKeeper 服务:

zkServer.sh start

在这里插入图片描述

2 启动Journalnode
分别到三台服务器的的 ${HADOOP_HOME}/sbin 目录下,启动 journalnode 进程:

hadoop-daemon.sh start journalnode

3 初始化NameNode

在 hadop100 上执行 NameNode 初始化命令:

hdfs namenode -format

执行初始化命令后,需要将 NameNode 元数据目录的内容,复制到其他未格式化的 NameNode 上。
元数据存储目录就是我们在 hdfs-site.xml 中使用 dfs.namenode.name.dir 属性指定的目录。这里我们需要将其复制到 hadoop101 上:

scp -r /opt/app/hadoop-3.3.6/name hadoop101:/opt/app/hadoop-3.3.6/

4 初始化HA状态
在任意一台 NameNode 上使用以下命令来初始化 ZooKeeper 中的 HA 状态:

hdfs zkfc -formatZK

5 启动HDFS
进入到 hadoop100 的 ${HADOOP_HOME}/sbin 目录下,启动 HDFS。此时 hadoop100 和 hadoop101 上的 NameNode 服务,和三台服务器上的 DataNode 服务都会被启动:

start-dfs.sh

6 启动YARN
进入到 hadoop100 的 ${HADOOP_HOME}/sbin 目录下,启动 YARN。此时 hadoop101 上的 ResourceManager 服务,和两台服务器上的 NodeManager 服务都会被启动:

start-yarn.sh

启动报错
查看日志
进入 /opt/app/hadoop-3.3.6/logs 目录,查看对应组件的启动日志
在这里插入图片描述

8、查看集群

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可以看到每台机器上启动的应用和我们的配置文件地址是对应的

查看Web UI

webui地址 (http://hadoop100:50070/)

在这里插入图片描述
在这里插入图片描述
yarn地址 http://hadoop101:8088/
在这里插入图片描述

集群的二次启动
集群初次启动涉及到一些必要初始化操作,所以过程略显繁琐。但是集群一旦搭建好后,想要再次启用它是比较方便的,步骤如下(首选需要确保 ZooKeeper 集群已经启动):

先停止服务

stop-dfs.sh
stop-yarn.sh

使用jps查看,确保服务全部关闭

在 hadoop100 启动 HDFS,此时会启动所有与 HDFS 高可用相关的服务,包括 NameNode,DataNode 和 JournalNode

start-dfs.sh

然后再启动 YARN

start-yarn.sh

相关文章:

基于ZooKeeper搭建Hadoop高可用集群

ZooKeeper搭建Hadoop高可用集群 在之前安装的Hadoop3.3.6集群中HDFS NameNode 和 YARN ResourceManager 都是单节点&#xff0c;集群不具有高可用性。 HDFS 高可用架构 HDFS 高可用架构主要组件&#xff1a; Active NameNode 和 Standby NameNode&#xff1a; 两台 NameNode…...

力扣88题:合并两个有序数组

力扣88题&#xff1a;合并两个有序数组 题目描述 给定两个按非递减顺序排列的整数数组 nums1 和 nums2&#xff0c;以及它们的长度 m 和 n&#xff0c;要求将 nums2 合并到 nums1&#xff0c;使得合并后的数组仍按非递减顺序排列。 输入与输出 示例 1&#xff1a; 输入&am…...

python 笔记之线程同步和死锁

同步&#xff1a; 共享数据&#xff1a; 如果多个线程共同对某个数据修改&#xff0c;则可能出现不可预测的结果&#xff0c;为了保证数据的正确性&#xff0c;需要对多个数据进行同步 同步&#xff1a;一个一个的完成&#xff0c;一个做完另一个才能进来 效率会降低 使用Thre…...

SpringBoot小知识(4):高级配置知识与bean的绑定

一、EnableConfigurationProperties ConfigurationProperties注解在我们之前讲过&#xff0c;他是从配置中读取参数封装给实体类的一个注解。 那么EnableConfigurationProperties是个啥呢&#xff1f; EnableConfigurationProperties 是 Spring Framework 中用于启用基于配置文…...

Python毕业设计选题:基于大数据的淘宝电子产品数据分析的设计与实现-django+spark+spider

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 管理员登录 管理员功能界面 电子产品管理 系统管理 数据可视化分析看板展示 摘要 本…...

Lua面向对象实现

Lua中的面向对象是通过表&#xff08;table&#xff09;来模拟类实现的&#xff0c;通过setmetatable(table,metatable)方法&#xff0c;将一个表设置为当前表的元表&#xff0c;之后在调用当前表没有的方法或者键时&#xff0c;会再查询元表中的方法和键&#xff0c;以此来实现…...

OpenCV的圆形检测‌HoughCircles

HoughCircles 函数是 OpenCV 库中用于在灰度图像中检测圆的函数,它基于霍夫变换(Hough Transform)的一种变体——梯度霍夫变换(HOUGH_GRADIENT)函数原型如下: void HoughCircles( InputArray image, OutputArray circles,int method, double dp, double minDist,double …...

iOS视图控制器的生命周期及各阶段的作用

iOS视图控制器&#xff08;UIViewController&#xff09;的生命周期是指从它被创建到最终被销毁的过程中所经历的一系列阶段。每个阶段都有其特定的作用和执行时机&#xff0c;这些阶段和作用对于开发高效、稳定的iOS应用至关重要。以下是iOS视图控制器的生命周期及其各个阶段的…...

四轮阿克曼(前轮转向、后轮驱动)车子仿真控制

目录 写在前面的话调用 libgazebo_ros_ackermann_drive.so 插件属性介绍补充 steering_wheel_joint 配置键盘控制命令 结果演示 写在前面的话 这里增加一个四轮阿克曼&#xff08;前轮转向、后轮驱动&#xff09;车子仿真控制的版本&#xff0c;使用的事gazebo的插件 参考资料…...

Blender均匀放缩模型

解决办法&#xff1a; 首先选中模型&#xff0c;按下“s”键&#xff0c;如下图所示&#xff0c;此时模型根据鼠标的移动放缩 或者在按下“s”后输入数值&#xff0c;再按回车键Enter&#xff0c;模型会根据你该数值进行均匀放缩 指定放大2倍结果——...

Python基于 Opencv+wxPython 的人脸识别上课考勤系统,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…...

【AI工具】强大的AI编辑器Cursor详细使用教程

目录 一、下载安装与注册 二、内置模型与配置 三、常用快捷键 四、项目开发与问答 五、注意事项与技巧 参考资料 近日&#xff0c;由四名麻省理工学院&#xff08;MIT&#xff09;本科生共同创立的Anysphere公司宣布&#xff0c;其开发的AI代码编辑器Cursor在成立短短两年…...

DApp开发与APP开发的五大区别

随着比特币与区块链技术的不断发展&#xff0c;DApp应用会逐渐成为主流。与APPAPP相比&#xff0c;DApp有许多不同之处&#xff0c;尤其是在架构、数据存储、用户隐私等方面。本文将通过五大关键点&#xff0c;深入探讨DApp开发与APP开发之间的主要区别。 1. 后端架构&#xff…...

哪款云手机适合多开?常用云手机功能对比

在全球化和数字化时代&#xff0c;云手机以其独特的灵活性和高效性&#xff0c;成为多账号运营和数字营销的热门工具。云手机能够解决传统设备管理的诸多痛点&#xff0c;例如账号关联、硬件成本高等问题。本文将为您推荐多款优质云手机品牌&#xff0c;帮助您选择最适合的工具…...

Python几种常用数据结构(重制版)

一、列表 [List] 定义&#xff1a;有序可重复的数据集合。示例&#xff1a;my_list [element1, element2, element3]增加元素方法&#xff1a; append()&#xff1a;在列表末尾增加单个元素&#xff08;列表特有方法&#xff09;&#xff0c;例如 my_list.append(element)。e…...

C++ 游戏开发:开启游戏世界的编程之旅(2)

三、游戏输入处理 &#xff08;一&#xff09;键盘输入处理 在游戏中&#xff0c;玩家通过键盘输入来控制角色的行动。我们需要在游戏循环中不断检测键盘事件&#xff0c;并根据不同的按键按下或松开状态来执行相应的操作。例如&#xff0c;在 SDL 中&#xff0c;可以这样处理…...

用 Python 做数据分析需要掌握哪些基础?

用 Python 做数据分析&#xff0c;需要掌握以下几个基础方面&#xff1a; 1. Python 编程基础 语法基础&#xff1a;变量、数据类型&#xff08;如字符串、整数、浮点数、布尔值&#xff09;、条件语句&#xff08;if-else&#xff09;、循环&#xff08;for、while&#xff0…...

UE5 像素流进行内网https证书创建

确定证书需求 内网 HTTPS 通信通常需要以下内容&#xff1a; 自签名证书&#xff08;适用于内网环境&#xff0c;不需要通过公开的证书颁发机构 CA&#xff09; 或者通过内部的企业 CA 签发的证书&#xff08;更安全&#xff09;。 生成自签名证书 使用工具&#xff08;如 Ope…...

Envoy-istio

最近研究envoy-istio&#xff0c;发现这个博客&#xff0c;觉得很不错&#xff0c;这里记录一下 envoy-istio介绍 envoy-istio - 随笔分类 - yaowx - 博客园 envoy部分七&#xff1a;envoy的http流量管理基础 envoy部分六&#xff1a;envoy的集群管理 envoy部分五&#xff…...

CTF-PWN: WEB_and_PWN [第一届“吾杯”网络安全技能大赛 Calculator] 赛后学习(不会)

附件 calculate.html <!DOCTYPE html> <html lang"en"> <head><!-- 设置字符编码为 UTF-8&#xff0c;支持多语言字符集 --><meta charset"UTF-8"><!-- 设置响应式视图&#xff0c;确保页面在不同设备上自适应显示 --&…...

【数据结构与算法】排序算法(上)——插入排序与选择排序

文章目录 一、常见的排序算法二、插入排序2.1、直接插入排序2.2、希尔排序( 缩小增量排序 ) 三、选择排序3.1、直接选择排序3.2、堆排序3.2.1、堆排序的代码实现 一、常见的排序算法 常见排序算法中有四大排序算法&#xff0c;第一是插入排序&#xff0c;二是选择排序&#xff…...

Linux操作系统性能优化

Linux操作系统性能优化 1. TCP连接出现大量ESTABLISHED连接解决方法 1. TCP连接出现大量ESTABLISHED连接解决方法 TCP协议规定&#xff0c;对于已经建立的连接&#xff0c;网络双方要进行四次握手才能成功断开连接&#xff0c;如果缺少了其中某个步骤&#xff0c;将会使连接处于…...

iOS与Windows间传文件

想用数据线从 windows 手提电脑传文件入 iPhone&#xff0c;有点迂回。 参考 [1]&#xff0c;要在 windows 装 Apple Devices。装完、打开、插线之后会检测到手机&#xff0c;界面&#xff1a; 点左侧栏「文件」&#xff0c;不是就直接可以传&#xff0c;而是要通过某个应用传…...

在数据库设计中同步冗余字段的思考与实践

目录 前言1. 冗余字段设计的背景与场景1.1 场景描述1.2 冗余字段的必要性 2. 冗余字段设计的优点2.1 提高查询效率2.2 简化应用逻辑 3. 冗余字段设计的缺点与挑战3.1 数据不一致问题3.2 更新开销增加3.3 数据冗余占用存储空间 4. 如何同步更新冗余字段4.1 手动更新方式4.2 使用…...

Qt 带数据库功能的项目部署之后,数据库无法打开问题解决方法

前言&#xff1a;最近项目添加了sqlite数据库功能&#xff0c;在qtcreator直接运行时&#xff0c;打开数据库正常&#xff0c;但是部署之后&#xff0c;发现数据库打开会失败&#xff0c;提示“driver not loaded”错误&#xff0c;后来发现是因为sqldrivers文件夹目录不对导致…...

汇编语言学习-二

好吧&#xff0c;已经隔了两天&#xff0c;下完班看了两天&#xff0c;在电脑上装了虚拟机版的MS_DOS,主要是怕折腾坏我的电脑系统&#xff1b; 这个第二天应该是称为第二章更为合适&#xff0c;目前第二章已经看完&#xff0c;基本的命令也是敲了敲&#xff1b; 下面就进行一…...

【嘟嘟早教卡】 小程序源码分享带后台管理

【嘟嘟早教卡】是专门为 3-6 岁婴幼儿童学习普通话、英语研发的早教启蒙认知识字的小程序 小程序由 Taro 及 Tailwind CSS 构建而成&#xff0c;后台管理使用 Laravel 及 Tailwind CSS 想法源于小时候玩的认知卡片&#xff0c;基本大部分家庭都买过认知卡片&#xff0c;我按照…...

JavaEE-经典多线程样例

文章目录 单例模式设计模式初步引入为何存在单例模式饿汉式单例模式饿汉式缺陷以及是否线程安全懒汉式单例模式基础懒汉式缺陷以及是否线程安全懒汉式单例模式的改进完整代码(变量volatile) 阻塞队列生产者消费者模型生产者消费者模型的案例以及优点请求与响应案例解耦合削峰填…...

从 HTML 到 CSS:开启网页样式之旅(五)—— CSS盒子模型

从 HTML 到 CSS&#xff1a;开启网页样式之旅&#xff08;五&#xff09;—— CSS盒子模型 前言一、盒子模型的组成margin&#xff08;外边距&#xff09;&#xff1a;border&#xff08;边框&#xff09;&#xff1a;padding&#xff08;内边距&#xff09;&#xff1a;conten…...

数据分析(一): 掌握STDF 掌握金钥匙-码农切入半导体的捷径

中国的半导体行业必然崛起&#xff01;看清这个大势&#xff0c;就会有很多机会。 今天&#xff0c;我们一起来了解一下半导体行业的一朵金花&#xff1a;STDF。 实际上这只是一种文件格式&#xff0c;但是当你熟练掌握解析这种文件的时候&#xff0c;你就已经打开在这个基础…...