HDFS HA 高可用集群搭建详细图文教程

目录

一、高可用(HA)的背景知识

1.1 单点故障

1.2 如何解决单点故障 

1.2.1 主备集群 

1.2.2  Active、Standby

1.2.3 高可用

1.2.4 集群可用性评判标准(x 个 9)

1.3 HA 系统设计核心问题 

1.3.1 脑裂问题 

1.3.2 数据状态同步问题

二、NAMENODE 单点故障问题 

2.1 概述 

2.2 解决 

三、HDFS HA 解决方案--QJM

3.1 QJM—主备切换、脑裂问题解决

3.1.1 ZKFailoverController(zkfc)

3.1.2 Fencing(隔离)机制 

3.2 主备数据状态同步问题解决 

四、HDFS HA 集群搭建 

4.1 HA 集群规划 

4.2 集群基础环境准备 

4.3 修改 Hadoop 配置文件 

4.3.1 hadoop-env.sh

4.3.2 core-site.xml

4.3.3 hdfs-site.xml 

4.4 集群同步安装包

4.5 HA 集群初始化 

4.6 HA 集群启动 

五、HDFS HA 集群演示 

5.1 Web 页面查看两个 NameNode 状态 

5.2 HA 集群下正常操作

5.3 模拟故障出现 

5.3.1 HA 自动切换失败--错误解决


一、高可用(HA)的背景知识

1.1 单点故障

        单点故障(英语:single point of failure,缩写 SPOF)是指系统中某一点一旦失效,就会让整个系统无法运作,换句话说,单点故障即会整体故障。

1.2 如何解决单点故障 

1.2.1 主备集群 

        解决单点故障,实现系统服务高可用的核心并不是让故障永不发生,而是让故障的发生对业务的影响降到最小。因为软硬件故障是难以避免的问题。

        当下企业中成熟的做法就是给单点故障设置备份,形成主备架构。通俗描述就是当主挂掉,备份顶上,短暂的中断之后继续提供服务。

        常见的是一主一备架构,当然也可以一主多备。备份越多,容错能力越强,与此同时,冗余也越大,浪费资源。

1.2.2  Active、Standby

  • Active:主角色。活跃的角色,代表正在对外提供服务的角色服务。任意时间有且只有一个 active 对外提供服务。
  • Standby:备份角色。需要和主角色保持数据、状态同步,并且时刻准备切换成主角色(当主角色挂掉或者出现故障时),对外提供服务,保持服务的可用性。

1.2.3 高可用

        高可用性(英语:high availability,缩写为 HA),IT术语,指系统无中断地执行其功能的能力,代表系统的可用性程度。是进行系统设计时的准则之一。高可用性系统意味着系统服务可以更长时间运行,通常通过提高系统的容错能力来实现。

        高可用性或者高可靠度的系统不会希望有单点故障造成整体故障的情形。一般可以通过冗余的方式增加多个相同机能的部件,只要这些部件没有同时失效,系统(或至少部分系统)仍可运作,这会让可靠度提高。

