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

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 在集群中进行服务管理。

2 category 作用 🛠️

2.1. 从定义角度理解 🎯

在 Ambari 的 metainfo.xml 文件中,category 属性用于定义服务组件的角色。根据不同组件的功能,category 的值可以是 MASTERSLAVECLIENT。我们先以 Redis 为例,看看它是如何配置的。

2.1.1 Redis 示例 🚀:
  1. MASTER:Redis 主节点。MASTER 组件负责处理所有写操作,并管理从节点的数据同步。在页面上,MASTER 组件会出现在 “Master” 选择页面中,供用户选择合适的节点部署主节点。

    代码示例:

    <component>
        <name>REDIS_MASTER</name>
        <displayName>Redis Master</displayName>
        <category>MASTER</category> <!-- 该组件定义为主节点 -->
        <versionAdvertised>true</versionAdvertised>
        <commandScript>
            <script>scripts/redis_master.py</script> <!-- 控制 Redis Master 的脚本 -->
            <scriptType>PYTHON</scriptType>
        </commandScript>
    </component>
    

    作用MASTER 组件负责管理数据的写操作,并通过同步机制将数据复制到从节点。通过设置 category="MASTER",Ambari 知道这个组件需要在页面的主节点部分展示,并让用户选择部署主节点的服务器。

  2. SLAVE:Redis 从节点。SLAVE 组件负责从主节点复制数据,以确保数据的高可用性和冗余。在页面上,SLAVE 组件会出现在从节点选择界面中,允许用户选择多个节点来部署从节点。

    代码示例:

    <component>
        <name>REDIS_SLAVE</name>
        <displayName>Redis Slave</displayName>
        <category>SLAVE</category> <!-- 该组件定义为从节点 -->
        <versionAdvertised>true</versionAdvertised>
        <commandScript>
            <script>scripts/redis_slave.py</script> <!-- 控制 Redis Slave 的脚本 -->
            <scriptType>PYTHON</scriptType>
        </commandScript>
    </component>
    

    作用SLAVE 组件从主节点同步数据,确保 Redis 集群的高可用性。Ambari 通过 category="SLAVE" 将其展示在从节点部分,用户可以在多个节点上选择部署。

  3. CLIENT:Redis 客户端。CLIENT 组件用于与集群交互,提供接口供用户发送请求并获取响应。

    代码示例:

    <component>
        <name>REDIS_CLIENT</name>
        <displayName>Redis Client</displayName>
        <category>CLIENT</category> <!-- 该组件定义为客户端 -->
        <versionAdvertised>true</versionAdvertised>
        <commandScript>
            <script>scripts/redis_client.py</script>
            <scriptType>PYTHON</scriptType>
        </commandScript>
    </component>
    

    作用CLIENT 组件提供与 Redis 集群交互的能力。Ambari 会在客户端部分展示 CLIENT 组件,用于在用户设备或应用服务器上部署。

Redis 中 category 的作用 💡:

  • 分类显示:Redis 的 MASTER 组件在页面中会显示为主节点,而 SLAVE 组件会显示在从节点部分,方便用户选择合适的节点进行部署。

  • 部署控制:通过 category 属性,Ambari 可以区分主节点、从节点和客户端,并相应地控制它们的部署。MASTER 可以部署在一个或多个节点上,SLAVE 组件则可以在多个节点上实现分布式部署。

2.1.2 HDFS 示例 🛠️:

接下来,我们看看 HDFS 服务在 Ambari 中的配置方式。

  1. MASTER:HDFS 主节点。在 HDFS 中,NAMENODE 是主节点,负责管理文件系统的元数据。它的主要职责是协调所有的 DATANODE,确保数据存储和访问的正确性。

    代码示例:

    <component>
        <name>HDFS_NAMENODE</name>
        <displayName>HDFS NameNode</displayName>
        <category>MASTER</category> <!-- 该组件定义为主节点 -->
        <commandScript>
            <script>scripts/namenode.py</script>
            <scriptType>PYTHON</scriptType>
        </commandScript>
    </component>
    

    作用NAMENODE 作为 HDFS 的核心组件,管理元数据并协调数据块的存储。通过 category="MASTER",Ambari 知道它是主节点,并在 “Master” 选择界面展示。

  2. SLAVE:HDFS 从节点。在 HDFS 中,DATANODE 是从节点,负责存储实际的数据块,并与 NAMENODE 通信。

    代码示例:

    <component>
        <name>HDFS_DATANODE</name>
        <displayName>HDFS DataNode</displayName>
        <category>SLAVE</category> <!-- 该组件定义为从节点 -->
        <commandScript>
            <script>scripts/datanode.py</script>
            <scriptType>PYTHON</scriptType>
        </commandScript>
    </component>
    

    作用DATANODE 组件负责存储 HDFS 集群中的实际数据。通过 category="SLAVE",Ambari 会将其展示在从节点部分,允许用户选择多个节点来部署 DATANODE

  3. CLIENT:HDFS 客户端。HDFS_CLIENT 允许用户与文件系统进行交互,执行诸如文件上传和下载的操作。

    代码示例:

    <component>
        <name>HDFS_CLIENT</name>
        <displayName>HDFS Client</displayName>
        <category>CLIENT</category> <!-- 该组件定义为客户端 -->
        <commandScript>
            <script>scripts/client.py</script>
            <scriptType>PYTHON</scriptType>
        </commandScript>
    </component>
    

    作用HDFS_CLIENT 提供与 HDFS 文件系统的交互接口,允许用户执行文件操作。Ambari 会在客户端部分展示 CLIENT 组件,用于选择是否安装客户端工具。

