自顶向下——基于方法论下的Redis集成[四]
# 1.4 services/REDIS/package
结构说明
本节我们进入 Redis Ambari 集成的 service 包构建环节,核心位于 package/scripts/
和 package/templates/
目录下。
提示
Redis 的服务脚本通过继承 Ambari 的 Script
类来实现服务生命周期的控制,与此同时使用 params_linux.py
统一管理配置参数。
# 1.4.1 scripts/
目录结构详解
# 🧩 params_linux.py
:参数集中定义模块
作为配置桥梁,params_linux.py
从 Ambari 的 config 对象中读取 redis-env 和 redis-site 的参数:
# 从 redis-env.xml 中读取运行时参数
redis_user = config['configurations']['redis-env']['redis_user']
redis_port = config['configurations']['redis-env']['redis_port']
redis_log_dir = config['configurations']['redis-env']['redis_log_dir']
# 从 redis-site.xml 中读取集群配置
appendonly = config['configurations']['redis-site']['appendonly']
cluster_enabled = config['configurations']['redis-site']['cluster_enabled']
2
3
4
5
6
7
# 🧩 redis_client.py
:Redis 客户端组件
作为最简组件,Redis Client 脚本中只定义了安装行为,不涉及配置和启动。
def install(self, env):
Logger.info("Installing Redis Client...")
self.install_packages(env)
2
3
笔记
Ambari 会将 redis-cli 工具自动打入 client 包中,可用于集群调试或 CLI 操作。
# 🧩 redis_master.py
:主节点脚本
Redis Master 管理主节点的部署与运行,其 start()
方法通过 Execute
命令执行:
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)
2
3
此外,重启、状态检测和配置渲染也在此模块中封装,支持通过 PID 文件控制服务运行:
def ensure_stopped(self, env):
check_process_status("{master_redis_pid_file}")
2
注意
redis.conf
文件必须包含 cluster-enabled 配置,才能成功初始化 Redis 集群。
# 🧩 redis_slave.py
:从节点脚本(含集群逻辑)
Slave 节点的逻辑相对复杂,除了配置和启动外,还封装了自动判断是否需要初始化集群或扩容集群的能力:
def initialize_or_expand_cluster(self, params):
# 如果集群尚未初始化,则自动进行初始化
if len(filtered_output) == 1:
self.initialize_cluster_and_assign_slots(params)
self.add_current_node_to_cluster(params)
2
3
4
5
首次部署时,会自动通过 redis-cli --cluster create
初始化主节点集群:
create_cluster_command = format(
"{client_bin}/redis-cli --cluster create {master_nodes_str} --cluster-replicas 0 -a {redis_password} --cluster-yes")
2
而后续添加从节点则调用:
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)
2
3
若目标从节点已在集群中,脚本会跳过添加,避免重复注册。
# 🧩 service_check.py
:集群健康检查脚本
为了确保 Redis 集群运行稳定,我们定义了独立的服务检查脚本:
Execute(format("{client_bin}/redis-cli -p {redis_port} {password_option} cluster nodes"), user="redis")
Execute(format("{client_bin}/redis-cli -p {redis_port} {password_option} cluster info"), user="redis")
2
通过 cluster nodes
与 cluster info
命令,可对 Redis 集群节点状态、slot 分布、主从角色进行全链路验证。
提示
支持失败重试与日志记录,便于在 Ambari 服务检测失败时快速定位问题。
# 1.4.2 templates/
模板配置
redis.conf.j2
是 Redis 核心配置文件模板,支持动态参数替换。以下为核心字段展示:
# Redis端口及集群配置
port {{ redis_port }}
cluster-enabled {{ cluster_enabled }}
cluster-config-file {{ cluster_config_file }}
# 持久化配置
appendonly {{ appendonly }}
appendfilename "{{ appendfilename }}"
save {{ save_intervals }}
# 日志与密码配置
logfile {{ redis_log_dir }}/redis.log
requirepass {{ redis_password }}
2
3
4
5
6
7
8
9
10
11
12
13
所有参数均从 params_linux.py
中动态传入,确保 UI 修改可实时下发。