1.2.4 集群可用性评判标准(个 9

        在系统的高可用性里有个衡量其可靠性的标准——X 个 9,这个 是代表数字 3-5X 个 表示在系统 年时间的使用过程中,系统可以正常使用时间与总时间(年)之比

  • 39(1-99.9%)*365*24=8.76小时,表示该系统在连续运行1年时间里最多可能的业务中断时间是8.76小时。
  • 49(1-99.99%)*365*24=0.876小时=52.6分钟,表示该系统在连续运行1年时间里最多可能的业务中断时间是52.6分钟。
  • 59(1-99.999%)*365*24*60=5.26分钟,表示该系统在连续运行1年时间里最多可能的业务中断时间是5.26分钟。

可以看出,9 越多,系统的可靠性越强,能够容忍的业务中断时间越少,但是要付出的成本更高。 

1.3 HA 系统设计核心问题 

1.3.1 脑裂问题 

        脑裂(split-brain)是指“大脑分裂”,本是医学名词。在HA集群中,脑裂指的是当联系主备节点的"心跳线"断开时(即两个节点断开联系时),本来为一个整体、动作协调的 HA 系统,就分裂成为两个独立的节点。由于相互失去了联系,主备节点之间像"裂脑人"一样,使得整个集群处于混乱状态

裂的严重后果:

  1. 集群无主:都认为对方是状态好的,自己是备份角色,后果是无服务;

  2. 集群多主:都认为对方是故障的,自己是主角色。相互争抢共享资源,结果会导致系统混乱,数据损坏。此外对于客户端访问也是一头雾水,找谁呢?

避免脑裂问题的核心是:保持任意时刻系统有且只有一个主角色提供服务。

1.3.2 数据状态同步问题

        主备切换保证服务持续可用性的前提是主备节点之间的状态、数据是一致的,或者说准一致的。如果说备用的节点和主节点之间的数据差距过大,即使完成了主备切换的动作,那也是没有意义的。

        数据同步常见做法是:通过日志重演操作记录。主角色正常提供服务,发生的事务性操作通过日志记录,备用角色读取日志重演操作。

二、NAMENODE 单点故障问题 

2.1 概述 

        在 Hadoop 2.0.0 之前,NameNode 是 HDFS 集群中的单点故障(SPOF。每个群集只有一个 NameNode如果 NameNode 进程不可用,则整个 HDFS 群集不可用

NameNode 的单点故障从两个方面影响了 HDFS 群集的总可用性:

  • 如果发生意外事件(例如机器崩溃),则在重新启动 NameNode 之前,群集将不可用。
  • 计划内的维护事件,例如 NameNode 计算机上的软件或硬件升级,将导致群集停机时间的延长。

2.2 解决 

        在同一群集中运行两个(从 3.0.0 支持超过两个)冗余 NameNode形成主备架构。这样可以在机器崩溃的情况下快速故障转移到新的 NameNode,或者出于计划维护的目的由管理员发起的正常故障转移。

三、HDFS HA 解决方案--QJM

        QJM 全称 Quorum Journal Manager(仲裁日志管理器),是 Hadoop 官方推荐的 HDFS HA 解决方案之一。

        使用 zookeeper 中 ZKFC 来实现主备切换;使用 Journal NodeJN)集群实现 edits log 的共享以达到数据同步的目的。

3.1 QJM—主备切换、脑裂问题解决

3.1.1 ZKFailoverControllerzkfc

        Apache ZooKeeper 是一款高可用分布式协调服务软件,用于维护少量的协调数据。Zookeeper 的下列特性功能参与了 HDFS 的 HA 解决方案中

  • 临时 znode

        如果一个 znode 节点是临时的,那么该 znode 的生命周期将和创建它的客户端的 session 绑定。客户端断开连接 session 结束,znode 将会被自动删除。

  • Path路径唯一性

        zookeeper 中维持了一份类似目录树的数据结构。每个节点称之为 Znode。Znode 具有唯一性,不会重名。也可以理解为排他性。

  • 监听机制

        客户端可以针对 znode 上发生的事件设置监听,当事件发生触发条件,zk 服务会把事件通知给设置监听的客户端。

        ZKFailoverController(ZKFC)是一个新组件,它是一个 ZooKeeper 客户端。运行 NameNode 的每台计算机也都运行 ZKFC,ZKFC 的主要职责: 

  • 监视和管理 NameNode 健康状态

ZKFC通过命令监视的 NameNode 节点及机器的健康状态

  • 维持和 ZK 集群联系

        如果本地 NameNode 运行状况良好,并且 ZKFC 看到当前没有其他节点持有锁 znode,它将自己尝试获取该锁。如果成功,则表明它赢得了选举,并负责运行故障转移以使其本地NameNode 处于 Active 状态。如果已经有其他节点持有锁,zkfc 选举失败,则会对该节点注册监听,等待下次继续选举。

3.1.2 Fencing(隔离)机制 

        故障转移过程也就是俗称的主备角色切换的过程,切换过程中最怕的就是脑裂的发生因此需要 Fencing 机制来避免,将先前的 Active 节点隔离,然后将 Standby 转换为 Active 状态。

Hadoop 公共库中对外提供了两种 Fenching 实现,分别是 sshfence 和 shellfence(缺省实现)。

  • sshfence 是指通过 ssh 登陆目标节点上,使用命令 fuser 将进程杀死(通过 tcp 端口号定位进程 pid,该方法比 jps 命令更准确);

  • shellfence 是指执行一个用户事先定义的 shell 命令(脚本)完成隔离。

3.2 备数据状态同步问题解决 

        Journal Node(JN)集群是轻量级分布式系统,主要用于高速读写数据、存储数据。通常使用 2N+1 台 JournalNode 存储共享 Edits Log(编辑日志)底层类似于 zk 的分布式一致性算法。

        任何修改操作在 Active NN 上执行时,JournalNode 进程同时也会记录 edits log 至少半数以上的 JN 中,这时 Standby NN 监测到 JN 里面的同步 log 发生变化了会读取 JN 里面的 edits  log,然后重演操作记录同步到自己的目录镜像树里面

        当发生故障 Active NN 挂掉后,Standby NN 会在它成为 Active NN 前,读取所有的 JN 里面的修改日志,这样就能高可靠的保证与挂掉的 NN 的目录镜像树一致,然后无缝的接替它的职责,维护来自客户端请求,从而达到一个高可用的目的。

四、HDFS HA 集群搭建 

4.1 HA 集群规划 

 IP

 机器

运行角色

192.168.170.136

hadoop01

namenode  zkfc   datanode   zookeeper   journal node

192.168.170.137

hadoop02

namenode  zkfc   datanode   zookeeper   journal node

192.168.170.138hadoop03

                 datanode   zookeeper   journal node

4.2 集群基础环境准备 

  1. 修改 Linux 主机名            /etc/hostname

  2. 修改 IP                              /etc/sysconfig/network-scripts/ifcfg-ens33

  3. 修改主机名和IP的映射关系 /etc/hosts

  4. 关闭防火墙

  5. ssh 免登陆

  6. 安装 JDK,配置环境变量等  /etc/profile

  7. 集群时间同步

  8. 配置主备 NN 之间的互相免密登录

具体步骤参考这篇文章:Hadoop 3.2.4 集群搭建详细图文教程_Stars.Sky的博客-CSDN博客 

注意:下面我会在这篇文章中搭建的 Hadoop 集群的基础上进行修改操作,只把有改动的地方写出来,其他未改动的地方则跟原来的一样。 

4.3 修改 Hadoop 配置文件 

4.3.1 hadoop-env.sh

[root@hadoop01 ~]# cd /bigdata/hadoop/server/hadoop-3.2.4/etc/hadoop/
[root@hadoop01 /bigdata/hadoop/server/hadoop-3.2.4/etc/hadoop]# vim hadoop-env.sh
# 配置JAVA_HOME
export JAVA_HOME=/usr/java/jdk1.8.0_381
# 设置用户以执行对应角色shell命令
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root
export HDFS_JOURNALNODE_USER=root
export HDFS_ZKFC_USER=root

4.3.2 core-site.xml

[root@hadoop01 /bigdata/hadoop/server/hadoop-3.2.4/etc/hadoop]# vim core-site.xml 
<configuration>
<!-- HA 集群名称,该值要和 hdfs-site.xml 中的配置保持一致 -->
<property><name>fs.defaultFS</name><value>hdfs://mycluster</value>
</property>
<!-- hadoop 本地数据存储目录 format 时自动生成 -->
<property><name>hadoop.tmp.dir</name><value>/bigdata/hadoop/data/tmp</value>
</property>
<!-- 在 Web UI 访问 HDFS 使用的用户名。-->
<property><name>hadoop.http.staticuser.user</name><value>root</value>
</property>
<!-- ZooKeeper 集群的地址和端口-->
<property><name>ha.zookeeper.quorum</name><value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
</property>
</configuration>

4.3.3 hdfs-site.xml 

[root@hadoop01 /bigdata/hadoop/server/hadoop-3.2.4/etc/hadoop]# vim hdfs-site.xml 
<configuration>
<!--指定 hdfs 的 nameservice 为 mycluster,需要和 core-site.xml 中的保持一致 -->
<property><name>dfs.nameservices</name><value>mycluster</value>
</property>
<!-- mycluster 下面有两个 NameNode,分别是 nn1,nn2 -->
<property><name>dfs.ha.namenodes.mycluster</name><value>nn1,nn2</value>
</property>
<!-- nn1 的 RPC 通信地址 -->
<property><name>dfs.namenode.rpc-address.mycluster.nn1</name><value>hadoop01:8020</value>
</property>
<!-- nn1 的 http 通信地址 -->
<property><name>dfs.namenode.http-address.mycluster.nn1</name><value>hadoop01:9870</value>
</property>
<!-- nn2 的 RPC 通信地址 -->
<property><name>dfs.namenode.rpc-address.mycluster.nn2</name><value>hadoop02:8020</value>
</property>
<!-- nn2 的 http 通信地址 -->
<property><name>dfs.namenode.http-address.mycluster.nn2</name><value>hadoop02:9870</value>
</property>
<!-- 指定 NameNode 的 edits 元数据在 JournalNode 上的存放位置 -->
<property> <name>dfs.namenode.shared.edits.dir</name><value>qjournal://hadoop01:8485;hadoop02:8485;hadoop03:8485/mycluster</value>
</property>
<!-- 指定 JournalNode 在本地磁盘存放数据的位置 -->
<property><name>dfs.journalnode.edits.dir</name><value>/bigdata/hadoop/data/journaldata</value>
</property>
<!-- 开启 NameNode 失败自动切换 -->
<property><name>dfs.ha.automatic-failover.enabled</name><value>true</value>
</property>
<!-- 指定该集群出故障时,哪个实现类负责执行故障切换 -->
<property><name>dfs.client.failover.proxy.provider.mycluster</name><value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 配置隔离机制方法-->
<property><name>dfs.ha.fencing.methods</name><value>sshfence</value>
</property>
<!-- 使用 sshfence 隔离机制时需要 ssh 免登陆 -->
<property><name>dfs.ha.fencing.ssh.private-key-files</name><value>/root/.ssh/id_rsa</value>
</property>
<!-- 配置 sshfence 隔离机制超时时间 -->
<property><name>dfs.ha.fencing.ssh.connect-timeout</name><value>30000</value>
</property>
<!-- 开启短路本地读取功能 -->
<property><name>dfs.client.read.shortcircuit</name><value>true</value>
</property>
<!-- 需手动创建目录 mkdir -p /var/lib/hadoop-hdfs -->
<property><name>dfs.domain.socket.path</name><value>/var/lib/hadoop-hdfs/dn_socket</value>
</property>
<!-- 开启黑名单 -->
<property><name>dfs.hosts.exclude</name><value>/bigdata/hadoop/server/hadoop-3.2.4/etc/hadoop/excludes</value>
</property>
</configuration>

4.4 集群同步安装包

[root@hadoop01 /bigdata/hadoop/server/hadoop-3.2.4/etc/hadoop]# scp -r hadoop-env.sh root@hadoop02:$PWD
hadoop-env.sh                                                                                                         100%   16KB   6.9MB/s   00:00    
[root@hadoop01 /bigdata/hadoop/server/hadoop-3.2.4/etc/hadoop]# scp -r hadoop-env.sh root@hadoop03:$PWD
hadoop-env.sh                                                                                                         100%   16KB 991.1KB/s   00:00    
[root@hadoop01 /bigdata/hadoop/server/hadoop-3.2.4/etc/hadoop]# scp -r core-site.xml root@hadoop02:$PWD
core-site.xml                                                                                                         100% 1404   507.9KB/s   00:00    
[root@hadoop01 /bigdata/hadoop/server/hadoop-3.2.4/etc/hadoop]# scp -r core-site.xml root@hadoop03:$PWD
core-site.xml                                                                                                         100% 1404   386.9KB/s   00:00    
[root@hadoop01 /bigdata/hadoop/server/hadoop-3.2.4/etc/hadoop]# scp -r hdfs-site.xml root@hadoop02:$PWD
hdfs-site.xml                                                                                                         100% 3256     1.1MB/s   00:00    
[root@hadoop01 /bigdata/hadoop/server/hadoop-3.2.4/etc/hadoop]# scp -r hdfs-site.xml root@hadoop03:$PWD
hdfs-site.xml                                                                                                         100% 3256     2.4MB/s   00:00

4.5 HA 集群初始化 

安装好 zookeeper 集群:【Zookeeper 初级】02、Zookeeper 集群部署_Stars.Sky的博客-CSDN博客 

#1. 首先启动 zookeeper 集群
[root@hadoop01 /bigdata/hadoop/zookeeper]# zk.sh start#2. 手动启动 JN 集群(3台机器)
hdfs --daemon start journalnode#3. 在 hadoop01 执行格式化 namenode 并启动 namenode
[root@hadoop01 ~]# hdfs namenode -format
[root@hadoop01 ~]# hdfs --daemon start namenode#4. 在 hadoop02 上进行 namenode 元数据同步
[root@hadoop02 ~]# hdfs namenode -bootstrapStandby#5. 格式化 zkfc。注意:在哪台机器上执行,哪台机器就将成为第一次的 Active NN
[root@hadoop01 ~]# hdfs zkfc -formatZK

4.6 HA 集群启动 

在 hadoop01 上启动 HDFS 集群:

[root@hadoop01 ~]# start-dfs.sh [root@hadoop01 ~]# jps
6355 QuorumPeerMain
6516 JournalNode
7573 DataNode
7989 DFSZKFailoverController
8040 Jps
7132 NameNode[root@hadoop02 ~]# jps
4688 JournalNode
5201 NameNode
5521 Jps
5282 DataNode
4536 QuorumPeerMain
5482 DFSZKFailoverController[root@hadoop03 ~]# jps
4384 DataNode
3990 QuorumPeerMain
4136 JournalNode
4511 Jp

五、HDFS HA 集群演示 

5.1 Web 页面查看两个 NameNode 状态 

在 hadoop01 上,显示 namenode 是 active 状态:

在 hadoop02 上,显示 namenode 是 standby 状态:

5.2 HA 集群下正常操作

[root@hadoop01 ~]# hadoop fs -mkdir /test02
[root@hadoop01 ~]# hadoop fs -put apache-zookeeper-3.7.1-bin.tar.gz /test02

Active 上可以正常操作,Standby 上无法预览:

5.3 模拟故障出现 

        在 hadoop01,手动 kill 杀死 namenode 进程。此时发现 hadoop02 上的 namenode 切换成为 Active 状态 hdfs 服务正常可用。

[root@hadoop01 ~]# jps
6355 QuorumPeerMain
6516 JournalNode
7573 DataNode
7989 DFSZKFailoverController
8267 Jps
7132 NameNode
[root@hadoop01 ~]# kill -9 7132

5.3.1 HA 自动切换失败--错误解决

        使用 kill -9 模拟 JVM 崩溃。或者重新启动计算机电源或拔出其网络接口以模拟另一种故障。另一个 NameNode 应在几秒钟内自动变为活动状态。检测故障并触发故障转移所需的时间取决于ha.zookeeper.session-timeout.ms 的配置,但默认值为 秒。

如果测试不成功,检查 zkfc 守护程序以及 NameNode 守护程序的日志,以便进一步诊断问题。如果错误信息如下

        提示未找到 fuser 程序,导致无法进行隔离所以可以通过如下命令来安装,Psmisc 软件包中包含了 fuser 程序(两个 NN 机器上都需要进行安装)

[root@hadoop01 ~]# yum install psmisc -y
[root@hadoop02 ~]# yum install psmisc -y

最后再重新启动 hdfs 集群,重新模拟故障出现则可以实现自动切换了!!!

上一篇文章:HDFS 集群动态节点管理_Stars.Sky的博客-CSDN博客 

下一篇文章:Hadoop YARN HA 集群安装部署详细图文教程_Stars.Sky的博客-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从C++98到C++26,经历了什么?

作为一名程序员&#xff0c;2023年最应该关注的话题就是C的标准更新。 C标准遵循3年开发周期&#xff0c;并以发布年份命名。C在临发布的一年前会进入“功能冻结期&#xff08;feature freeze&#xff09;”&#xff0c;即版本开发进入半稳定状态&#xff0c;不再添加重大功能及…

【RPC 协议】序列化与反序列化 | lua-cjson | lua-protobuf

文章目录 RPC 协议gRPCJSON-RPC 数据序列化与反序列化lua-cjsonlua-protobuf RPC 协议 在分布式计算&#xff0c;远程过程调用&#xff08;英语&#xff1a;Remote Procedure Call&#xff0c;缩写为 RPC&#xff09;是一个计算机通信协议。该协议允许运行于一台计算机的程序调…

机器学习部分知识点总结

文章目录 基本概念N与NP泛化能力性能度量比较检验 线性回归逻辑回归神经网络 基本概念 N与NP P问题&#xff1a;一个问题可以在多项式&#xff08;O(n^k) 的时间复杂度内解决 例如&#xff1a;n个数的排序&#xff08;不超过O(n^2)&#xff09; NP问题&#xff1a;一个问题的解…

Leetcode 16.07 最大数值

编写一个方法&#xff0c;找出两个数字a和b中最大的那一个。不得使用if-else或其他比较运算符。 示例&#xff1a; 输入&#xff1a; a 1, b 2 输出&#xff1a; 2 我的答案&#xff1a; 为了找出两个数中的较大者&#xff0c;而不使用比较或条件语句&#xff0c;我们可以…

常见的几种排序算法

目录 一、插入排序 1、直接插入排序 1.1、排序方法 1.2、图解分析 1.3、代码实现 2、希尔排序 2.1、排序方法 2.2、图解分析 2.3、代码实现 二、选择排序 1、直接选择排序 1.1、排序方法 1.2、图解分析 1.3、代码实现 2、堆排序 2.1、排序方法 2.2、图解分析 …

视频监控/视频汇聚/视频云存储EasyCVR平台接入国标GB协议后出现断流情况,该如何解决?

视频监控汇聚平台EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。安防监控平台EasyCVR既具备传统安防视频监控的能…

优思学院|亲和图案例:寻找六西格玛的项目

什么是亲和图&#xff1f; 亲和图&#xff08;Affinity Diagram&#xff09;主要功能在於分类归纳&#xff0c;协助在一堆杂乱无章的资料之中&#xff0c;有系统的归纳出几个大类&#xff0c;以利后续作业。通常先利用头脑风暴&#xff08;Brainstorming&#xff09;方式得到大…

K8S:K8S自动化运维容器

目录 一.k8s概述 2.为什么要用K8S 3.作用及功能 4.k8s容器集群管理系统 二.K8S的特性 1.弹性伸缩 2.自我修复 3.服务发现和复制均衡 4.自动发布和回滚 5.集中化配置管理和秘钥管理 6.存储编排 7.任务批量处理运行 三.K8S的集群架构 四.K8S的核心组件 1.Master组件 …

命令执行漏洞复现攻击:识别威胁并加强安全

环境准备 这篇文章旨在用于网络安全学习&#xff0c;请勿进行任何非法行为&#xff0c;否则后果自负。 一、攻击相关介绍 原理 主要是输入验证不严格、代码逻辑错误、应用程序或系统中缺少安全机制等。攻击者可以通过构造特定的输入向应用程序或系统注入恶意代码&#xff…

计算机网络的故事——HTTP报文内的HTTP信息

HTTP报文内的HTTP信息 文章目录 HTTP报文内的HTTP信息一、HTTP 报文二、请求报文及响应报文的结构三、编码提升传输速率 一、HTTP 报文 HTTP报文是由多行&#xff08;CRLF作换行符&#xff09;数据构成的字符串文本&#xff0c;HTTP报文可以分为报文首部和报文主体两部分&…

数据结构(一)Trie字符串统计

目录 代码 &#xff08;一&#xff09;输入cat son[p][u],p表示儿子&#xff0c;u表示第几个儿子 0的根的节点编号为idx -------------------------------------------------------- 根是0的有个儿子c&#xff0c;编号为1的节点有个子节点为a&#xff0c;a的编号是2&#xf…

Mybatis 动态SQL – 使用choose标签动态生成条件语句

之前我们介绍了if,where标签的使用&#xff1b;本篇我们需要在if,where标签的基础上介绍如何使用Mybatis提供的choose标签动态生成条件语句。 如果您对if,where标签动态生成条件语句不太了解&#xff0c;建议您先进行了解后再阅读本篇&#xff0c;可以参考&#xff1a; Mybat…

解决C++ 遇笔试题输入[[1,2,3,...,],[5,6,...,],...,[3,1,2,...,]]问题

目录 0 引言1 思路2 测试结果3 完整代码4 总结 0 引言 现在面临找工作问题&#xff0c;做了几场笔试&#xff0c;遇到了一个比较棘手的题目就是题目输入形式如下&#xff1a; [ [3,1,1], [3,5,3], [3,2,1] ] 当时遇到这个问题还是比较慌的&#xff0c;主要是之前没有遇到这样的…

内网穿透实战应用-如何通过内网穿透实现远程发送个人本地搭建的hMailServer的邮件服务

文章目录 1. 安装hMailServer2. 设置hMailServer3. 客户端安装添加账号4. 测试发送邮件5. 安装cpolar6. 创建公网地址7. 测试远程发送邮件8. 固定连接公网地址9. 测试固定远程地址发送邮件 hMailServer 是一个邮件服务器,通过它我们可以搭建自己的邮件服务,通过cpolar内网映射工…

智慧园区能源管理系统可以本地私有化部署吗?

答案是肯定的&#xff0c;智慧园区能源管理系统可以本地私有化部署! 随着社会的发展和经济的增长&#xff0c;能源消耗逐渐成为影响社会发展的重要因素。为了更好地管理能源&#xff0c;提高能源利用效率&#xff0c;降低能源消耗成本&#xff0c;智慧园区能源管理系统应运而生…

Go语言在机器学习中有未来吗?

Go 是一种开源编程语言&#xff0c;最初由 Google 设计&#xff0c;用于优化系统级服务的构建和使用、在大型代码库上轻松工作&#xff0c;以及利用多核联网机器。 Go 于 2009 年推出&#xff0c;作为一种静态类型和编译型编程语言&#xff0c;深受 C 语言的影响&#xff0c;注…

idea 无法识别maven的解决

问题描述 从git拉取代码或者修改文件夹以后&#xff0c;整个项目所有依赖爆红无法通过修改或者重新加载maven解决版本为idea 2021 问题定位 maven的版本太高&#xff0c;而idea的般本太低&#xff0c;导致识别的时候稳定性差 解决 使用idea原生的maven版本 选择已捆绑的m…

win10 ping不通 Docker ip(解决截图)

背景&#xff1a; win10下载了docker desktop就是这个图&#xff0c;然后计划做一个springboot连接docker。 docker部署springboot :docker 部署springboot(成功、截图)_總鑽風的博客-CSDN博客 问题&#xff1a;spring boot部署docker后&#xff0c;docker接口通了&#xff0…

Tomcat 日志乱码问题解决

我就是三井&#xff0c;一个永不放弃希望的男人。——《灌篮高手》 Tomcat 日志乱码问题解决 乱码原因&#xff1a;字符编码不一致 如&#xff1a;国内电脑一般都是GBK编码&#xff0c;而Tomcat日志使用的是UTF-8编码 解决方法&#xff1a;将对应字符编码由 UTF-8 改为 GBK 即…

【业务功能篇97】微服务-springcloud-springboot-电商购物车模块-获取当前登录用户的购物车信息

购物车功能 一、购物车模块 1.创建cart服务 我们需要先创建一个cart的微服务&#xff0c;然后添加相关的依赖&#xff0c;设置配置&#xff0c;放开注解。 <dependencies><dependency><groupId>com.msb.mall</groupId><artifactId>mall-commo…