HDFS 中 category 的作用 🔧:

  • 分类显示:在 HDFS 服务的安装过程中,NAMENODE 组件会出现在主节点选择界面,而 DATANODE 组件则会出现在从节点选择界面,方便用户配置文件系统的核心和存储节点。

  • 部署控制:通过 category 属性,Ambari 能够区分 NAMENODEDATANODE,并相应地控制它们的部署。NAMENODE 通常部署在一个或两个节点上(高可用模式),而 DATANODE 则会在多个节点上分布部署。

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

在 Ambari 中添加服务时,系统会根据现有集群节点和服务的依赖关系生成推荐部署方案。前端将请求发送到后端,后端返回相应的推荐结果供用户选择。这个过程涉及多个步骤,下面以 Zookeeper 服务为例,详细说明每个环节。

2.2.1 添加服务 🛠️

在服务选择页面,我们已经安装了 Redis,这次选择 Zookeeper 进行安装。用户在 Ambari 的 UI 中点击“下一步”时,系统会开始为新服务生成推荐方案。

在这里插入图片描述

2.2.2 浏览器发起请求 🌐

当用户点击“下一步”时,浏览器会发起一个 HTTP 请求,将用户选择的服务和集群中所有节点的信息发送给后端。这个请求的目标是让 Ambari 后端根据集群拓扑结构生成组件的推荐部署方案。

在这里插入图片描述

例如,请求可能包含如下信息:

curl 'http://localhost:28080/api/v1/stacks/BIGTOP/versions/3.2.0/recommendations' \
  -H 'Accept: application/json, text/javascript, */*; q=0.01' \
  -H 'Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6' \
  -H 'Cache-Control: no-cache' \
  -H 'Connection: keep-alive' \
  -H 'Content-Type: text/plain' \
  -H 'Cookie: _ga=GA1.1.1591965935.1720631763; apt.uid=AP-YFGMCGUNNIFB-2-1726927068139-89959811.0.2.a2e3917a-4f22-4c24-8671-436b74b600a2; _ga_0C4M1PWYZ7=GS1.1.1726929800.18.0.1726929803.0.0.0; _ga_T11SF3WXX2=GS1.1.1726929800.16.0.1726929803.57.0.0; _ga_K2SPJK2C73=GS1.1.1726929800.16.0.1726929803.57.0.0; AMBARISESSIONID=node01ef02iyrwkd3sdmg9aaxv48xe1.node0' \
  -H 'Origin: http://localhost:28080' \
  -H 'Pragma: no-cache' \
  -H 'Referer: http://localhost:28080/' \
  -H 'Sec-Fetch-Dest: empty' \
  -H 'Sec-Fetch-Mode: cors' \
  -H 'Sec-Fetch-Site: same-origin' \
  -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0' \
  -H 'X-Requested-By: X-Requested-By' \
  -H 'X-Requested-With: XMLHttpRequest' \
  -H 'sec-ch-ua: "Microsoft Edge";v="129", "Not=A?Brand";v="8", "Chromium";v="129"' \
  -H 'sec-ch-ua-mobile: ?0' \
  -H 'sec-ch-ua-platform: "Windows"' \
  --data-raw '{"hosts":["centos1","centos2","centos3"],"services":["ZOOKEEPER","REDIS"],"recommend":"host_groups","recommendations":{"blueprint":{"host_groups":[{"name":"host-group-1","components":[{"name":"REDIS_CLIENT"},{"name":"REDIS_MASTER"},{"name":"REDIS_SLAVE"}]},{"name":"host-group-2","components":[{"name":"REDIS_CLIENT"},{"name":"REDIS_MASTER"},{"name":"REDIS_SLAVE"}]},{"name":"host-group-3","components":[{"name":"REDIS_CLIENT"},{"name":"REDIS_MASTER"},{"name":"REDIS_SLAVE"}]}]},"blueprint_cluster_binding":{"host_groups":[{"name":"host-group-1","hosts":[{"fqdn":"centos1"}]},{"name":"host-group-2","hosts":[{"fqdn":"centos2"}]},{"name":"host-group-3","hosts":[{"fqdn":"centos3"}]}]}}}'

在这里插入图片描述

2.2.4.3 处理主机与 MASTER 组件的配对

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


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

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


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

核心内容已经结束,后面只是为了拼凑主机信息

在这里插入图片描述

在这里插入图片描述

2.2.4.4 页面渲染结果

Redis MasterZooKeeper Server 正确分配到了 centos1centos2centos3,这是通过前述所有步骤最终生成的结果,确保了页面上只显示 MASTER 组件,并且所有分配情况与返回的推荐一致。其实我们能看到的master 内容 都是经过过滤显示在该页面中。

在这里插入图片描述


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值