TT Bigdata TT Bigdata
首页
  • 产品中心

    • 当前版本
    • 版本矩阵与下载
  • 安装与使用

    • Ambari Plus 安装
      • 安装前准备
        • 实施总览
        • Step0—源码包下载与目录准备
        • Step1—系统源与基础工具准备
        • Step2—集群免密登录
        • Step3—主机名解析同步
        • Step4—Chrony 时间同步
        • Step5—Nginx 本地 Yum 文件服务
        • Step6—JDK 双环境准备
        • Step7—MySQL 驱动与本地仓库
        • Step8—MariaDB 初始化
        • Step9—AmbariServer 初始化
        • 必须 ambari plus 数据库初始化文件
      • 安装部署
        • 初始化集群
    • 组件安装
      • 组件安装总览
      • Solr 安装
      • Ranger 安装
      • Knox 安装
      • HDFS 安装
      • YARN 安装
      • MapReduce2 安装
      • Tez 安装
      • Hive 安装
      • Sqoop 安装
      • HBase 安装
      • Kafka 安装
      • Flink 安装
      • Spark 安装
      • Hue 安装
      • Livy 安装
      • Zeppelin 安装
      • DolphinScheduler 安装
      • Doris 安装
      • Celeborn 安装
      • Ozone 安装
      • Impala 安装
      • Trino 安装
      • Paimon 安装
      • Hudi 安装
      • Atlas 安装
      • Superset 安装
      • Alluxio 安装
    • 开启高可用
      • 开启高可用总览
      • HDFS 开启 HA
      • YARN 开启 HA
    • 权限与审计
      • 权限与审计总览
      • Kerberos 认证启用
      • LDAP 目录接入
    • Ambari Plus Monitor
      • IoTDB 安装与部署
      • 必须 ambari plus monitor 数据库初始化文件
      • Monitor 安装
      • 监控与告警使用
    • 常见问题
      • 安装使用常见问题
  • 发布与支持

    • 更新日志
    • 服务说明
    • 优惠政策
    • 合作共建
    • 蓝图愿景
    • 历史版本
      • 更新日志 · v2.2.3
      • 更新日志 · v2.2.2
      • 更新日志 · v2.2.1
      • 更新日志 · v2.2.0
      • 更新日志 · v2.1.0
      • 更新日志 · v2.0.0
      • 更新日志 · v1.0.7
      • 更新日志 · v1.0.6
      • 更新日志 · v1.0.5
      • 更新日志 · v1.0.4
      • 更新日志 · v1.0.3
      • 更新日志 · v1.0.2
      • 更新日志 · v1.0.1
      • 更新日志 · v1.0.0
  • 会员与访问

    • 专属内容解锁
  • Ambari 安装

    • 常规安装
      • 适用于Ambari3.0.0-kylin V10-aarch64
        • Step0—源码包下载
        • Step1—基础环境准备
        • Step2—免密登录配置
        • Step3—安装JDK-Bisheng
        • Step5—Nginx安装
        • Step6—本地yum源配置
        • Step7—Mariadb初始化
        • Step8—AmbariServer初始化
        • Step9—Ambari Web UI 初始化安装
        • [快速安装]—脚本极速部署
      • 适用于Ambari3.0.0-kylin V10-x86_64
        • Step0—源码包下载
        • Step1—基础环境准备
        • Step2—免密登录配置
        • Step3—安装JDK17与JDK1.8
        • Step5—Nginx安装
        • Step6—本地yum源配置
        • Step7—Mariadb初始化
        • Step8—AmbariServer初始化
        • Step9—Ambari Web UI 初始化安装
        • [快速安装]—脚本极速部署
      • 适用于Ambari3.0.0-ubuntu22.04
        • Step0—源码包下载
        • Step1—基础环境准备
        • Step3—安装JDK17与JDK1.8
        • Step4—时间同步(Chrony)
        • Step5—Nginx安装
        • Step6—本地apt源
        • Step7—Mariadb初始化
        • Step8—AmbariServer初始化
        • Step9—Ambari Web UI 初始化安装
        • [快速安装]—脚本极速部署
      • 适用于Ambari3.0.0-el7
        • Step0—源码包下载
        • Step3—安装JDK17(Ambari 3.0专用)
        • Step8—AmbariServer初始化
        • Step9—Ambari Web UI 初始化安装
        • [快速安装]—脚本极速部署
      • 适用于Ambari3.0.0-el8
        • Step0—源码包下载
        • Step1—基础环境准备
        • Step3—安装JDK17与JDK1.8
        • Step7—Mariadb初始化
        • Step8—AmbariServer初始化
        • Step9—Ambari Web UI 初始化安装
        • [快速安装]—脚本极速部署
      • 适用于Ambari2.8.0-el7
        • Step1—基础环境准备
        • Step2—免密登陆认证
        • Step3—安装JDK
        • Step4—时间同步(Chrony)
        • Step5—Nginx安装
        • Step6—本地yum源配置
        • Step7—Mariadb初始化
        • Step8—AmbariServer初始化
        • Step9—Ambari Web Ui 初始化安装
    • 一键部署
      • Ambari快速部署—3.0.0
        • 【Kylin V10 aarch64】强力卸载脚本
        • 【Kylin V10 aarch64】自动安装脚本
        • 【Kylin V10 x86_64】强力卸载脚本
        • 【Kylin V10 x86_64】自动安装脚本
        • 【Ubuntu22】强力卸载脚本
        • 【Ubuntu22】自动安装脚本
        • 【Rocky8.10】强力卸载脚本
        • 【Rocky8.10】自动安装脚本
        • 【Centos7.9】自动安装脚本
      • Ambari快速部署—2.8.0
        • 【Centos7.9】自动安装脚本
        • 【Centos7.9】强力卸载脚本
      • 数据库环境
        • PostgreSQL 快速安装脚本
      • JDK环境
        • 安装JDK1.8
        • 安装JDK 17
        • 安装JDK1.8-aarch64
        • 安装JDK 17-aarch64
      • MAVEN环境
        • 安装Maven3.8.4
        • 安装Maven3.9.9
      • GRADLE环境
        • 安装Gradle5.6.4
      • CONDA环境
        • 安装Miniconda2
        • 编译Ambari2.8.0——Miniconda3
      • R环境
        • 【Kylin V10 x86_64】安装R 4.4.2
        • 【Ubuntu22】安装R 4.4.2
        • 【Rocky8.10】安装R 4.4.2
        • 【CentOS7】安装R 4.4.2
  • 组件安装

    • 安装指导
    • 魔改分享
      • Phoenix-JDK17下编译的二进制包适用于Datagrip
        • Q: 高版本 DataGrip 无法使用 Phoenix 驱动
        • A: Phoenix - JDK17 制作&下载
    • 最小化安装(简单)
      • Zookeeper 安装
      • Hadoop 安装
      • Yarn安装
      • Hive 安装
      • Spark 安装
      • HBase 安装
      • Kafka 安装
      • Sqoop 安装
      • Flink 安装
      • DolphinScheduler 安装
      • Zeppelin 安装
      • Redis 安装
      • Doris安装
      • Celeborn安装
      • Ozone安装
      • Impala安装
      • Cloudbeaver 安装
      • Ambari Metrics安装
      • Solr安装
      • Ranger 安装
      • Trino安装
      • Paimon安装
      • Hudi安装
      • Atlas 安装
      • Superset 安装
      • Livy 安装
      • Alluxio 安装
      • Hue 安装
      • Knox 安装
    • 进阶安装技巧(需开启Kerberos)
      • Ambari Metrics 进阶安装技巧
      • Atlas 进阶安装技巧
    • 高可用安装(有难度)
      • Zookeeper
      • Hadoop-Namenode
      • Yarn-ResourceManager
      • Hive
      • Hbase
      • Kafka
      • DolphinScheduler
      • Redis
      • Doris
      • Celeborn
      • Ozone
      • Ranger
  • Kerberos 旧版专题

    • 实战 Kerberos
    • 自建 Kerberos
      • KDC服务初始化安装
        • KDC服务初始化安装(RHEL篇)
        • KDC服务初始化安装(Ubuntu篇)
      • 开启Kerberos认证
        • Ambari 中开启 Kerberos 认证流程详解
        • [不看会报错]-Atlas开启准备工作
        • [不看会报错]-Zeppelin开启准备工作
        • [不看会报错]-Impala开启准备工作
        • [不看会报错]-Trino开启准备工作
      • 关闭Kerberos认证
        • Ambari 中关闭 Kerberos 认证流程详解
    • FreeIPA 认证
      • FreeIPA服务端初始化
        • FreeIPA Server 安装指导
      • FreeIPA客户端初始化及Ambari开启IPA认证
        • [Step1]-FreeIPA Client 安装与入域实战
        • [Step2]-FreeIPA 初始化核心用户
        • [Step3]-Ambari 中开启 Kerberos 认证流程详解
        • [Step3-1]-krb5-conf template调整
      • 部分踩坑-问题发现
        • Ambari Server 启动失败:no valid keystore
        • FreeIPA Client 导致 Ambari 权限异常问题排查
      • 部分踩坑-完美解决
        • Ambari Server 启动失败:no valid keystore
      • 辅助测试
        • FreeIPA Client 调试安装速记
        • Ambari Server 证书调试安装速记
    • 其他优化技巧
      • Atlas-Ranger-StringUtils缺失
      • Atlas-Ranger-commons-compress缺失
    • 部分组件踩坑合集
      • Test Kerberos Client报错:Failed to kinit
      • KERBEROS SERVICE CHECK 报错
      • Ambari开启Kerberos认证加密类型错误
      • [开启Kerberos]-Solr启动失败处理
      • [开启Kerberos]-Kafka启动失败处理
      • [开启Kerberos]-Atlas启动-Hbase权限异常
      • [开启Kerberos]-Atlas启动-Solr权限异常
      • [开启Kerberos]-Atlas启动-Kafka权限异常
      • [开启Kerberos]-Hive服务检查异常处理
      • [开启Kerberos]-Trino启动-配置文件处理
      • [开启Kerberos]-Trino启动-缺失PEM证书处理
      • [开启Kerberos]-Trino启动-连接Hive失败
      • [关闭 Kerberos]-Kafka 注销异常
      • [关闭 Kerberos]-Hive 注销异常
      • Kerberos 客户端模板渲染异常处理(临时处理)
      • Kafka 启动兼容 Kerberos 源码级修改
      • Kerberos 客户端模板渲染异常处理(源码修改)
    • 实战技巧
      • Knox 接入 Trino web-ui 解决方案
      • [开启Kerberos]-Trino启动-配置模板
      • [Knox适配]-Trino-474-转发规则魔改
    • 其他技巧
      • Ambari Security 开启步骤
  • Ranger 旧版专题

    • 实战 Ranger
    • Ranger HA 旧发行版
      • 环境准备
        • [Step1] Haproxy 规划与环境安装
      • Kerberos准备
        • [Step2] 统一访问域名的 Kerberos 票据生成
        • [Step3] 调整 Kerberos Client 配置
      • 安装指导
        • [Step4] Ambari页面开启 Ranger Admin 高可用
        • [Step5] 对齐 Ranger HA 的凭证处理
    • Ranger HA ttr-release
      • [Step2] Ranger Admin HA 自动化安装
    • FreeIPA 与 LDAP
      • [Step1] Ambari 安装 Ranger 并配置 FreeIPA + LDAP
      • [Step2] 制作 Ranger Usersync 证书并应用组件
      • [Step3] 制作 Ranger Admin 证书并应用组件
      • [Step4]Ranger HDFS Repository 创建失败修复
      • [Step5]Ranger HBase Repository 创建失败修复
    • 踩坑汇总
      • 调用 Ranger API 返回 403 问题
      • Ranger Admin LDAP 认证报 Bad credentials 分析
    • 解决方案
      • Ranger Admin LDAP 认证报 Bad credentials 处理
      • Ranger HA 虚拟域名 Principal 缺失修复
      • Ranger Usersync 证书快速导入脚本(LDAPS)
      • Ranger Admin 证书快速导入脚本
      • Ranger HDFS Repository 快速处理
      • Ranger HBase / Yarn Repository 快速处理
  • 开发环境

    • Ambari-Env
      • 环境准备
      • 开始使用
    • 工具与镜像
      • Maven镜像加速
      • Gradle镜像加速
      • Node.js 多版本共存方案
      • Npm镜像加速
      • Bower镜像加速
      • R环境安装+一键安装脚本
      • PostgreSQL 快速安装
  • Ambari 编译

    • Ambari 源码编译
    • 前端开发
    • 后端开发
    • Ambari Web本地启动
  • Bigtop 编译

    • 官方组件编译
    • 扩展组件编译
    • 工具与镜像
      • Ivy配置私有镜像仓库
      • APT仓库增量更新
      • Temurin JDK 23快速安装
  • Ambari 深度专题

    • Ambari Server 原理
    • Ambari Metrics 解读
  • Bigtop 方法论

    • Bigtop 深度专题
  • 自定义集成

    • Redis集成教学
    • Dolphin集成教学
    • Doris集成教学
    • 各组件代码
    • 通用代码模板
  • 报错解决

    • Ambari 报错
      • Ambari Views
        • MDEP-187 从根因到修复
        • Loading node labels问题解决
      • Ambari
        • phantomjs下载失败问题
        • 编译问题:GCC 安装与配置
        • bower CERT_HAS_EXPIRED 错误问题
        • Ambari-admin包出现bower install错误
        • Cannot run program "rpmbuild"
        • Python: No such file or directory
        • Yarn解压报错EOFException排查与解决
        • Rpm-maven-plugin与shebang兼容性报错
        • Rpm-maven-plugin 最佳实践
        • Bower install拉取失败解决
        • 缺少 python3 报错解决
        • Python(>=2.6) but is not installed
        • SSL_ERROR_SYSCALL 的修复方法
      • Ambari-infra
        • org.apache.commons.io does not exist
        • maven-compiler-plugin:3.3:compile
        • java.security.InvalidAlgorithmParameterException
        • ambari-infra-solr-plugin依赖报错解决方案
      • Ambari-metrics
        • psutil 缺失与 archive_util 导入错误
        • Ambari-Metrics Monitor 启动失败
        • Ambari-Metrics Monitor 启动失败
        • Ambari-Metrics Monitor 启动失败
        • Ambari-Metrics Monitor 启动失败
    • Bigtop 报错
      • Hadoop
        • /usr/bin/env: python3: No such file or directory 问题
        • error [email protected]: The engine "node" is incompatible with this module 错误
        • CMake 3.1 or higher is required. You are running version 2.8.12.2 错误
        • fuse is needed by hadoop_3_2_0-3.3.4-1.el7.x86_64 错误
        • Cyrus SASL/GSASL 缺失解决
        • Protobuf PROTOC LIBRARY NOTFOUND
        • EVP CIPHER CTX block size 报错
        • TIRPC_INCLUDE_DIRS NOTFOUND解决
        • 缺失 redhat-rpm-config 报错
      • Spark
        • evaluate,httr2,knitr 包不存在解决办法
        • Pandoc 缺失导致 SparkR 构建失败
      • Trino
        • Trino requires Temurin or Oracle JDK for development
        • GLIBC 与 GLIBCXX 版本过低
      • Hudi
        • javax.annotation.Nullable 缺失
        • 缺失 everit-json-schema 依赖
      • Paimon
        • 缺失 Jindo 依赖
      • Livy
        • apache-incubator-disclaimer-resource-bundle 缺失
      • Flink
        • .git can't be found during `prepare`
        • Angular CLI requires Node >=14.15
        • npm run ci-check 报错退出码 3
        • TypeScript 类型声明错误
      • Atlas
        • Atlas 集成 JanusGraph 启动时报 Solr6Index 实例化失败解决
      • Superset
        • urllib3 v2 only supports OpenSSL 1.1.1+
      • Jsvc
        • jsvc 依赖缺失导致 rpm 构建失败
      • Zookeeper
        • ZooKeeper 构建(缺少 hostname 命令)
        • cppunit-devel 依赖缺失解决方案
      • Hive
        • org.apache.logging.slf4j.Log4j.Marker is not public 解决方案
      • Sqoop
        • xmlto is needed by 解决方法
        • lsb_release、rsync 缺失导致构建中断
        • asciidoc 警告与 relnotes.py 语法不兼容分析
      • Cloudbeaver
        • SelectExpressionItem cannot be resolved 报错分析
      • Bigtop-select
        • bigtop-select 打包缺 compat 报错修复
        • bigtop-select 打包缺 control 文件报错修复
      • Knox
        • xmlsectool 依赖缺失问题解析
        • webhdfs-test 依赖收敛冲突问题处理
        • Invalid keystore format 问题处理
        • Knox is not allowed to impersonate admin
        • X-Forwarded-For 406 错误的原因与处理
      • Hue
        • Hue 访问 Hadoop 权限问题
        • Hue 访问 Yarn 权限问题
        • Hue 访问 Impala 时间格式问题
        • requests-kerberos 兼容性问题
        • libmariadb.so.3 缺失导致 syncdb 失败
        • 生产环境下解决方案——Hue/query_api.py
  • 系统适配

    • Kylin V10系列
      • 通用部分
        • not set for current OS
          • 解读-不支持操作系统解读
          • 解决-增加系统支持范围(一)
          • 解决-增加系统支持范围(二)
          • 解决-增加系统支持范围(三)
          • 解决-增加系统支持范围(四)
        • 解决-TLS1.3导致依赖下载失败终极办法
    • Rocky系列
      • 案例-Ambari重启失败
        • 解读-Ambari3.0.0重启失败问题
        • 解决-追加日志锚点
        • 解决-进一步分析与改造[一]
        • 解决-进一步分析与改造[二]
      • 案例-数据库连接问题
        • 解读-安装完毕后出现Unable to load version data from server
      • 案例-日志级别控制问题
        • 解读-Ambari3.0.0无法调整日志输出级别
        • 解决-临时处理日志级别不生效
        • 解决-源码级处理日志不生效
      • 案例-找不到snappy-devel
        • 解决-HDFS报snappy-devel包缺失现象
      • 案例-编译高级功能
        • 解读-开启Hadoop下ISAL-L和PMDK功能
        • 解决-ISAL-L和PMDK功能完整环境包
    • Ubuntu系列
      • 案例-首次编译环境处理
        • 解决-dpkg-buildpackage依赖缺失
        • 解决-devscripts依赖缺失
        • 首次编译-环境初始化
      • 案例-Bigtop适配Debian
        • 解读-bigtop-select支持deb
        • 解决-Step1-解除限制拥抱deb
        • 解决-Step2-补全代码结构
      • 案例-安装中遇到的问题
        • 解读-APT私有镜像验证失败剖析
        • 解决-快速处理APT私有镜像验证失败问题
      • 案例-编译高级功能
        • 解读-开启Hadoop下ISAL-L和PMDK功能
        • 解决-ISAL-L和PMDK功能完整环境包
    • Centos系列
    • OpenEuler系列
  • 监控与调优

    • Ambari-Metrics插件
    • Infinity插件
      • 准备工作
        • Ambari-Metrics插件失效原因
        • Infinity 插件选择与安装小技巧
        • Grafana9.3.2+Infinity2.3.1
          • Grafana快速安装Infinity插件
        • Grafana11.5.2+Infinity3.4.1
          • Grafana快速安装Infinity插件
      • 创建最简DEMO
        • Grafana9.3.2+Infinity2.3.1
          • 快速创建一个简单demo
          • Panel JSON 配置示例
        • Grafana11.5.2+Infinity3.4.1
          • 快速创建一个简单demo
          • Panel JSON 配置示例
    • 组件配置调优
      • HDFS
        • [0001]访问 HDFS Web UI Logs Unauthorized 失败
        • [0001]>>>>>>Hadoop管理员配置优化
      • RANGER
        • [0002]Ranger 审计日志时间与系统时间不一致调整
        • [0002]>>>>>日期统一规则调优
        • [0001]Resource lookup fail 线程池超时优化
        • [0001]>>>>>>线程池与超时参数调优
    • 组件调优指南
    • 1v1指导调优
  • BUG临时处理

    • 版本-v2.2.2-以前
      • [22213]Ambari 3.0.0 滚动重启只执行一台主机修复
      • [22213]解决办法
      • [22212]Ambari 3.0.0 左侧服务菜单滚动条缺失修复
      • [22212]解决办法
      • [22211]Atlas 缺失 __AtlasUserProfile
      • [22211]解决办法
      • [22210]Atlas Hook 无权限访问 Kafka Topic
      • [22210]解决办法
      • [22209]Ranger Kafka Lookup 缺少 JAAS 配置
      • [22209]解决办法
      • [22208]Atlas Hook 消费 Kafka 报错
      • [22208]解决办法
      • [22207]Hue 内访问 SparkSql 失败
      • [22207]解决办法
      • [22206]Ranger 调用 Knox Topologies 失败
      • [22206]解决办法
      • [22205]Ranger Admin 轮刷ZK 缺失 JAAS
      • [22205]解决办法
      • [22204]KNOX policymgr-ssl 启动告警
      • [22204]解决办法
      • [22203]Hue 服务启动后秒退
      • [22203]解决办法
      • [22202]Hue 启动失败: hadoop 用户不存在
      • [22202]解决办法
      • [22201]Hive 使用 Tez 引擎插入数据失败
      • [22201]解决办法
    • 版本-v2.1.0-以前
      • Sqlline 启动卡死问题处理
  • 实验室

    • VIEW插件
      • CAPACITY-SCHEDULER-VIEW
        • Ambari CAPACITY-SCHEDULER 插件安装详解
      • FILE-VIEW
        • Ambari FILE-VIEW 插件安装详解
    • JIRA速查
    • 虚拟环境思路
