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 Master、Redis Slave 和 Redis Client。这些组件由 Python 脚本控制,它们的详细定义帮助 Ambari 在集群中进行服务管理。
2. configFiles
的作用 📂
configFiles
是 Redis 配置文件的重要部分。它的作用可以归纳为以下几点:
type
:指定生成文件的类型(如xml
、env
、properties
等)。fileName
:指定生成的文件名称。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>
这段代码定义了客户端的配置文件,它们将在生成时渲染为 xml
或 env
格式的文件。
代码片段如下:
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 的整个流程可以总结如下:
- 用户发起 HTTP 请求,下载 Redis 客户端的配置文件包。
… 省略…
6.最后,Ambari 将打包好的配置文件通过 HTTP 响应返回给用户。