多版本管理解读-组件级distro-select
bigtop 在大数据生态下的多版本管理,核心就是对每个组件/子服务在不同版本下的隔离、切换和统一入口
。这套体系的关键实现就是 bigtop-select/distro-select
工具。
# 一、核心思想:current 软链接+统一脚本
bigtop 各组件都部署在 /usr/bigtop/{version}/{component}
目录,
通过 /usr/bigtop/current/{component}
软链实现“当前生效版本”动态切换。
distro-select 脚本就是实现软链切换、注册、查询等运维动作的主入口。
# 二、主要数据结构说明
# 1. 组件叶子节点 leaves
leaves = {
'hadoop-client': 'hadoop',
'hbase-master': 'hbase',
'redis-master': 'redis',
'zookeeper-server': 'zookeeper',
# ... 省略 ...
}
1
2
3
4
5
6
7
2
3
4
5
6
7
- key:逻辑名/服务名,如 `redis-master
- value:目录名,如
redis
。
提示
每个 key 都能映射到具体目录,实现所有组件/角色的“多版本登记表”。
value值怎么填
一般情况下 /usr/bigtop/3.2.0/{component}
下 截取 {component}
即可
# 2. 分组/别名 aliases
aliases = {
"all": leaves.keys(),
"client": [
"hadoop-client", "hbase-client", "redis-client", ...
],
"hadoop-hdfs-server": [
"hadoop-hdfs-datanode", "hadoop-hdfs-namenode", ...
]
}
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
- 批量操作(如 client/服务端/全部),简化大规模切换场景。
# 3. 多层服务 locked_contexts
locked_contexts = {
"hadoop-client": [
("hadoop-hdfs-client", "hadoop-hdfs"),
("spark-client", "spark"),
...
]
}
* 解决“主服务一切换,相关子服务也需跟着切换”的场景。
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 4. 命令级别软链 command_symlinks
command_symlinks = {
"hdfs": "hadoop-hdfs-client/../../bin/hdfs",
"hive": "hive-client/../../bin/hive",
...
}
1
2
3
4
5
2
3
4
5
- 保证
/usr/bin/hdfs
等命令行入口统一,所有自动化脚本都能稳定找到可用命令。
# 三、核心运维流程解读
# 1. 查询当前版本状态
- 查看所有或单一组件当前软链指向
distro-select status
distro-select status redis-client
1
2
2
- 实现原理:调用
listPackages
,遍历leaves
,判断软链实际目录。
# 2. 切换组件到指定版本
- 典型命令
distro-select set redis-client 3.2.0
1
实现流程
- 校验目标版本目录是否存在
- 移除旧软链,建立新软链到指定版本
- 批量同步“锁定”子服务、命令软链
笔记
这一步自动完成所有层级服务与命令行软链同步,避免因“只换一半”带来脚本失效。
# 3. 列举支持组件与分组
- 快速查找支持哪些组件或批量别名
distro-select packages
1
- 输出示例
Packages:
hadoop-client
hbase-master
redis-client
...
Aliases:
all
client
...
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 4. 展示已安装所有版本
- 查询 bigtop 体系下现有版本
distro-select versions
1
- 便于多集群/回滚时对比选择
# 四、核心 setPackages 代码分解
def setPackages(packages, version, rpm_mode):
# 目录存在校验
target = root + "/" + version + lib_root
if not os.path.isdir(target):
# 错误处理
# 建立 current 软链
for pkg in packages:
linkname = current + "/" + pkg
if os.path.islink(linkname):
os.remove(linkname)
os.symlink(target + "/" + leaves[pkg], linkname)
# 处理锁定子服务
if pkg in locked_contexts:
# 子服务也同步切换软链
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
- 代码保证了主服务、子服务软链原子级批量切换。
# 五、常用命令与实际表格
操作 | 命令示例 | 说明 |
---|---|---|
查询全部组件状态 | distro-select status | 显示所有组件当前版本 |
设置组件到新版本 | distro-select set redis-client 3.2.0 | 切换 redis 客户端版本 |
查询支持组件/别名 | distro-select packages | 输出所有支持的组和别名 |
列出所有版本 | distro-select versions | 显示已安装所有版本 |
检查组件支持性 | distro-select supports redis-client | 检查组件是否受支持 |
- 01
- bigtop-select 打包缺 compat 报错修复 deb07-16
- 02
- bigtop-select 打包缺 control 文件报错修复 deb07-16
- 03
- 首次编译-环境初始化 必装07-16