GitHub (opens new window)

JaneTTR

数据酿造智慧,每一滴都是沉淀!
首页
  • 产品中心

    • 当前版本
    • 版本矩阵与下载
  • 安装与使用

    • Ambari Plus 安装
      • 安装前准备
        • 实施总览
        • Step0—源码包下载与目录准备
        • Step1—系统源与基础工具准备
        • Step2—集群免密登录
        • Step3—主机名解析同步
        • Step4—Chrony 时间同步
        • Step5—Nginx 本地 Yum 文件服务
        • Step6—JDK 双环境准备
        • Step7—MySQL 驱动与本地仓库
        • Step8—MariaDB 初始化
        • Step9—AmbariServer 初始化
        • 必须 ambari plus 数据库初始化文件
      • 安装部署
        • 初始化集群
    • 组件安装
      • 组件安装总览
      • Solr 安装
      • Ranger 安装
      • Knox 安装
      • HDFS 安装
      • YARN 安装
      • MapReduce2 安装
      • Tez 安装
      • Hive 安装
      • Sqoop 安装
      • HBase 安装
      • Kafka 安装
      • Flink 安装
      • Spark 安装
      • Hue 安装
      • Livy 安装
      • Zeppelin 安装
      • DolphinScheduler 安装
      • Doris 安装
      • Celeborn 安装
      • Ozone 安装
      • Impala 安装
      • Trino 安装
      • Paimon 安装
      • Hudi 安装
      • Atlas 安装
      • Superset 安装
      • Alluxio 安装
    • 开启高可用
      • 开启高可用总览
      • HDFS 开启 HA
      • YARN 开启 HA
    • 权限与审计
      • 权限与审计总览
      • Kerberos 认证启用
      • LDAP 目录接入
    • Ambari Plus Monitor
      • IoTDB 安装与部署
      • 必须 ambari plus monitor 数据库初始化文件
      • Monitor 安装
      • 监控与告警使用
    • 常见问题
      • 安装使用常见问题
  • 发布与支持

    • 更新日志
    • 服务说明
    • 优惠政策
    • 合作共建
    • 蓝图愿景
    • 历史版本
      • 更新日志 · v2.2.3
      • 更新日志 · v2.2.2
      • 更新日志 · v2.2.1
      • 更新日志 · v2.2.0
      • 更新日志 · v2.1.0
      • 更新日志 · v2.0.0
      • 更新日志 · v1.0.7
      • 更新日志 · v1.0.6
      • 更新日志 · v1.0.5
      • 更新日志 · v1.0.4
      • 更新日志 · v1.0.3
      • 更新日志 · v1.0.2
      • 更新日志 · v1.0.1
      • 更新日志 · v1.0.0
  • 会员与访问

    • 专属内容解锁
  • Ambari 安装

    • 常规安装
      • 适用于Ambari3.0.0-kylin V10-aarch64
        • Step0—源码包下载
        • Step1—基础环境准备
        • Step2—免密登录配置
        • Step3—安装JDK-Bisheng
        • Step5—Nginx安装
        • Step6—本地yum源配置
        • Step7—Mariadb初始化
        • Step8—AmbariServer初始化
        • Step9—Ambari Web UI 初始化安装
        • [快速安装]—脚本极速部署
      • 适用于Ambari3.0.0-kylin V10-x86_64
        • Step0—源码包下载
        • Step1—基础环境准备
        • Step2—免密登录配置
        • Step3—安装JDK17与JDK1.8
        • Step5—Nginx安装
        • Step6—本地yum源配置
        • Step7—Mariadb初始化
        • Step8—AmbariServer初始化
        • Step9—Ambari Web UI 初始化安装
        • [快速安装]—脚本极速部署
      • 适用于Ambari3.0.0-ubuntu22.04
        • Step0—源码包下载
        • Step1—基础环境准备
        • Step3—安装JDK17与JDK1.8
        • Step4—时间同步(Chrony)
        • Step5—Nginx安装
        • Step6—本地apt源
        • Step7—Mariadb初始化
        • Step8—AmbariServer初始化
        • Step9—Ambari Web UI 初始化安装
        • [快速安装]—脚本极速部署
      • 适用于Ambari3.0.0-el7
        • Step0—源码包下载
        • Step3—安装JDK17(Ambari 3.0专用)
        • Step8—AmbariServer初始化
        • Step9—Ambari Web UI 初始化安装
        • [快速安装]—脚本极速部署
      • 适用于Ambari3.0.0-el8
        • Step0—源码包下载
        • Step1—基础环境准备
        • Step3—安装JDK17与JDK1.8
        • Step7—Mariadb初始化
        • Step8—AmbariServer初始化
        • Step9—Ambari Web UI 初始化安装
        • [快速安装]—脚本极速部署
      • 适用于Ambari2.8.0-el7
        • Step1—基础环境准备
        • Step2—免密登陆认证
        • Step3—安装JDK
        • Step4—时间同步(Chrony)
        • Step5—Nginx安装
        • Step6—本地yum源配置
        • Step7—Mariadb初始化
        • Step8—AmbariServer初始化
        • Step9—Ambari Web Ui 初始化安装
    • 一键部署
      • Ambari快速部署—3.0.0
        • 【Kylin V10 aarch64】强力卸载脚本
        • 【Kylin V10 aarch64】自动安装脚本
        • 【Kylin V10 x86_64】强力卸载脚本
        • 【Kylin V10 x86_64】自动安装脚本
        • 【Ubuntu22】强力卸载脚本
        • 【Ubuntu22】自动安装脚本
        • 【Rocky8.10】强力卸载脚本
        • 【Rocky8.10】自动安装脚本
        • 【Centos7.9】自动安装脚本
      • Ambari快速部署—2.8.0
        • 【Centos7.9】自动安装脚本
        • 【Centos7.9】强力卸载脚本
      • 数据库环境
        • PostgreSQL 快速安装脚本
      • JDK环境
        • 安装JDK1.8
        • 安装JDK 17
        • 安装JDK1.8-aarch64
        • 安装JDK 17-aarch64
      • MAVEN环境
        • 安装Maven3.8.4
        • 安装Maven3.9.9
      • GRADLE环境
        • 安装Gradle5.6.4
      • CONDA环境
        • 安装Miniconda2
        • 编译Ambari2.8.0——Miniconda3
      • R环境
        • 【Kylin V10 x86_64】安装R 4.4.2
        • 【Ubuntu22】安装R 4.4.2
        • 【Rocky8.10】安装R 4.4.2
        • 【CentOS7】安装R 4.4.2
  • 组件安装

    • 安装指导
    • 魔改分享
      • Phoenix-JDK17下编译的二进制包适用于Datagrip
        • Q: 高版本 DataGrip 无法使用 Phoenix 驱动
        • A: Phoenix - JDK17 制作&下载
    • 最小化安装(简单)
      • Zookeeper 安装
      • Hadoop 安装
      • Yarn安装
      • Hive 安装
      • Spark 安装
      • HBase 安装
      • Kafka 安装
      • Sqoop 安装
      • Flink 安装
      • DolphinScheduler 安装
      • Zeppelin 安装
      • Redis 安装
      • Doris安装
      • Celeborn安装
      • Ozone安装
      • Impala安装
      • Cloudbeaver 安装
      • Ambari Metrics安装
      • Solr安装
      • Ranger 安装
      • Trino安装
      • Paimon安装
      • Hudi安装
      • Atlas 安装
      • Superset 安装
      • Livy 安装
      • Alluxio 安装
      • Hue 安装
      • Knox 安装
    • 进阶安装技巧(需开启Kerberos)
      • Ambari Metrics 进阶安装技巧
      • Atlas 进阶安装技巧
    • 高可用安装(有难度)
      • Zookeeper
      • Hadoop-Namenode
      • Yarn-ResourceManager
      • Hive
      • Hbase
      • Kafka
      • DolphinScheduler
      • Redis
      • Doris
      • Celeborn
      • Ozone
      • Ranger
  • Kerberos 旧版专题

    • 实战 Kerberos
    • 自建 Kerberos
      • KDC服务初始化安装
        • KDC服务初始化安装(RHEL篇)
        • KDC服务初始化安装(Ubuntu篇)
      • 开启Kerberos认证
        • Ambari 中开启 Kerberos 认证流程详解
        • [不看会报错]-Atlas开启准备工作
        • [不看会报错]-Zeppelin开启准备工作
        • [不看会报错]-Impala开启准备工作
        • [不看会报错]-Trino开启准备工作
      • 关闭Kerberos认证
        • Ambari 中关闭 Kerberos 认证流程详解
    • FreeIPA 认证
      • FreeIPA服务端初始化
        • FreeIPA Server 安装指导
      • FreeIPA客户端初始化及Ambari开启IPA认证
        • [Step1]-FreeIPA Client 安装与入域实战
        • [Step2]-FreeIPA 初始化核心用户
        • [Step3]-Ambari 中开启 Kerberos 认证流程详解
        • [Step3-1]-krb5-conf template调整
      • 部分踩坑-问题发现
        • Ambari Server 启动失败:no valid keystore
        • FreeIPA Client 导致 Ambari 权限异常问题排查
      • 部分踩坑-完美解决
        • Ambari Server 启动失败:no valid keystore
      • 辅助测试
        • FreeIPA Client 调试安装速记
        • Ambari Server 证书调试安装速记
    • 其他优化技巧
      • Atlas-Ranger-StringUtils缺失
      • Atlas-Ranger-commons-compress缺失
    • 部分组件踩坑合集
      • Test Kerberos Client报错:Failed to kinit
      • KERBEROS SERVICE CHECK 报错
      • Ambari开启Kerberos认证加密类型错误
      • [开启Kerberos]-Solr启动失败处理
      • [开启Kerberos]-Kafka启动失败处理
      • [开启Kerberos]-Atlas启动-Hbase权限异常
      • [开启Kerberos]-Atlas启动-Solr权限异常
      • [开启Kerberos]-Atlas启动-Kafka权限异常
      • [开启Kerberos]-Hive服务检查异常处理
      • [开启Kerberos]-Trino启动-配置文件处理
      • [开启Kerberos]-Trino启动-缺失PEM证书处理
      • [开启Kerberos]-Trino启动-连接Hive失败
      • [关闭 Kerberos]-Kafka 注销异常
      • [关闭 Kerberos]-Hive 注销异常
      • Kerberos 客户端模板渲染异常处理(临时处理)
      • Kafka 启动兼容 Kerberos 源码级修改
      • Kerberos 客户端模板渲染异常处理(源码修改)
    • 实战技巧
      • Knox 接入 Trino web-ui 解决方案
      • [开启Kerberos]-Trino启动-配置模板
      • [Knox适配]-Trino-474-转发规则魔改
    • 其他技巧
      • Ambari Security 开启步骤
  • Ranger 旧版专题

    • 实战 Ranger
    • Ranger HA 旧发行版
      • 环境准备
        • [Step1] Haproxy 规划与环境安装
      • Kerberos准备
        • [Step2] 统一访问域名的 Kerberos 票据生成
        • [Step3] 调整 Kerberos Client 配置
      • 安装指导
        • [Step4] Ambari页面开启 Ranger Admin 高可用
        • [Step5] 对齐 Ranger HA 的凭证处理
    • Ranger HA ttr-release
      • [Step2] Ranger Admin HA 自动化安装
    • FreeIPA 与 LDAP
      • [Step1] Ambari 安装 Ranger 并配置 FreeIPA + LDAP
      • [Step2] 制作 Ranger Usersync 证书并应用组件
      • [Step3] 制作 Ranger Admin 证书并应用组件
      • [Step4]Ranger HDFS Repository 创建失败修复
      • [Step5]Ranger HBase Repository 创建失败修复
    • 踩坑汇总
      • 调用 Ranger API 返回 403 问题
      • Ranger Admin LDAP 认证报 Bad credentials 分析
    • 解决方案
      • Ranger Admin LDAP 认证报 Bad credentials 处理
      • Ranger HA 虚拟域名 Principal 缺失修复
      • Ranger Usersync 证书快速导入脚本(LDAPS)
      • Ranger Admin 证书快速导入脚本
      • Ranger HDFS Repository 快速处理
      • Ranger HBase / Yarn Repository 快速处理
  • 开发环境

    • Ambari-Env
      • 环境准备
      • 开始使用
    • 工具与镜像
      • Maven镜像加速
      • Gradle镜像加速
      • Node.js 多版本共存方案
      • Npm镜像加速
      • Bower镜像加速
      • R环境安装+一键安装脚本
      • PostgreSQL 快速安装
  • Ambari 编译

    • Ambari 源码编译
    • 前端开发
    • 后端开发
    • Ambari Web本地启动
  • Bigtop 编译

    • 官方组件编译
    • 扩展组件编译
    • 工具与镜像
      • Ivy配置私有镜像仓库
      • APT仓库增量更新
      • Temurin JDK 23快速安装
  • Ambari 深度专题

    • Ambari Server 原理
    • Ambari Metrics 解读
  • Bigtop 方法论

    • Bigtop 深度专题
  • 自定义集成

    • Redis集成教学
    • Dolphin集成教学
    • Doris集成教学
    • 各组件代码
    • 通用代码模板
  • 报错解决

    • Ambari 报错
      • Ambari Views
        • MDEP-187 从根因到修复
        • Loading node labels问题解决
      • Ambari
        • phantomjs下载失败问题
        • 编译问题:GCC 安装与配置
        • bower CERT_HAS_EXPIRED 错误问题
        • Ambari-admin包出现bower install错误
        • Cannot run program "rpmbuild"
        • Python: No such file or directory
        • Yarn解压报错EOFException排查与解决
        • Rpm-maven-plugin与shebang兼容性报错
        • Rpm-maven-plugin 最佳实践
        • Bower install拉取失败解决
        • 缺少 python3 报错解决
        • Python(>=2.6) but is not installed
        • SSL_ERROR_SYSCALL 的修复方法
      • Ambari-infra
        • org.apache.commons.io does not exist
        • maven-compiler-plugin:3.3:compile
        • java.security.InvalidAlgorithmParameterException
        • ambari-infra-solr-plugin依赖报错解决方案
      • Ambari-metrics
        • psutil 缺失与 archive_util 导入错误
        • Ambari-Metrics Monitor 启动失败
        • Ambari-Metrics Monitor 启动失败
        • Ambari-Metrics Monitor 启动失败
        • Ambari-Metrics Monitor 启动失败
    • Bigtop 报错
      • Hadoop
        • /usr/bin/env: python3: No such file or directory 问题
        • error [email protected]: The engine "node" is incompatible with this module 错误
        • CMake 3.1 or higher is required. You are running version 2.8.12.2 错误
        • fuse is needed by hadoop_3_2_0-3.3.4-1.el7.x86_64 错误
        • Cyrus SASL/GSASL 缺失解决
        • Protobuf PROTOC LIBRARY NOTFOUND
        • EVP CIPHER CTX block size 报错
        • TIRPC_INCLUDE_DIRS NOTFOUND解决
        • 缺失 redhat-rpm-config 报错
      • Spark
        • evaluate,httr2,knitr 包不存在解决办法
        • Pandoc 缺失导致 SparkR 构建失败
      • Trino
        • Trino requires Temurin or Oracle JDK for development
        • GLIBC 与 GLIBCXX 版本过低
      • Hudi
        • javax.annotation.Nullable 缺失
        • 缺失 everit-json-schema 依赖
      • Paimon
        • 缺失 Jindo 依赖
      • Livy
        • apache-incubator-disclaimer-resource-bundle 缺失
      • Flink
        • .git can't be found during `prepare`
        • Angular CLI requires Node >=14.15
        • npm run ci-check 报错退出码 3
        • TypeScript 类型声明错误
      • Atlas
        • Atlas 集成 JanusGraph 启动时报 Solr6Index 实例化失败解决
      • Superset
        • urllib3 v2 only supports OpenSSL 1.1.1+
      • Jsvc
        • jsvc 依赖缺失导致 rpm 构建失败
      • Zookeeper
        • ZooKeeper 构建(缺少 hostname 命令)
        • cppunit-devel 依赖缺失解决方案
      • Hive
        • org.apache.logging.slf4j.Log4j.Marker is not public 解决方案
      • Sqoop
        • xmlto is needed by 解决方法
        • lsb_release、rsync 缺失导致构建中断
        • asciidoc 警告与 relnotes.py 语法不兼容分析
      • Cloudbeaver
        • SelectExpressionItem cannot be resolved 报错分析
      • Bigtop-select
        • bigtop-select 打包缺 compat 报错修复
        • bigtop-select 打包缺 control 文件报错修复
      • Knox
        • xmlsectool 依赖缺失问题解析
        • webhdfs-test 依赖收敛冲突问题处理
        • Invalid keystore format 问题处理
        • Knox is not allowed to impersonate admin
        • X-Forwarded-For 406 错误的原因与处理
      • Hue
        • Hue 访问 Hadoop 权限问题
        • Hue 访问 Yarn 权限问题
        • Hue 访问 Impala 时间格式问题
        • requests-kerberos 兼容性问题
        • libmariadb.so.3 缺失导致 syncdb 失败
        • 生产环境下解决方案——Hue/query_api.py
  • 系统适配

    • Kylin V10系列
      • 通用部分
        • not set for current OS
          • 解读-不支持操作系统解读
          • 解决-增加系统支持范围(一)
          • 解决-增加系统支持范围(二)
          • 解决-增加系统支持范围(三)
          • 解决-增加系统支持范围(四)
        • 解决-TLS1.3导致依赖下载失败终极办法
    • Rocky系列
      • 案例-Ambari重启失败
        • 解读-Ambari3.0.0重启失败问题
        • 解决-追加日志锚点
        • 解决-进一步分析与改造[一]
        • 解决-进一步分析与改造[二]
      • 案例-数据库连接问题
        • 解读-安装完毕后出现Unable to load version data from server
      • 案例-日志级别控制问题
        • 解读-Ambari3.0.0无法调整日志输出级别
        • 解决-临时处理日志级别不生效
        • 解决-源码级处理日志不生效
      • 案例-找不到snappy-devel
        • 解决-HDFS报snappy-devel包缺失现象
      • 案例-编译高级功能
        • 解读-开启Hadoop下ISAL-L和PMDK功能
        • 解决-ISAL-L和PMDK功能完整环境包
    • Ubuntu系列
      • 案例-首次编译环境处理
        • 解决-dpkg-buildpackage依赖缺失
        • 解决-devscripts依赖缺失
        • 首次编译-环境初始化
      • 案例-Bigtop适配Debian
        • 解读-bigtop-select支持deb
        • 解决-Step1-解除限制拥抱deb
        • 解决-Step2-补全代码结构
      • 案例-安装中遇到的问题
        • 解读-APT私有镜像验证失败剖析
        • 解决-快速处理APT私有镜像验证失败问题
      • 案例-编译高级功能
        • 解读-开启Hadoop下ISAL-L和PMDK功能
        • 解决-ISAL-L和PMDK功能完整环境包
    • Centos系列
    • OpenEuler系列
  • 监控与调优

    • Ambari-Metrics插件
    • Infinity插件
      • 准备工作
        • Ambari-Metrics插件失效原因
        • Infinity 插件选择与安装小技巧
        • Grafana9.3.2+Infinity2.3.1
          • Grafana快速安装Infinity插件
        • Grafana11.5.2+Infinity3.4.1
          • Grafana快速安装Infinity插件
      • 创建最简DEMO
        • Grafana9.3.2+Infinity2.3.1
          • 快速创建一个简单demo
          • Panel JSON 配置示例
        • Grafana11.5.2+Infinity3.4.1
          • 快速创建一个简单demo
          • Panel JSON 配置示例
    • 组件配置调优
      • HDFS
        • [0001]访问 HDFS Web UI Logs Unauthorized 失败
        • [0001]>>>>>>Hadoop管理员配置优化
      • RANGER
        • [0002]Ranger 审计日志时间与系统时间不一致调整
        • [0002]>>>>>日期统一规则调优
        • [0001]Resource lookup fail 线程池超时优化
        • [0001]>>>>>>线程池与超时参数调优
    • 组件调优指南
    • 1v1指导调优
  • BUG临时处理

    • 版本-v2.2.2-以前
      • [22213]Ambari 3.0.0 滚动重启只执行一台主机修复
      • [22213]解决办法
      • [22212]Ambari 3.0.0 左侧服务菜单滚动条缺失修复
      • [22212]解决办法
      • [22211]Atlas 缺失 __AtlasUserProfile
      • [22211]解决办法
      • [22210]Atlas Hook 无权限访问 Kafka Topic
      • [22210]解决办法
      • [22209]Ranger Kafka Lookup 缺少 JAAS 配置
      • [22209]解决办法
      • [22208]Atlas Hook 消费 Kafka 报错
      • [22208]解决办法
      • [22207]Hue 内访问 SparkSql 失败
      • [22207]解决办法
      • [22206]Ranger 调用 Knox Topologies 失败
      • [22206]解决办法
      • [22205]Ranger Admin 轮刷ZK 缺失 JAAS
      • [22205]解决办法
      • [22204]KNOX policymgr-ssl 启动告警
      • [22204]解决办法
      • [22203]Hue 服务启动后秒退
      • [22203]解决办法
      • [22202]Hue 启动失败: hadoop 用户不存在
      • [22202]解决办法
      • [22201]Hive 使用 Tez 引擎插入数据失败
      • [22201]解决办法
    • 版本-v2.1.0-以前
      • Sqlline 启动卡死问题处理
  • 实验室

    • VIEW插件
      • CAPACITY-SCHEDULER-VIEW
        • Ambari CAPACITY-SCHEDULER 插件安装详解
      • FILE-VIEW
        • Ambari FILE-VIEW 插件安装详解
    • JIRA速查
    • 虚拟环境思路
