【成神之路】Ambari实战-014-代码生命周期-metainfo-cardinality详解

1.Redis 集群 metainfo.xml 示例

<?xml version="1.0"?>
<metainfo><schemaVersion>2.0</schemaVersion><services><service><!-- Redis 集群服务的基本信息 --><name>REDIS</name><displayName>Redis</displayName><comment>Component Redis Power By JaneTTR . mail: 3832514048@qq.com ,git: https://gitee.com/tt-bigdata/ambari-env</comment><version>7.4.0</version><!-- Redis 集群组件定义 --><components><!-- Redis 主节点组件 --><component><name>REDIS_MASTER</name><displayName>Redis Master</displayName><category>MASTER</category><cardinality>3+</cardinality> <!-- Redis 集群至少需要 3 个主节点 --><versionAdvertised>true</versionAdvertised><commandScript><script>scripts/redis_master.py</script> <!-- Python 脚本 --><scriptType>PYTHON</scriptType></commandScript></component><!-- Redis 从节点组件 --><component><name>REDIS_SLAVE</name><displayName>Redis Slave</displayName><category>SLAVE</category><cardinality>3+</cardinality> <!-- 从节点可以是 0 或多个 --><versionAdvertised>true</versionAdvertised><commandScript><script>scripts/redis_slave.py</script> <!-- Python 脚本 --><scriptType>PYTHON</scriptType></commandScript></component><!-- Redis 客户端组件 --><component><name>REDIS_CLIENT</name><displayName>Redis Client</displayName><category>CLIENT</category><cardinality>0+</cardinality> <!-- 客户端是可选的,可以部署多个 --><versionAdvertised>true</versionAdvertised><commandScript><script>scripts/redis_client.py</script> <!-- Python 脚本 --><scriptType>PYTHON</scriptType></commandScript><configFiles><configFile><type>xml</type><fileName>redis-site.xml</fileName><dictionaryName>redis-site</dictionaryName></configFile><configFile><type>xml</type><fileName>redis-env.sh</fileName><dictionaryName>redis-env</dictionaryName></configFile></configFiles></component></components><!-- 操作系统相关 --><osSpecifics><osSpecific><osFamily>any</osFamily> <!-- 支持任何操作系统 --><packages><package><name>redis_${stack_version}</name></package></packages></osSpecific></osSpecifics><!-- Redis 服务健康检查 --><commandScript><script>scripts/service_check.py</script> <!-- 健康检查 Python 脚本 --><scriptType>PYTHON</scriptType><timeout>300</timeout></commandScript><!-- Redis 服务不依赖其他服务 --><!-- 如果有其他依赖项,可以在这里定义 --><!-- 配置依赖 --><configuration-dependencies><config-type>redis-site</config-type><config-type>redis-env</config-type></configuration-dependencies></service></services>
</metainfo>

在这个文件中,我们定义了 Redis 集群的三个关键组件: Redis MasterRedis SlaveRedis Client。这些组件由 Python 脚本控制,它们的详细定义帮助 Ambari 在集群中进行服务管理。

在 Ambari 的配置和管理中,metainfo.xml 文件是定义服务、组件及其依赖关系的核心。通过对 cardinalitycategory 的精准定义,我们可以确保集群中的组件以预期的方式部署,并符合高可用性要求。


2. cardinalitycategory 的作用 📂

metainfo.xml 文件中,categorycardinality 是两个核心属性。category 定义了组件的角色,比如 MASTERCLIENT,而 cardinality 则控制组件的实例数量及部署要求。接下来,我们将深入探讨这两个属性。

2.1 cardinality 的作用 🎯

cardinality 属性定义了一个组件在集群中必须部署的 数量要求。它确保集群能够正确部署并符合高可用性等重要系统要求。

2.1.1 定义角度分析

常见的 cardinality 值有以下几种类型:

  • 1:表示该组件在集群中只能有 1 个实例,适用于唯一性组件,例如数据库主节点。
  • 1+:表示该组件至少需要 1 个实例,但可以有多个实例,适合扩展性服务,如负载均衡器。
  • 0+:表示该组件是可选的,可能没有实例或有多个实例,常用于客户端组件,如 Redis Client
  • 3+:表示该组件至少需要 3 个实例,通常用于高可用性场景,如 Redis Master,确保集群的健壮性和可扩展性。

例如,在 Redis 集群的 metainfo.xml 文件中,我们为 Redis Master 设置了 cardinality: 3+,这意味着集群中必须至少部署 3 个 Redis 主节点,确保系统的高可用性和数据安全性。

