【成神之路】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.rhkb.cn/news/436619.html

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

相关文章

Redis的基础认识与在ubuntu上的安装教程

来自Redis的自我介绍 我是Redis&#xff0c;一个中间件&#xff0c;职责是把数据存储在内存上&#xff0c;因此可以作为数据库、缓存、消息队列等场景使用。由于可以把数据存储在内存上&#xff0c;因此江湖人称快枪手 1.redis的功能特性 &#xff08;1&#xff09;数据在内存…

制造企业各部门如何参与生产成本控制与管理?

​国内制造业的分量可不轻&#xff0c;从日常生活用品到高端工业设备&#xff0c;中国制造几乎涵盖了各个领域。 不过很多制造业企业在管理方面确实存在一些难题&#xff1a;成本控制不容易&#xff0c;产品质量并不稳定&#xff0c;生产周期也常常较长。 一、中国制造业生产管…

【ZYNQ 开发】填坑!双核数据采集系统LWIP TCP发送,运行一段时间不再发送且无法ping通的问题解决

问题描述 之所以说是填坑&#xff0c;是因为之前写了一篇关于这个双核数据采集系统的调试记录&#xff0c;问题的具体表现是系统会在运行一段时间后&#xff08;随机不定时&#xff0c;长了可能将近两小时&#xff0c;短则几分钟&#xff09;&#xff0c;突然间就不向电脑发送数…

《家庭无线网络覆盖项目》

家庭无线网络覆盖报项目 目录 家庭无线网络覆盖项目 家庭无线网络覆盖项目 一、项目概述 二、设备清单及报价 三、安装调试费用 四、总报价 五、服务承诺 家庭无线网络覆盖项目 客户姓名:[客户姓名] 联系方式:[电话号码] 家庭地址:[详细地址] 一、项目概述 为客户…

docker compose 容器编排

文章目录 1、docker compose简介2、下载与安装2.1、创建指定目录存储docker compose2.2、下载docker-compose并移动到上面的目录下2.3、给docker-compose文件赋予可执行权限2.4、查看docker compose的版本 3、入门案例&#xff08;使用docker compose部署redis&#xff09;3.1、…

RTE 大会报名丨AI 时代新基建:云边端架构和 AI Infra ,RTE2024 技术专场第二弹!

所有 AI Infra 都在探寻规格和性能的最佳平衡&#xff0c;如何构建高可用的云边端协同架构&#xff1f; 语音 AI 实现 human-like 的最后一步是什么&#xff1f; AI 视频的爆炸增长&#xff0c;给新一代编解码技术提出了什么新挑战&#xff1f; 当大模型进化到实时多模态&am…

算力共享系统中数据平面和控制平面

目录 算力共享系统中数据平面和控制平面 数据平面 控制平面 算力共享系统举例 控制流程和业务流程,在算力共享系统中举例说明 控制流程 业务流程 算力共享系统中数据平面和控制平面 在算力共享系统中,数据平面和控制平面是两个关键组成部分,它们各自承担着不同的角色…

3-2 AUTOSAR RTE对Runnable的作用

返回总目录->返回总目录<- 一、前言 通过RTE给runnable提供触发事件。 runnable是可以被触发的,但是需要通过RTE来实现这个触发和调用runnable通过RTE给runnable提供所需资源。 RTE将runnable需要的一些资源通过接口传输给它(Port的实现)将BSW和SWC做隔绝。 因此OS和r…

2024/10/1 408大题专训之磁盘管理

2021&#xff1a; 2019&#xff1a; 2010&#xff1a;

【C语言】动态内存管理:malloc、calloc、realloc、free

本篇介绍一下C语言中的malloc/calloc/realloc。 使用这些函数需要包含头文件<stdlib.h>。malloc/calloc/realloc申请的空间都是 堆区的。 1.malloc和free 1.1 malloc C语言提供了一个动态内存开辟的函数malloc&#xff0c;函数原型如下。 void* malloc(size_t size);…

【docker学习】Linux系统离线方式安装docker环境方法

centos7-linux安装docker(离线方式) 下载docker的安装文件 https://download.docker.com/linux/static/stable/x86_64/ 下载的是&#xff1a;docker-18.06.3-ce.tgz 这个压缩文件 将docker-18.06.3-ce.tgz文件上传到centos7-linux系统上&#xff0c;用ftp工具上传即可 解压…

移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——15.红黑树

1.红黑树的概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或 Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制&#xff0c;红黑树确保没有一条路 径会比其他路径长出俩倍&#xff0c;…

【C++】类与对象(一)

「前言」 &#x1f308;个人主页&#xff1a; 代码探秘者 &#x1f308;C语言专栏&#xff1a;C语言 &#x1f308;C专栏&#xff1a; C &#x1f308;喜欢的诗句:天行健,君子以自强不息. 目录 [一、面向过程和面向对象初步认识][Link 2] 二、类的引入 三、类的定义 四、类…

李宏毅机器学习2022-HW8-Anomaly Detection

文章目录 TaskBaselineReportQuestion2 Code Link Task 异常检测Anomaly Detection 将data经过Encoder&#xff0c;在经过Decoder&#xff0c;根据输入和输出的差距来判断异常图像。training data是100000张人脸照片&#xff0c;testing data有大约10000张跟training data相同…

值传递和引用传递

值传递和引用传递是函数参数传递的两种类型&#xff0c;一般而言&#xff0c;基本数据类型都是值传递&#xff0c;数组和对象采用引用传递减少对象复制开销&#xff0c;但也有特例。 值和引用传递本质一样 值传递是拷贝值到函数参数&#xff0c;引用传递是拷贝引用(或者对象的指…

第十三届蓝桥杯真题Java c组C.纸张尺寸(持续更新)

博客主页&#xff1a;音符犹如代码系列专栏&#xff1a;蓝桥杯关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 【问题描述】 在 ISO 国际标准中定义了 A0 纸张的大小为 1189mm 841mm&#…

jenkins项目发布基础

随着软件开发需求及复杂度的不断提高,团队开发成员之间如何更好地协同工作以确保软件开发的质量已经慢慢成为开发过程中不可回避的问题。Jenkins 自动化部署可以解决集成、测试、部署等重复性的工作,工具集成的效率明显高于人工操作;并且持续集成可以更早的获取代码变更的信息,…

博弈论(学习笔记)

定义何为最优&#xff01; 最优解是均衡&#xff01;&#xff08;&#xff09; 一次博弈 --- 一面之缘 复杂动态博弈&#xff1b; 路怒症----陌生人&#xff0c;一次性博弈。 一次性博弈最能暴露人性。 重复博弈太压抑了。 沙普利求解合作博弈的著名理论---如何为参与者制定利益…

SQL第11课——使用子查询

11.1 子查询 查询&#xff08;query): 任何SQL语句都是查询&#xff0c;但此术语一般指select语句。 select语句是SQL的查询&#xff0c;迄今为止所有的select语句都是简单查询&#xff0c;即从单个数据库表中检索数据的单条语句。 SQL还允许创建子查询&#xff08;subquer…

浪 得 虚 名 ?RAG接入知识图谱!全局数据关系表示!指哪打哪!

在学知识图谱系列的朋友就知道&#xff01; 知识图谱RAG&#xff01;最大优势&#xff1a; 全局数据关系表示&#xff01; 相似文本散落在–>不规则不相邻文本块&#xff01; 传统RAG只能找到top-k个文本块&#xff0c;一旦文本块过多&#xff0c;超出llm上下文限制&…