GitHub (opens new window)
  • Ambari 深度专题

  • Bigtop 方法论

  • 自定义集成

  • Ambari Server 与 Web

  • Ambari Metrics

  • Redis集成实战

    • Bigtop通用部分

    • Bigtop打包部分

    • Ambari部分

      • Step10-Stacks-包结构
      • Step11-Stacks-组件编排
      • Step12-Stacks-配置文件
      • Step13-Stacks-模板文件
      • Step14-Scripts-环境变量
      • Step15-Scripts-执行逻辑
        • 1. 结构理念与自动化运行策略
        • 2. redis_client.py:客户端脚本
          • 2.1 设计目标与核心实现
          • 主要方法
          • 2.2 完整代码
        • 3. redis_master.py:主节点脚本
          • 3.1 设计目标
          • 3.2 关键方法分解
          • 安装与配置
          • 启动、停止、重启与状态检测
          • 3.3 完整的代码
        • 4. redis_slave.py:从节点+集群编排核心
          • 4.1 设计目标
          • 4.2 关键方法分解
          • 安装与配置
          • 启动与集群智能编排
          • 集群初始化与主从自动挂载
          • 自动反亲和、动态分布算法
          • 停止、重启与状态检测
          • 4.3 完整代码
      • Step16-Scripts-服务检查
      • Step17-Scripts-组件优先级
      • Step18-衔接-打通Ambari与Bigtop
  • 通用代码模板

  • 各组件代码

  • 技术专题
  • Redis集成实战
  • Ambari部分
