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

05-成神之路_ambari_Ambari实战-013-代码生命周期-metainfo-configFiles详解

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>env</type><fileName>redis-site.xml</fileName><dictionaryName>redis-site</dictionaryName></configFile><configFile><type>env</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 在集群中进行服务管理。

2. configFiles 的作用 📂

configFiles 是 Redis 配置文件的重要部分。它的作用可以归纳为以下几点:

  1. type:指定生成文件的类型(如 xmlenvproperties 等)。
  2. fileName:指定生成的文件名称。
  3. dictionary:包含配置属性的数据字典,这与 Ambari 内部的配置包管理相关。

在这里插入图片描述

2.1 配置后的效果 🎯

在这里插入图片描述

下载客户端配置可以把当前环境的配置导出

请求地址:http://localhost:28080/api/v1/clusters/dev/services/REDIS/components/REDIS_CLIENT?format=client_config_tar

他会把配置全部导出,并可以查看实时的配置,但是前提要配置正确

在这里插入图片描述

2.2 配置作用域 🔍

根据代码的初步猜测,配置文件的定义仅对 metainfo/services/service/components/component/ 下,name 包含 _CLIENT 的组件生效。这意味着配置文件将主要用于客户端组件。

<?xml version="1.0"?>
<metainfo><services><service><!-- Redis 集群组件定义 --><components><!-- Redis 主节点组件 --><component><name>REDIS_MASTER</name><!-- 非重点忽略 --></component><!-- Redis 从节点组件 --><component><name>REDIS_SLAVE</name><!-- 非重点忽略 --></component><!-- Redis 客户端组件 --><component><name>REDIS_CLIENT</name><displayName>Redis Client</displayName><!-- 核心参数-------核心中的核心 请往这里看👀 --><!-- 核心参数-------核心中的核心 请往这里看👀 --><configFiles><configFile><type>xml</type><fileName>redis-site.xml</fileName><dictionaryName>redis-site</dictionaryName></configFile><configFile><type>env</type><fileName>redis-env.sh</fileName><dictionaryName>redis-env</dictionaryName></configFile></configFiles><!-- 核心参数-------核心中的核心 请往这里看👀 --><!-- 核心参数-------核心中的核心 请往这里看👀 --></component></components></service></services>
</metainfo>

这段代码定义了客户端的配置文件,它们将在生成时渲染为 xmlenv 格式的文件。

在这里插入图片描述

代码片段如下:

package org.apache.ambari.server.state;import java.util.ArrayList;
import java.util.List;import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlElements;import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;@XmlAccessorType(XmlAccessType.FIELD)
public class ComponentInfo {private String name;private String displayName;private String category;private boolean deleted;private String cardinality;@XmlElement(name="versionAdvertised")private Boolean versionAdvertisedField;//省略无关部分内容   //省略无关部分内容  //省略无关部分内容 /*** Client configuration files* List of files to download in client configuration tar*/// 核心参数-------核心中的核心 请往这里看👀 // 核心参数-------核心中的核心 请往这里看👀 @XmlElementWrapper(name = "configFiles")@XmlElements(@XmlElement(name = "configFile"))private List<ClientConfigFileDefinition> clientConfigFiles;// 核心参数-------核心中的核心 请往这里看👀 // 核心参数-------核心中的核心 请往这里看👀//省略无关部分内容   //省略无关部分内容  //省略无关部分内容   /*** Added at schema ver 2*/@XmlElementWrapper(name="customCommands")@XmlElements(@XmlElement(name="customCommand"))private List<CustomCommandDefinition> customCommands;/*** bulk commands shown in the Hosts actions* */@XmlElement(name="bulkCommands")private BulkCommandDefinition bulkCommandDefinition;/*** Component dependencies to other components.*/@XmlElementWrapper(name="dependencies")@XmlElements(@XmlElement(name="dependency"))private List<DependencyInfo> dependencies = new ArrayList<>();@XmlElementWrapper(name="configuration-dependencies")@XmlElements(@XmlElement(name="config-type"))private List<String> configDependencies;/*** Auto-deployment information.* If auto-deployment is enabled and the component doesn't meet the cardinality requirement,* the component is auto-deployed to the cluster topology.*/@XmlElement(name="auto-deploy")private AutoDeployInfo autoDeploy;@XmlElements(@XmlElement(name = "recovery_enabled"))private boolean recoveryEnabled = false;/*** Used to determine if reassign is allowed* */@XmlElements(@XmlElement(name = "reassignAllowed"))private String reassignAllowed;private String timelineAppid;@XmlElement(name="customFolder")private String customFolder;//省略无关部分内容   //省略无关部分内容  //省略无关部分内容  
}

2.3 type 类型的选择 🎛️

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


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

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


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

3.5 打包与下载 🗂️

生成配置文件后,Ambari 会将这些文件打包并返回给用户。这个打包和下载的过程发生在 ComponentService.java 中,通过 createClientConfigResource 方法实现:

private Response createClientConfigResource(String body, HttpHeaders headers, UriInfo ui,String componentName) {String fileName =  filePrefixName + "-configs" + Configuration.DEF_ARCHIVE_EXTENSION;Response response = handleRequest(headers, body, ui, Request.Type.GET,createResource(Resource.Type.ClientConfig, mapIds));// 如果响应有错误,直接返回if (response.getStatus() != 200) {return response;}Response.ResponseBuilder rb = Response.status(Response.Status.OK);String tmpDir = new Configuration().getProperty(Configuration.SERVER_TMP_DIR.getKey());File file = new File(tmpDir, fileName);InputStream resultInputStream = new FileInputStream(file);String contentType = Configuration.DEF_ARCHIVE_CONTENT_TYPE;rb.header("Content-Disposition",  "attachment; filename=\"" + fileName + "\"");rb.entity(resultInputStream);return rb.type(contentType).build();
}

该方法生成包含 Redis 配置文件的压缩包,并通过 HTTP 响应返回给用户进行下载。最终,用户可以获取包含所有配置文件的 .tar.gz 包。

在这里插入图片描述


3.6 最后 📝

从 HTTP 请求到配置文件生成和打包,Ambari 的整个流程可以总结如下:

  1. 用户发起 HTTP 请求,下载 Redis 客户端的配置文件包。

… 省略…

6.最后,Ambari 将打包好的配置文件通过 HTTP 响应返回给用户。


http://www.mrgr.cn/news/38356.html

相关文章:

  • 关系型数据库的特点
  • 工控主板在工业控制中扮演什么角色
  • k8s基于nfs创建storageClass
  • 【2023工业3D异常检测文献】PointCore: 基于局部-全局特征的高效无监督点云异常检测器
  • 2024年7月大众点评温州美食店铺基础信息
  • 综合业务区的数字化创新与智能化蓝图
  • 天龙八部怀旧单机微改人面桃花+安装教程+GM工具+虚拟机一键端
  • 【MyBatis】【Java】数据库连接之URL怎么写
  • 【virtuous】ron与rout的区别
  • redis是单线程模型,为啥效率这么高,速度这么快?
  • 基于elasticsearch存储船舶历史轨迹
  • java中IO遇NIO的区别,你需要了解
  • Python中列表,元组,集合的区别
  • Failed to load WebView provider: No WebView installed
  • 悄悄告诉你,35岁不会被裁的程序员
  • ONFI 5.1:定义、缩写语和约定
  • 2024年咸宁中级职称水平测试合格公示
  • C++友元和运算符重载
  • JavaWeb图书借阅系统
  • 3-2 AUTOSAR RTE对Runnable的作用