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 Master、Redis Slave 和 Redis Client。这些组件由 Python 脚本控制,它们的详细定义帮助 Ambari 在集群中进行服务管理。
2 category
作用 🛠️
2.1. 从定义角度理解 🎯
在 Ambari 的 metainfo.xml
文件中,category
属性用于定义服务组件的角色。根据不同组件的功能,category
的值可以是 MASTER、SLAVE 或 CLIENT。我们先以 Redis 为例,看看它是如何配置的。
2.1.1 Redis 示例 🚀:
-
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 知道这个组件需要在页面的主节点部分展示,并让用户选择部署主节点的服务器。 -
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"
将其展示在从节点部分,用户可以在多个节点上选择部署。 -
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 中的配置方式。
-
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” 选择界面展示。 -
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
。 -
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 能够区分NAMENODE
和DATANODE
,并相应地控制它们的部署。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 Master
和 ZooKeeper Server
正确分配到了 centos1
、centos2
和 centos3
,这是通过前述所有步骤最终生成的结果,确保了页面上只显示 MASTER
组件,并且所有分配情况与返回的推荐一致。其实我们能看到的master 内容 都是经过过滤显示在该页面中。