JaneTTR
2025-06-24
目录

Step15-Scripts-执行逻辑

# 1. 结构理念与自动化运行策略

Redis 集群集成方案强调三层分工:主节点、从节点、客户端。通过自动化脚本,批量实现服务分层管理、反亲和主从调度与集群自愈。

Redis集群主从分布及自动编排示意

# 2. redis_client.py:客户端脚本

# 2.1 设计目标与核心实现

客户端角色以极简无状态为原则,只负责部署 redis-cli 工具等依赖包,无需守护进程、启动、停止或配置管理。这样做最大程度减少了运维复杂度,并支持大规模批量推送。

# 主要方法

class RedisClient(Script):
    def install(self, env):
        Logger.info("Installing Redis Client...")
        self.install_packages(env)
        Logger.info("Redis Client installation completed.")

    def configure(self, env):
        Logger.info("Redis Client does not require configuration.")
    # start/stop/status 均为空实现
1
2
3
4
5
6
7
8
9
  • install 负责调用环境自带的依赖包安装函数,保障 cli 工具包随需分发。
  • configure/start/stop/status 均为“占位符”,仅记录日志说明客户端本身不涉及服务进程与配置,避免复杂性。
  • 这样,客户端既不产生多余资源消耗,也不会和服务端逻辑耦合,非常适合各种调试、监控和工具化场景。

