文章目录
- 服务运行脚本
- 安装服务(install)
- 配置加载(configure)
- 启动服务(start)
- 状态监测(status)
- 停止服务(stop)
- 重启服务(restart)
- 卸载服务
服务运行脚本
紧接上一章节,在metainfo.xml
中我们配置了需要安装的组件(FRONTEND和BACKEND),在component下的commandScript配置了服务安装、配置、启动、监听状态、停止、删除(卸载) 需要执行的函数。下面这个配置就是指定需要执行的脚本
<commandScript>
<script>scripts/be.py</script>
<scriptType>PYTHON</scriptType>
<timeout>1200</timeout>
</commandScript>
be.py
文件包含安装、配置、启动、监听状态、停止、删除(卸载)函数,整体结构如下
#!/usr/bin/env python
# -*- coding: utf-8 -*--
from resource_management import *
from resource_management.core.logger import Logger
class Master(Script):
def install(self, env):
# 在页面服务首次安装时自动执行的函数
def configure(self, env):
# 主要执行一些服务配置操作,该方法Ambari不会主动触发
def start(self, env):
# 在页面点击服务启动时自动执行的函数
def stop(self, env):
# 在页面点击服务停止时自动执行的函数
def status(self, env):
# 检查服务状态,大概每隔60s执行一次
def restart(self, env):
# 当文件内没有 restart() 方法的时候,程序会在重启的时候自动执行 stop() 和 start() 方法,以实现重启命令。
# 当有 restart() 方法时,程序会在重启的时候执行 restart() 方法逻辑
if __name__ == "__main__":
Master().execute()
安装服务(install)
在WebUI中安装服务时,会自动触发执行install()方法,该方法一般需要实现以下几点逻辑:
- 创建该服务的的用户(ambari2.6 需要在install()方法中添加创建用户的命令,而ambari2.7不需要,ambari2.7 可直接在 configuration 目录下的 xml 文件属性设置进行添加。)
- 执行服务安装命令
- 其他首次安装服务需要执行的命令
下面是简单的样例:
def install(self, env):
import params
env.set_params(params)
# 下载Doris安装包
Execute('wget {0} -O apache-doris-2.0.2-bin-x64.tar.gz'.format(params.doris_download))
# 将安装包解压到指定目录
Execute('tar -zxvf apache-doris-2.0.2-bin-x64.tar.gz -C /usr/hdp/3.1.5.0-152/')
# 删除下载的安装包
Execute('rm -rf apache-doris-2.0.2-bin-x64.tar.gz')
# 初始化环境变量
cmd = format("cd {doris_scripts_dir}; chmod +x ./changeOsConf.sh && sh ./changeOsConf.sh")
Execute(cmd)
# 创建日志目录
Execute(format('mkdir -p {LOG_DIR} && chown -R {doris_user}:{user_group} {LOG_DIR}'))
# 将服务目录权限设置为doris
Execute(format('chown -R {doris_user}:{user_group} {doris_base_dir}'))
# 设置 pid 目录权限
Execute(format('mkdir -p {doris_pid_dir} && chown -R {doris_user}:{user_group} {doris_pid_dir}'))
Logger.info("Install complete")
配置加载(configure)
configure() 方法没有被 Ambari 默认触发,这个方法一般被 install()、start()、restart() 方法主动调用执行。
该方法一般需要实现以下几点逻辑:
- 创建相关目录,并设置权限
启动服务(start)
在WebUI中启动服务时,会自动触发执行start()方法,该方法一般需要实现以下几点逻辑:
- 启动服务
状态监测(status)
在WebUI中我们可以看到服务状态,如下图所示
这个状态就是通过status方法获取的,该方法每隔60s执行一次,如果status方法在执行中报错,则服务监控状态就会显示为stopped
status比较常用的方法,是检查进程id文件是否存在,如果不存在则说明服务没有启动成功,如果存在则会检查进程id文件中的进程id是多少,判断进程id是否处于运行状态,如果进程id不存在也会显示状态为Stopped
def status(self, env):
import status_params
env.set_params(status_params)
# 检查进程文件和进程文件中PID在不在
check_process_status(status_params.doris_pid_file)
status_params
代码如下
from resource_management import *
config = Script.get_config()
doris_pid_dir = config['configurations']['doris-env']['doris_pid_dir'].rstrip("/")
# 获取pid文件绝对路径
doris_pid_file = format("{doris_pid_dir}/doris-fe.pid")
停止服务(stop)
在WebUI中停止服务时,会自动触发执行stop()方法,该方法一般需要实现以下几点逻辑:
- 停止服务
在WebUI停止服务的是时候,在执行完stop()方法后会执行status(),如果status()能够成功执行,则一直处于停止状态中;如果status()函数执行失败则服务停止成功。
主要逻辑就是判断服务是否停止成功(进程不存在说明停止成功)
def status(self, env):
# Import properties defined in -env.xml file from the status_params class
import status_params
# This allows us to access the params.elastic_pid_file property as
# format('{elastic_pid_file}')
env.set_params(status_params)
check_process_status(status_params.doris_pid_file)
# Use built-in method to check status using pidfile
Logger.info("Check BE process status complete!")
tip:如果status检查进程不存在,则不会执行下面的Logger.info(…)
如果status检查进程一直存在,则会输出
2024-02-20 19:35:18,646 - Waiting for actual component stop 2024-02-20 19:35:18,646 - Check BE process status complete!
重启服务(restart)
在WebUI中重启服务时,会自动触发执行restart()方法,当文件内没有 restart() 方法的时候,程序会在重启的时候自动执行 stop() 和 start() 方法,以实现重启命令。
卸载服务
在ambari数据库中,clusterservices表记录了服务信息,当服务卸载后,在MySQL表中则查询不到该数据。