值的定义描述示例
精确值exact: 表示组件的确切数量<cardinality>3</cardinality> <cardinality>1</cardinality>
最小值min: 表示组件的最小数量要求<cardinality>1-3</cardinality> <cardinality>3+</cardinality>
最大值max: 表示组件的最大数量要求<cardinality>1-3</cardinality> <cardinality>3-9</cardinality>
是否所有ALL: 表示组件需要在所有节点上部署<cardinality>ALL</cardinality>

2.1.2 代码实现 🧑‍💻

cardinality 在代码中的实现由 Java 类 Cardinality 负责,它会根据 metainfo.xml 中的配置对组件的部署进行严格校验。通过判断 cardinality 的不同值类型,我们可以设置最小值 min、最大值 max,以及确切的部署数量 exact

在这里插入图片描述

package org.apache.ambari.server.topology;/*** Component cardinality representation.*/
public class Cardinality {String cardinality;int min = 0;int max = Integer.MAX_VALUE;int exact = -1;boolean isAll = false;// 核心参数-------核心中的核心 请往这里看👀 // 核心参数-------核心中的核心 请往这里看👀public Cardinality(String cardinality) {this.cardinality = cardinality;if (cardinality != null && ! cardinality.isEmpty()) {if (cardinality.contains("+")) {min = Integer.parseInt(cardinality.split("\\+")[0]);} else if (cardinality.contains("-")) {String[] toks = cardinality.split("-");min = Integer.parseInt(toks[0]);max = Integer.parseInt(toks[1]);} else if (cardinality.equals("ALL")) {isAll = true;} else {exact = Integer.parseInt(cardinality);}}}// 核心参数-------核心中的核心 请往这里看👀 // 核心参数-------核心中的核心 请往这里看👀
}

在这段代码中,cardinality 的定义被解析为不同的类型,比如 3+ 表示最少 3 个实例,1-3 表示部署的实例数在 1 到 3 之间,ALL 表示所有节点都必须部署该组件。

Java 端主要负责将配置文件中的 cardinality 属性加载和校验其合规性,而实际的验证则由 Python 脚本执行。


2.1.3 Python 验证逻辑 🧑‍💻

在 Python 部分,getComponentLayoutValidations 方法会根据 cardinality 的配置对集群的实际部署进行校验。这个方法位于 StackAdvisor 子类中,例如 BIGTOP320StackAdvisor

在这里插入图片描述

def getComponentLayoutValidations(self, services, hosts):# Validating cardinalityfor component in componentsList:if component["StackServiceComponents"]["cardinality"] is not None:componentName = component["StackServiceComponents"]["component_name"]componentDisplayName = component["StackServiceComponents"]["display_name"]componentHosts = []if component["StackServiceComponents"]["hostnames"] is not None:componentHosts = [componentHost for componentHost in component["StackServiceComponents"]["hostnames"] if componentHost in hostsSet]componentHostsCount = len(componentHosts)cardinality = str(component["StackServiceComponents"]["cardinality"])# cardinality types: null, 1+, 1-2, 1, ALLmessage = None# 核心参数-------核心中的核心 请往这里看👀 # 核心参数-------核心中的核心 请往这里看👀 if "+" in cardinality:hostsMin = int(cardinality[:-1])if componentHostsCount < hostsMin:message = "At least {0} {1} components should be installed in cluster.".format(hostsMin, componentDisplayName)elif "-" in cardinality:nums = cardinality.split("-")hostsMin = int(nums[0])hostsMax = int(nums[1])if componentHostsCount > hostsMax or componentHostsCount < hostsMin:message = "Between {0} and {1} {2} components should be installed in cluster.".format(hostsMin, hostsMax, componentDisplayName)elif "ALL" == cardinality:if componentHostsCount != hostsCount:message = "{0} component should be installed on all hosts in cluster.".format(componentDisplayName)else:if componentHostsCount != int(cardinality):message = "Exactly {0} {1} components should be installed in cluster.".format(int(cardinality), componentDisplayName)if message is not None:items.append({"type": 'host-component', "level": 'ERROR', "message": message, "component-name": componentName})

该方法会检查 cardinality 配置的要求,并根据实际部署的主机数量进行比对,生成错误或成功消息。比如,如果组件 cardinality 设置为 3+,而实际部署了 2 个实例,系统会返回相应的错误信息。

在这里插入图片描述


2.2 从请求到验证的流程详解 🛠️

通过一个实际的 API 请求,我们可以详细分析整个验证流程,看看 Ambari 如何验证 cardinality 的配置。

⬇️⬇️⬇️查看全部内容⬇️⬇️⬇️