# 2.2 完整代码

# coding=utf-8
# redis_client.py manages the Redis Client component in Ambari.

from resource_management.core.logger import Logger
from resource_management.libraries.script.script import Script


class RedisClient(Script):
    def install(self, env):
        """
        安装 Redis 客户端包
        """
        Logger.info("Installing Redis Client...")
        self.install_packages(env)
        Logger.info("Redis Client installation completed.")

    def configure(self, env):
        """
        Redis 客户端不需要特定的配置。
        """
        Logger.info("Redis Client does not require configuration.")
    #
    # def start(self, env):
    #     """
    #     Redis 客户端不需要启动命令。
    #     """
    #     Logger.info("Redis Client does not have a start command, as it is only a client.")
    #
    # def stop(self, env):
    #     """
    #     Redis 客户端不需要停止命令。
    #     """
    #     Logger.info("Redis Client does not have a stop command, as it is only a client.")
    #
    # def status(self, env):
    #     """
    #     Redis 客户端没有状态检查。
    #     """
    #     Logger.info("Redis Client does not have a status check, as it is only a client.")


if __name__ == "__main__":
    RedisClient().execute()

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

# 3. redis_master.py:主节点脚本

# 3.1 设计目标

主节点的定位很明确:专注本地 Redis 服务进程的全生命周期管理。所有参数都由 Ambari 配置中心自动注入,所有操作均和本地 Redis 服务进程绑定。

