TT Bigdata TT Bigdata
首页
GitHub (opens new window)
JaneTTR

JaneTTR

数据酿造智慧,每一滴都是沉淀!
  • Ambari 深度专题

  • Bigtop 方法论

  • 自定义集成

  • Ambari Server 与 Web

    • 方法论

    • 代码生命周期-metainfo

      • 加载原理深度剖析[一]
        • 1. 什么是 metainfo.xml?
          • 1.1 Redis 集群 metainfo.xml 示例拆解
          • 1.2 Ambari 如何解析 metainfo.xml?
      • 加载原理深度剖析[二]
      • 加载原理深度剖析[三]
      • 结构与层级深入解读
      • configFile详解[一]
      • configFile详解[二]
      • cardinality详解[一]
      • cardinality详解[二]
      • cardinality详解[三]
      • category详解[一]
      • category详解[二]
      • category详解[三]
      • theme详解[一]
      • theme详解[二]
      • theme详解[三]
      • commandScript详解[二]
      • commandScript详解[一]
      • commandScript详解[三]
      • customCommand详解[一]
      • customCommand详解[二]
      • customCommand详解[三]
      • requiredServices详解[一]
      • requiredServices详解[二]
      • osSpecifics详解[一]
      • osSpecifics详解[二]
      • osSpecifics详解[三]
      • quicklinks详解[一]
      • quicklinks详解[二]
      • quicklinks详解[三]
      • quicklinks详解[四]
      • versionAdvertised详解
    • 架构剖析

    • UI样式

  • Ambari Metrics

  • Ambari Plus 思考

  • Redis集成实战

  • 通用代码模板

  • 各组件代码

  • 技术专题
  • Ambari Server 与 Web
  • 代码生命周期-metainfo
JaneTTR
2025-05-31
目录
1. 什么是 metainfo.xml?
1.1 Redis 集群 metainfo.xml 示例拆解
1.2 Ambari 如何解析 metainfo.xml?

加载原理深度剖析[一]

在 Ambari 的服务开发与运维体系中,metainfo.xml 文件是服务定义的“大脑中枢”。本文将带你理解其核心作用和完整解析流程,并通过 Redis 集群服务为例,拆解 Ambari 如何用这一配置驱动服务全生命周期管理。

# 1. 什么是 metainfo.xml?

metainfo.xml 是 Ambari Stack(服务栈)中的基础元数据文件,用于声明服务名称、版本、组件结构、依赖关系、兼容平台及核心配置 。通过该文件,Ambari 能实现服务的自动发现、部署、监控和生命周期运维。

作用概览

  • 描述服务的核心元数据(名称、版本、作者、用途)
  • 定义所有组件(如 MASTER/SLAVE/CLIENT)
  • 关联每个组件的执行脚本与配置模板
  • 说明依赖、健康检查方式与操作系统兼容性

# 1.1 Redis 集群 metainfo.xml 示例拆解

来看一个完整的 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: [email protected] ,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>
                    <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>

                <!-- 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>
                    <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>

                <!-- 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>
                </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>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110

解析说明

  • 服务主入口:<name>REDIS</name> 规定服务唯一标识,<version> 为版本管理提供基础
  • 组件划分:通过 <component> 分别声明 Master/Slave/Client,各自独立部署与运维
  • 运维脚本绑定:每个组件都指定了 Python 启动脚本,生命周期动作(启动/停止/配置)均由这些脚本驱动
  • 配置与包:<configFiles> 和 <osSpecifics> 便于 Ambari 生成模板并匹配操作系统下的依赖包
  • 健康检查:service_check.py 便于平台做活性探测、预警
  • 依赖声明:<configuration-dependencies> 保证相关配置按需加载,防止遗漏

# 1.2 Ambari 如何解析 metainfo.xml?

Ambari 在服务注册和节点部署阶段,会自动递归解析 metainfo.xml,流程如下:

  1. 加载 Stack 服务目录,定位 metainfo.xml。
  2. 解析服务结构树,生成 Service/Component 实体。
  3. 自动渲染 UI,据组件类型(MASTER/SLAVE/CLIENT)生成集群布局页面。
  4. 下发配置模板与包依赖,保障安装兼容性与一致性。
  5. 组件脚本注入,将脚本与生命周期动作(Install/Configure/Start/Stop/Status)自动绑定。
  6. 健康检查与依赖处理,服务上线后实时监控各个实例状态。

提示

借助 metainfo.xml,整个 Redis 集群服务的注册、部署、配置、监控、升级都实现了自动化与结构化,极大提升了大数据平台集成效率和可维护性。

#Ambari#源码解析#Redis#metainfo
Redis-Cluster模式设计[二]
加载原理深度剖析[二]

← Redis-Cluster模式设计[二] 加载原理深度剖析[二]→

最近更新
01
当前版本 2026/08
08-29
02
把 Ambari Server HA 稳稳地跑起来
08-17
03
从一次启用操作追到主备就绪
08-17
更多文章>
Theme by Vdoing | Copyright © 2017-2026 JaneTTR | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式