查看全部内容,更多详细内容请关注我们的微信公众号:发送"文章"关键字获取

或加入QQ1群,了解版本动向,解答大数据问题。


⬆️⬆️⬆️查看全部内容⬆️⬆️⬆️

当验证逻辑完成后,Ambari 将会返回一个包含验证结果的响应,说明每个组件的部署情况和潜在的错误。

在这里插入图片描述

{"resources": [{"items": [{"level": "ERROR","host": "centos3","type": "host-component","message": "Host is not used"},{"component-name": "ZOOKEEPER_CLIENT","level": "ERROR","type": "host-component","message": "At least 1 ZooKeeper Client components should be installed in cluster."}]}]
}

这个响应中显示了 ZooKeeper Client 组件未能满足 1+cardinality 要求,因此系统返回了错误信息。


2.3 结合Redis场景说明

<component><name>REDIS_MASTER</name><displayName>Redis Master</displayName><category>MASTER</category><cardinality>3+</cardinality> <!-- 至少需要 3 个主节点 --><versionAdvertised>true</versionAdvertised><commandScript><script>scripts/redis_master.py</script><scriptType>PYTHON</scriptType></commandScript>
</component>

在上面的例子中,cardinality 被定义为 3+,表示 Redis 主节点在集群中必须至少有 3 个实例。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

C# HttpClient请求URL重定向后丢失Authorization认证头

搜查官方文档后发现&#xff1a; HttpWebRequest.AllowAutoRedirect Property (System.Net) | Microsoft Learn 微软提供的http类库HttpClient &#xff08;HttpWebRequest\WebClient已不推荐使用&#xff0c;用HttpClient代替&#xff09;有备注提醒&#xff1a;当使用自动重…

vite 快速入门指南

相关链接 演示地址源码地址vite 官网地址 Vite 是什么 Vite 是由 Evan You&#xff08;Vue.js 创始人&#xff09;开发的现代前端构建工具&#xff0c;专为提升开发体验而设计。它通过创新的开发模式和高效的构建流程&#xff0c;极大提高了开发效率&#xff0c;尤其在处理大…

2024年健康经济与大数据研讨会(HEBD 2024)2024 Seminar on Health Economics and Big Data

在线投稿&#xff1a;学术会议-学术交流征稿-学术会议在线-艾思科蓝 2024年经济决策与人工智能国际学术会议 &#xff08;EDAI 2024&#xff09;将在2024年11月08-10日在广东省广州市隆重举行。大会邀请来自国内外高等院校、科学研究所、企事业单位的专家、教授、学者、工程师…

spring框架2 DI入门

每次创建maven项目时都要点击设置看一眼配置&#xff0c;需要修改就改一下&#xff0c;改成所存放的位置地址 属性生成&#xff1a;bean值之间的关系 写了一个私有属性 写private BookDao bookDao右键生成&#xff0c;通过setter方法注入一下 点击 确定 DI入门 DI&#xff1a…

插槽slot在vue中的使用

介绍 在 Vue.js 中&#xff0c;插槽&#xff08;slot&#xff09;是一种用于实现组件内容分发的功能。通过插槽&#xff0c;可以让父组件在使用子组件时自定义子组件内部的内容。插槽提供了一种灵活的方式来组合和复用组件。 项目中有很多地方需要调用一个组件&#xff0c;比…

使用Qt实现实时数据动态绘制的折线图示例

基于Qt的 QChartView 和定时器来动态绘制折线图。它通过动画的方式逐步将数据点添加到图表上&#xff0c;并动态更新坐标轴的范围&#xff0c;提供了一个可以实时更新数据的折线图应用。以下是对代码的详细介绍及其功能解析&#xff1a; 代码概述 该程序使用Qt的 QChartView…

时变电磁场(矢量除了是xyz还是t的函数)的麦克斯韦方程

静电场场的磁场方程与电荷守恒定律的矛盾的根本原因在于电荷守恒定律是时空的函数&#xff0c;静磁场的方程是特殊的空间的函数不含t&#xff0c;让其成为时空的函数就对应上了

【GESP】C++一级练习BCQM3017、BCQM3018,输入后输出

接触输入后&#xff0c;两道简单的读取输入后&#xff0c;按要求输出的变量值的题。基本语法的应用&#xff0c;没什么难度。 题解详见&#xff1a;https://www.coderli.com/gesp-1-bcqm3017-3018/ 【GESP】C一级练习BCQM3017、BCQM3018&#xff0c;输入后输出 | OneCoder接触…

数字化那点事:一文读懂数字孪生