# 3.2 关键方法分解

# 安装与配置

def install(self, env):
    self.install_packages(env)
    self.configure(env)

def configure(self, env):
    import params
    env.set_params(params)
    Directory([params.redis_log_dir, params.redis_data_dir, params.redis_pid_dir],
              owner=params.redis_user,
              group=params.user_group,
              mode=0o755,
              create_parents=True)
    File(
        os.path.join(params.redis_conf_parent, "redis.conf"),
        content=Template("redis.conf.j2"),
        owner=params.redis_user,
        group=params.user_group,
        mode=0o644)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  • 安装阶段自动调用系统包管理、拉取依赖。
  • 配置阶段按参数生成所有目录(日志/数据/PID),并渲染下发 redis.conf 配置文件,确保多节点多实例安全隔离。

# 启动、停止、重启与状态检测

def start(self, env):
    self.configure(env)
    Execute(format(
        "{client_bin}/redis-server /etc/redis/redis.conf --cluster-config-file /etc/redis/cluster_master.conf --pidfile {master_redis_pid_file}"),
        user=params.redis_user)

def stop(self, env):
    self.configure(env)
    try:
        Execute(format("kill -9 `cat {master_redis_pid_file}`"),
                user=params.redis_user)
    except:
        Logger.warning("Failed to stop Redis Master using the PID file.")
    self.ensure_stopped(env)

def ensure_stopped(self, env):
    # 多轮检测进程是否完全关闭,提升健壮性

def restart(self, env):
    self.stop(env)
    time.sleep(5)
    self.start(env)

def status(self, env):
    import params
    check_process_status(params.master_redis_pid_file)
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
  • 启动流程明确指定配置、PID、集群文件,避免进程互相干扰。
  • 停止流程通过 kill -9 强制杀死进程,再通过 PID 文件轮询保证彻底清理。
  • restart 方法封装了完整生命周期闭环。
  • 所有主节点只专注本地服务,不参与集群初始化和 slot 分配,职责高度聚焦,方便批量管理和滚动升级。

# 3.3 完整的代码

# coding=utf-8
import os
import time
from resource_management import Template
from resource_management.core.logger import Logger
from resource_management.core.resources.system import Execute, File, Directory
from resource_management.libraries.functions.check_process_status import check_process_status
from resource_management.libraries.functions.format import format
from resource_management.libraries.script.script import Script


