category详解[二]
# 2.2 从请求到验证的流程详解 全链路解析
在 Ambari 添加服务的过程中,平台会结合当前集群节点分布与服务依赖关系,动态生成推荐部署方案。整个推荐流程前后端协同联动,每一个环节都直观透明。下面以 Zookeeper 服务为例,逐步拆解从 UI 操作到最终推荐结果返回的每个关键步骤。
# 2.2.1 服务选择与添加流程
在服务选择界面,如果当前环境已部署 Redis,本次就可以直接勾选 Zookeeper 并点击“下一步”。Ambari 会据此生成 Zookeeper 的推荐安装方案。
# 2.2.2 前端请求发起与参数上送
当用户点击“下一步”时,浏览器会发起一个 HTTP 请求,将本轮所有节点及服务选择情况上报给 Ambari 后端,目的是请求生成合理的部署建议。
实际请求内容如下所示(以 curl 形式展示,数据已简化):
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"}]}]}}}'
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
请求体中的关键参数有:
{
// 核心参数-------核心中的核心 请往这里看👀
"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"
}
]
}
]
}
}
// 核心参数-------核心中的核心 请往这里看👀
}
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
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
hosts
:所有可用主机列表services
:本轮选择需要部署的服务(如 ZOOKEEPER、REDIS)recommend
:请求推荐类型(此处为主机组 host_groups)recommendations
:当前各主机组与服务组件的对应关系(blueprint+binding)
# 2.2.3 推荐结果返回与数据解析
后端收到请求后,会调用 Ambari 的 StackAdvisor 推荐引擎。该模块会综合考虑当前集群拓扑、资源状态与服务依赖,生成一份推荐的主机分组与服务组件分布方案,最终以 JSON 格式返回前端。
返回示例(部分内容简化):
{
"resources": [
{
// 核心参数-------核心中的核心 请往这里看👀
"href": "http://localhost:28080/api/v1/stacks/BIGTOP/versions/3.2.0/recommendations/66",
// 核心参数-------核心中的核心 请往这里看👀
"hosts": [
"centos2",
"centos3",
"centos1"
],
"services": [
"REDIS",
"ZOOKEEPER"
],
// 核心参数-------核心中的核心 请往这里看👀
"Recommendation": {
"id": 66
},
// 核心参数-------核心中的核心 请往这里看👀
"Versions": {
"stack_name": "BIGTOP",
"stack_version": "3.2.0"
},
"recommendations": {
"config-groups": null,
"blueprint": {
"configurations": null,
"host_groups": [
{
"components": [
{
"name": "ZOOKEEPER_CLIENT"
},
{
"name": "REDIS_MASTER"
},
{
"name": "ZOOKEEPER_SERVER"
},
{
"name": "REDIS_SLAVE"
},
{
"name": "REDIS_CLIENT"
}
],
"name": "host-group-1"
},
{
"components": [
{
"name": "REDIS_MASTER"
},
{
"name": "ZOOKEEPER_SERVER"
},
{
"name": "REDIS_SLAVE"
},
{
"name": "REDIS_CLIENT"
}
],
"name": "host-group-3"
},
{
"components": [
{
"name": "REDIS_MASTER"
},
{
"name": "ZOOKEEPER_SERVER"
},
{
"name": "REDIS_SLAVE"
},
{
"name": "REDIS_CLIENT"
}
],
"name": "host-group-2"
}
]
},
"blueprint_cluster_binding": {
"host_groups": [
{
"hosts": [
{
"fqdn": "centos3"
}
],
"name": "host-group-1"
},
{
"hosts": [
{
"fqdn": "centos2"
}
],
"name": "host-group-2"
},
{
"hosts": [
{
"fqdn": "centos1"
}
],
"name": "host-group-3"
}
]
}
}
}
]
}
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
111
112
113
114
115
116
117
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
111
112
113
114
115
116
117
# 关键字段说明与逻辑解读
字段 | 说明 |
---|---|
hosts | 当前可用主机列表,后续所有部署方案都将在这些主机范围内落地。 |
services | 本次涉及的全部服务类型(如 ZOOKEEPER、REDIS)。 |
recommendations | 推荐的主机组与组件分配方案,blueprint 明确每组需要哪些组件,binding 则把主机组映射到具体服务器。 |
blueprint | 以主机组为单位,明确每组上部署的服务组件。例如 host-group-1 上包含 ZOOKEEPER_SERVER、REDIS_CLIENT 等。 |
blueprint_cluster_binding | 主机组与实际主机绑定。host-group-1 就会被分配到 centos3 上,即 Zookeeper Server 和 Redis Client 会推荐部署在 centos3。 |
href | 唯一推荐方案编号。每生成一次推荐,该编号递增。这个编号会落盘为对应的日志、参数 json 文件,方便后续分析调试。 |
此流程的设计使 Ambari 能根据最新的集群和服务状态自动推荐合理的 Server 排布。初始时节点上并未分配 Zookeeper Server,完成请求后,每台服务器应部署哪些服务组件,将一目了然。
笔记
本节完整展示了 Ambari 推荐引擎从 UI 操作到 API 调用、再到推荐结果返回的全链路细节,无论是流程梳理还是关键参数解释,都极具参考价值。后续还可针对 StackAdvisor 生成方案的内部逻辑进行深度追踪分析。