一、数字孪生的定义 数字孪生&#xff08;Digital Twin&#xff09;是指通过数字技术构建的物理实体的虚拟模型&#xff0c;能够对该实体进行全方位、动态跟踪和仿真预测。简单来说&#xff0c;数字孪生就是在一个设备或系统的基础上创造一个数字版的“克隆体”&#xff0c;这…

Agr_Reader 1.7.11 极简优美的RSS阅读器,无广告

Agr Reader是一款简洁、优美、符合Material You风格的RSS阅读器。它不仅提供了强大的全文解析功能&#xff0c;默认支持离线阅读&#xff0c;还具备桌面小组件、自定义样式设置等功能。此外&#xff0c;它支持接入FreshRSS、Tiny Tiny RSS等多种RSS服务&#xff0c;并提供沉浸式…

计算机网络:计算机网络概述 —— 初识计算机网络

文章目录 计算机网络组成部分网络架构协议与标准网络设备网络类型作用实际应用案例 计算机网络 计算机网络是指将多台计算机通过通信设备和通信链路连接起来&#xff0c;以实现数据和信息的交换和共享的技术和系统。它是现代信息社会的基础设施之一&#xff0c;也是互联网的基…

【Spine】引入PhotoshopToSpine脚本

引入 右键Photoshop图标&#xff0c;选择属性 打开文件所在位置 找到目录下的\Presets\Scripts文件夹。 找到Spine目录下的\scripts\photoshop文件夹下的PhotoshopToSpine.jsx 复制它&#xff0c;丢到Photoshop刚才找的那个目录下。 使用 打开.psd文件&#xff0c;检查不要…

(Kafka源码五)Kafka服务端处理消息

Kafka 服务端&#xff08;Broker&#xff09;采用 Reactor 的架构思想&#xff0c;通过1 个 Acceptor&#xff0c;N 个 Processor(N默认为3)&#xff0c;M 个 KafkaRequestHandler&#xff08;M默认为8&#xff09;&#xff0c;来处理客户端请求&#xff0c;这种模式结合了多线…

Android Camera2 与 Camera API技术探究和RAW数据采集

Android Camera2 Android Camera2 是 Android 系统中用于相机操作的一套高级应用程序接口&#xff08;API&#xff09;&#xff0c;它取代了之前的 Camera API。以下是关于 Android Camera2 的一些主要信息&#xff1a; 主要特点&#xff1a; 强大的控制能力&#xff1a;提供…

关于Mac管理员root权限的一些问题总结

&#x1f389; 前言 最近在学习Vue CLI的时候&#xff0c;发现在Vscode里面想要修改文件或者保存文件都会显示“permission denied”&#xff0c;即权限不足。于是想了一些解决方法&#xff0c;记录在此。 &#x1f389; 检查当前用户权限 打开终端&#xff0c;输入以下指令…

好玩的水表电表

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>水表电表</title><style>* {margin:…

从Fast-UMI到Diff-Control:分别改进刷盘机器人UMI的硬件及其所用的扩散策略

前言 24年9.28日下午&#xff0c;微信上的好友丁研究员和我说 hi 周总&#xff0c;我们基于umi改进了一下——弄了一个用户友好的采集系统(当然&#xff0c;现在这个版本还比较初级 后续不断迭代)项目网站为&#xff1a;https://fastumi.com/ 技术报告见&#xff1a;https://…

“洗盘后的曙光:利用通达信选股器捕捉二次拉升股”

在一波上涨行情之后&#xff0c;投资者往往会遇到股票的回调。这时&#xff0c;市场上的两种声音开始交织&#xff1a;一种是认为这是洗盘&#xff0c;即主力在为下一轮拉升做准备&#xff1b;另一种则认为这是出货&#xff0c;主力在悄悄撤离。如何分辨这两者&#xff0c;给大…

基于Leaflet和天地图的细直箭头和突击方向标绘实战

目录 前言 一、细直箭头和突击方向的类设计 1、总体类图 2、对象区别 二、标绘绘制的具体实现 1、绘制时序图 2、相关点的具体绘制 3、最终的成果 三、总结 前言 今天是10月1日国庆节&#xff0c;迎来我们伟大祖国75周年的华诞。有国才有家&#xff0c;在这里首先祝我们…

Python 如何使用 Pandas 进行数据分析

Python 如何使用 Pandas 进行数据分析 在数据分析领域&#xff0c;Python 是非常流行的编程语言&#xff0c;而 Pandas 是其中最重要的库之一。Pandas 提供了高效、灵活的数据结构和工具&#xff0c;专门用于处理和分析数据。对于数据分析新手来说&#xff0c;理解如何使用 Pa…