class RedisMaster(Script):
    def install(self, env):
        # 安装 Redis 包
        self.install_packages(env)
        self.configure(env)

    def configure(self, env):
        import params
        env.set_params(params)

        # 创建日志、数据和 PID 目录,并设置适当的权限
        Directory([params.redis_log_dir, params.redis_data_dir, params.redis_pid_dir],
                  owner=params.redis_user,
                  group=params.user_group,
                  mode=0o755,
                  create_parents=True)

        # 生成 redis.conf 配置文件
        File(
            os.path.join(params.redis_conf_parent, "redis.conf"),
            content=Template("redis.conf.j2"),
            owner=params.redis_user,
            group=params.user_group,
            mode=0o644)

    def start(self, env):
        import params
        self.configure(env)

        Logger.info(format("Starting Redis Master on port {redis_port}"))

        # 启动 Redis Master,不处理集群逻辑
        Execute(format(
            "{client_bin}/redis-server /etc/redis/redis.conf --cluster-config-file /etc/redis/cluster_master.conf --pidfile {master_redis_pid_file}"),
            user=params.redis_user)

    def stop(self, env):
        import params
        self.configure(env)

        Logger.info("Stopping Redis Master using its PID file...")

        # 使用 PID 文件来停止 Redis Master 进程
        try:
            Execute(format("kill -9 `cat {master_redis_pid_file}`"),
                    user=params.redis_user)
            Logger.info("Redis Master stopped successfully.")
        except:
            Logger.warning("Failed to stop Redis Master using the PID file.")

        # 确保 Redis Master 完全停止
        self.ensure_stopped(env)

    def ensure_stopped(self, env):
        """
        确保 Redis Master 服务已完全停止。如果 Redis 进程还在运行,等待它完全关闭。
        """
        Logger.info("Checking if Redis Master is fully stopped...")

        retries = 5
        retry_delay = 2  # 每隔2秒检查一次

        for attempt in range(retries):
            try:
                check_process_status("{master_redis_pid_file}")
                Logger.info("Redis Master is still running (attempt {}/{}). Waiting...".format(attempt + 1, retries))
                time.sleep(retry_delay)
            except:
                Logger.info("Redis Master has been successfully stopped.")
                return

        Logger.error("Redis Master failed to stop after retries.")
        raise Exception("Redis Master process could not be stopped.")

    def restart(self, env):
        """
        重新启动 Redis Master 服务。先调用 stop 方法停止服务,然后调用 start 方法重新启动服务。
        增加等待时间和进程状态检查,确保服务能够正确停止和重启。
        """
        Logger.info("Restarting Redis Master...")

        # 先停止服务
        self.stop(env)

        # 等待几秒钟,确保 Redis 进程已经彻底关闭
        time.sleep(5)

        # 再启动服务
        self.start(env)

        Logger.info("Redis Master restarted successfully.")

    def status(self, env):
        import params
        check_process_status(params.master_redis_pid_file)


if __name__ == "__main__":
    RedisMaster().execute()

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

# 4. redis_slave.py:从节点+集群编排核心

# 4.1 设计目标

从节点既是 Redis 本地服务的守护者,更是整个集群自动化编排的核心枢纽。它不仅要完成自身进程的标准运维,还要负责整个 Redis 集群的初始化、slot 分配、主从动态绑定和反亲和分布。

# 4.2 关键方法分解

# 安装与配置

def install(self, env):
    self.install_packages(env)
    self.configure(env)

def configure(self, env):
    import params
    env.set_params(params)
    Directory([params.redis_log_dir, params.redis_data_dir, params.redis_pid_dir],
              owner=params.redis_user,
              group=params.user_group,
              mode=0o755,
              create_parents=True)
    File("/etc/redis/redis.conf",
         content=Template("redis.conf.j2"),
         owner=params.redis_user,
         group=params.user_group,
         mode=0o644)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  • 和 master 一致,标准的目录、权限和配置文件生成。

# 启动与集群智能编排

def start(self, env):
    self.configure(env)
    slave_port = int(params.redis_port) + 1
    Execute(format(
        "{client_bin}/redis-server /etc/redis/redis.conf --port {slave_port} --cluster-config-file /etc/redis/cluster_slave.conf --pidfile {slave_redis_pid_file} --masterauth {redis_password}"),
        user=params.redis_user)
    self.initialize_or_expand_cluster(params)
1
2
3
4
5
6
7
  • 启动 Slave 时会自动使用独立端口、PID、配置,保证与 Master 并存。
  • 启动后立即进入 initialize_or_expand_cluster,自动判断当前集群状态并做初始化/扩容。

# 集群初始化与主从自动挂载

def initialize_or_expand_cluster(self, params):
    code, output = shell.call(
        format("{client_bin}/redis-cli -p {params.redis_port} -a {redis_password} cluster nodes"),
        user=params.redis_user)
    filtered_output = [line for line in output.splitlines() if "Warning" not in line]
    if code == 0 and len(filtered_output) > 1:
        self.add_slave_to_master(params)
    elif len(filtered_output) == 1:
        self.initialize_cluster_and_assign_slots(params)
        self.add_current_node_to_cluster(params)
    else:
        Logger.warning("Cluster is not initialized (attempt {}/{}).".format(attempt + 1, retries))
        time.sleep(retry_delay)
1
2
3
4
5
6
7
8
9
10
11
12
13
  • 检查当前集群节点数量,自动区分“已初始化”或“需初始化”状态。
  • 已初始化:自动将本节点作为新 Slave 挂到合适 Master 下。
  • 未初始化:直接发起主节点集群组建、slot 分配,然后将本 Slave 节点自动加入。

# 自动反亲和、动态分布算法

def get_assigned_master(self, params):
    master_hosts = params.redis_master_hosts
    current_slave_index = int(params.redis_port) % len(master_hosts)
    assigned_master_index = (current_slave_index + 1) % len(master_hosts)
    assigned_master = master_hosts[assigned_master_index]
    return assigned_master
1
2
3
4
5
6
  • 动态分配算法,根据当前集群全局状态和端口号,将新 Slave 挂载到不同 Master,最大化主从分布打散,防止主从同机。
  • 新节点扩容时也自动适配,不需人肉干预。

# 停止、重启与状态检测

def stop(self, env):
    self.configure(env)
    try:
        Execute(format("kill -9 `cat {slave_redis_pid_file}`"),
                user=params.redis_user)
    except:
        Logger.warning("Failed to stop Redis Slave using the PID file.")
    self.ensure_stopped(env)

def ensure_stopped(self, env):
    # 检查进程彻底关闭

def restart(self, env):
    self.stop(env)
    time.sleep(5)
    self.start(env)

def status(self, env):
    import params
    check_process_status(params.slave_redis_pid_file)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
  • 标准的生命周期管理,流程与主节点一致。

# 4.3 完整代码

# coding=utf-8
import socket
import subprocess
import time

from resource_management import Template
from resource_management.core import shell
from resource_management.core.logger import Logger
from resource_management.core.resources.system import Execute, File, Directory
from resource_management.libraries.functions.check_process_status import check_process_status
from resource_management.libraries.functions.format import format
from resource_management.libraries.script.script import Script


class RedisSlave(Script):
    def install(self, env):
        # 安装 Redis 包
        self.install_packages(env)
        self.configure(env)

    def configure(self, env):
        import params
        env.set_params(params)

        # 创建日志、数据和 PID 目录,并设置适当的权限
        Directory([params.redis_log_dir, params.redis_data_dir, params.redis_pid_dir],
                  owner=params.redis_user,
                  group=params.user_group,
                  mode=0o755,
                  create_parents=True)

        # 生成 redis.conf 配置文件
        File("/etc/redis/redis.conf",
             content=Template("redis.conf.j2"),
             owner=params.redis_user,
             group=params.user_group,
             mode=0o644)

    def start(self, env):
        import params
        self.configure(env)

        slave_port = int(params.redis_port) + 1
        Logger.info(format("Starting Redis Slave on port {slave_port}"))

        # 启动 Redis Slave,并显式指定 pidfile
        Execute(format(
            "{client_bin}/redis-server /etc/redis/redis.conf --port {slave_port} --cluster-config-file /etc/redis/cluster_slave.conf --pidfile {slave_redis_pid_file} --masterauth {redis_password}"),
            user=params.redis_user)

        # 检查并处理集群逻辑,包括初始化集群和扩展
        self.initialize_or_expand_cluster(params)

    def stop(self, env):
        import params
        self.configure(env)

        Logger.info("Stopping Redis Slave using its PID file...")

        # 使用 PID 文件来停止 Redis Slave 进程,而不是直接通过 redis-cli shutdown
        try:
            Execute(format("kill -9 `cat {slave_redis_pid_file}`"),
                    user=params.redis_user)
            Logger.info("Redis Slave stopped successfully.")
        except:
            Logger.warning("Failed to stop Redis Slave using the PID file.")

        # 确保 Redis Slave 完全停止
        self.ensure_stopped(env)

    def ensure_stopped(self, env):
        """
        确保 Redis Slave 服务已完全停止。如果 Redis 进程还在运行,等待它完全关闭。
        """
        Logger.info("Checking if Redis Slave is fully stopped...")
        retries = 5
        retry_delay = 2  # 每隔2秒检查一次

        for attempt in range(retries):
            try:
                check_process_status("{slave_redis_pid_file}")
                Logger.info("Redis Slave is still running (attempt {}/{}). Waiting...".format(attempt + 1, retries))
                time.sleep(retry_delay)
            except:
                Logger.info("Redis Slave has been successfully stopped.")
                return

        Logger.error("Redis Slave failed to stop after retries.")
        raise Exception("Redis process could not be stopped.")

    def restart(self, env):
        """
        重新启动 Redis Slave 服务。先调用 stop 方法停止服务,然后调用 start 方法重新启动服务。
        增加等待时间和进程状态检查,确保服务能够正确停止和重启。
        """
        Logger.info("Restarting Redis Slave...")

        # 先停止服务
        self.stop(env)

        # 等待几秒钟,确保 Redis 进程已经彻底关闭
        time.sleep(5)

        # 再启动服务
        self.start(env)

        Logger.info("Redis Slave restarted successfully.")

    def status(self, env):
        import params
        check_process_status(params.slave_redis_pid_file)

    def initialize_or_expand_cluster(self, params):
        """
        在 Slave 启动时检查 Master 节点是否已经组成集群,如果没有则进行集群初始化。如果已经有集群,处理扩展。
        """
        retries = 5
        retry_delay = 10  # 秒

        Logger.info("Checking cluster status to determine if initialization or expansion is needed.")

        for attempt in range(retries):
            code, output = shell.call(
                format("{client_bin}/redis-cli -p {params.redis_port} -a {redis_password} cluster nodes"),
                user=params.redis_user)

            # 构建一个新数组,过滤掉包含 "Warning" 的行
            filtered_output = [line for line in output.splitlines() if "Warning" not in line]

            # 如果集群已经初始化,继续添加从节点
            if code == 0 and len(filtered_output) > 1:
                Logger.info("Cluster is already initialized. Proceeding with slave addition.")
                self.add_slave_to_master(params)
                return

            # 如果集群只有一个节点,执行集群初始化并将当前节点加入
            elif len(filtered_output) == 1:
                Logger.info(
                    "Cluster is not initialized. Initializing Redis Cluster with master nodes and assigning slots.")
                self.initialize_cluster_and_assign_slots(params)

                # 初始化集群后,将当前节点也作为集群的一部分加入
                Logger.info("Adding current node to the newly initialized cluster.")
                self.add_current_node_to_cluster(params)
                return

            else:
                Logger.warning("Cluster is not initialized (attempt {}/{}).".format(attempt + 1, retries))
                time.sleep(retry_delay)

        Logger.error("Cluster could not be initialized after retries.")
        raise Exception("Cluster in an inconsistent state.")

    def initialize_cluster_and_assign_slots(self, params):
        """
        初始化集群,组建 Master 节点之间的集群,并分配槽位(仅限首次初始化时)。
        """
        redis_port = int(params.redis_port) if isinstance(params.redis_port, str) else params.redis_port

        # 使用 Ambari 提供的 format 方法来格式化字符串
        master_hosts = [format("{host}:{redis_port}", host=host, redis_port=redis_port) for host in
                        params.redis_master_hosts]
        master_nodes_str = " ".join(master_hosts)

        Logger.info(format("Initializing Redis Cluster with master nodes: {master_nodes_str}"))

        # 使用 --cluster-replicas 0 来创建只有主节点的集群
        create_cluster_command = format(
            "{client_bin}/redis-cli --cluster create {master_nodes_str} --cluster-replicas 0 -a {redis_password} --cluster-yes")

        # 打印生成的集群创建命令
        Logger.info(format("Generated create_cluster_command: {create_cluster_command}"))

        try:
            # 使用 subprocess 来执行命令,捕获 stdout 和 stderr
            process = subprocess.Popen(create_cluster_command, shell=True, stdout=subprocess.PIPE,
                                       stderr=subprocess.STDOUT)
            stdout, _ = process.communicate()

            # 过滤掉警告信息,仅保留核心输出
            filtered_output = [line for line in stdout.decode('utf-8').splitlines() if "Warning" not in line]

            if process.returncode != 0 or not filtered_output:
                Logger.error("Failed to initialize Redis cluster. Error: {0}".format(filtered_output))
                raise Exception("Cluster initialization failed")

            Logger.info("Cluster initialized successfully.")
        except Exception as e:
            Logger.error("Failed to initialize Redis cluster: {0}".format(str(e)))
            raise

    def add_slave_to_master(self, params):
        """
        将新的 Slave 节点加入到集群,并明确指定它作为某个 Master 节点的从节点,确保反亲和性。
        之前添加前检查该从节点是否已经是集群的一部分。
        """
        slave_port = int(params.redis_port) + 1
        master_host = self.get_assigned_master(params)  # 获取合适的主节点,确保反亲和性

        # 先检查从节点是否已经在集群中
        if self.is_slave_already_in_cluster(params, slave_port):
            Logger.info(
                format("Redis Slave {params.hostname}:{slave_port} is already part of the cluster, skipping addition."))
            return

        Logger.info(format("Adding Redis Slave on port {slave_port} to master at {master_host}"))

        # 使用 -a 参数传递密码,明确指定将从节点加入到某个主节点下
        Execute(format(
            "{client_bin}/redis-cli --cluster add-node {params.hostname}:{slave_port} {master_host}:{params.redis_port} --cluster-slave -a {redis_password}"),
            user=params.redis_user)

        Logger.info("Slave node added to the cluster as a replica of master {master_host}. No need to rebalance slots.")

    def add_current_node_to_cluster(self, params):
        """
        将当前节点加入到集群中,确保当前节点成为集群的一部分。
        """
        slave_port = int(params.redis_port) + 1
        master_host = self.get_assigned_master(params)  # 获取合适的主节点

        Logger.info(format("Adding current Redis node on port {slave_port} to the newly initialized cluster."))

        Execute(format(
            "{client_bin}/redis-cli --cluster add-node {params.hostname}:{slave_port} {master_host}:{params.redis_port} --cluster-slave -a {redis_password}"),
            user=params.redis_user)

        Logger.info("Current node added to the cluster successfully.")

    def is_slave_already_in_cluster(self, params, slave_port):
        """
        检查 Redis 节点是否已经是集群的一部分,确保通过 IP 地址而非主机名进行匹配。
        """
        Logger.info(format("Checking if Redis Slave {params.hostname}:{slave_port} is already part of the cluster..."))

        # 将主机名解析为 IP 地址
        slave_ip = self.get_ip_from_hostname(params.hostname)

        if slave_ip is None:
            Logger.error("Failed to resolve hostname to IP for: {0}".format(params.hostname))
            return False

        # 使用 redis-cli 查询集群的所有节点
        code, output = shell.call(
            format("{client_bin}/redis-cli -p {params.redis_port} -a {redis_password} cluster nodes"),
            user=params.redis_user)

        if code != 0:
            Logger.warning("Failed to retrieve cluster nodes information.")
            return False

        # 检查输出,查看该从节点的 IP 地址是否已经在集群中
        for line in output.splitlines():
            if slave_ip in line and str(slave_port) in line:
                Logger.info("Redis Slave with IP {0} is already in the cluster: {1}".format(slave_ip, line))
                return True

        return False

    def get_assigned_master(self, params):
        """
        动态分配 Master 节点,确保新 Slave 节点配对到正确的 Master 节点,且遵循反亲和性原则。
        """
        master_hosts = params.redis_master_hosts
        Logger.info("Available Master nodes: {0}".format(master_hosts))

        # 获取当前主节点的索引
        current_slave_index = int(params.redis_port) % len(master_hosts)

        # 计算该从节点应当挂载的主节点
        assigned_master_index = (current_slave_index + 1) % len(master_hosts)
        assigned_master = master_hosts[assigned_master_index]

        Logger.info(format("Assigning Slave on port {params.redis_port} to Master {assigned_master}"))
        return assigned_master

    def get_ip_from_hostname(self, hostname):
        """
        使用 socket 库获取主机名对应的 IP 地址
        """
        try:
            ip_address = socket.gethostbyname(hostname)
            return ip_address
        except socket.error as e:
            Logger.error("Failed to resolve hostname {0}: {1}".format(hostname, str(e)))
            return None


if __name__ == "__main__":
    RedisSlave().execute()

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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
#Redis#Stack集成#集成案例#Bigtop#自动化部署#版本适配
Step14-Scripts-环境变量
Step16-Scripts-服务检查

← Step14-Scripts-环境变量 Step16-Scripts-服务检查→

最近更新
01
当前版本 2026/06
06-05
02
Step7—Mariadb初始化
03-23
03
【Kylin V10 aarch64】强力卸载脚本 aarch64
03-22
更多文章>
Theme by Vdoing | Copyright © 2017-2026 JaneTTR | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式