[关闭]
@wenshizhang 2016-10-26T14:11:52.000000Z 字数 6006 阅读 385

hb_report 简单建模

hb_report crmsh suse实习


确定参与者

hb_report执行流程

检查并解析参数

ssh相关工作

在对应的节点上得到相应log

收尾工作

hb_report实现参数

hb_report模块划分

按照数据模型进行模块划分的主要步骤

定义类

node类

master节点和collector节点的父类,抽象了每个节点的共性。

成员变量描述

成员变量 描述 相关性
SSH_PASSWD 表示节点是否需要ssh password 节点相关
WE 表示当前节点的名称 节点相关
WORKDIR log存储的临时目录位置 节点相关
THIS_IS_NODE 表示此节点是一个合法节点 节点相关

成员函数描述

成员函数 描述 参数 返回值
compatibility_pcmk 查找crm,heartbeat等等的daemon目录 None None
get_cluster_type 如果用户未指定cluster type,查找type None None
get_conf 根据cluster type获得CONF等变量 None None
check_this_is_node 判断当前节点是否在收集节点列表中,如果是THIS_IS_NODE=1 don't know None
getlog 原脚本中的getlog函数,功能不明 None None
mktar() 创建指定的压缩文件 待创建压缩文件名 None

master类

描述master节点特性的类,继承了node类

成员变量描述

成员变量 描述
SUDO 表示在collector节点上运行的root节点命令
LOCAL_SUDO 表示在master节点上运行的root节点命令
ENVIRMENT 存储envir类的实例

注:
1.假设这样一个场景,用户并不是以root身份运行hb_report,这是被允许的。但是当需要ssh到collector节点上时,要求使用root用户,因为收集使用journalctl收集信息要求是root用户。因此在测试ssh之前,需要测试当前用户是否是root用户,如果不是root用户,需要保存切换到root用户命令,SUDO保存ssh到collector节点时候切换root用户命令,LOCAL_SUDO保存收集master节点时候切换到root用户的命令

成员函数描述

函数 描述 参数 返回值
analyzed_argvments() 解析参数,根据不同的参数为envir类中的成员赋值
mktemp() 在/tmp目录下创建临时目录文件(WORKDIR) None 临时文件路径
is_node() 判断当前的node是否是一个合法的node None None
find_ssh_user() 如果用户未指定,查找可以ssh到collector节点的user和ssh的参数 None None
find_sudo() 如果当前用户非root,生成切换到远程或者本地root用户的命令 None None
change_time() 把用户输入的时间转换为system log中的形式 None None
collect_for_nodes() 判断ssh是否需要password None None
start_collect() 创建新进程ssh连接到collector节点收集信息 None None
analyzed() 原脚本中的analized函数 未知 未知
events() 原脚本中的event函数 未知 未知
check_if_log_is_empty() 原脚本中函数 未知 未知
finalword() 打印提示信息 None None
send_envir() 向collector node传递envir成员变量(存储envir类的实例) None None
__init__() 实例master类后调用的第一个方法 self,类envir的一个实例 None
run() master类的入口函数 用户调用hb_report输入的全部参数 None

注:
1.collector节点都是复制的master节点(不是copy master节点的标志都定义在了collector类中),因此获取这些变量值是在master类中
2.master类创建的WORKDIR是是$tmpdir/$DEST(DEST是用户输入的生成report name)
3.start_collect函数只是开始收集动作并触发收集函数,真正收集的是collector类中的collect_info函数,所有信息的收集都是collector类的collect_info方法完成。此方法通过node类型(collector节点或者master节点)
4.创建新线程运行analyzed和events方法
5.如果cluster node不需要password,为了提升性能创建新进程分别去收集各个节点log,父进程等待子进程结束。
6.在master node上为envir成员变量每个成员赋值,然后用send_envir方法创建对应的xml文件,并使用socket发送给collector node(可以传送xml字符串或者对应的xml文件)。
7.需要创建一个init方法是有一个成员变量是另一个类的实例,因此需要在init方法中给这个成员赋值,
8.


collector类

描述collector节点特性的类,继承了node类

成员变量描述

成员变量 描述 相关性
ENVIRMENT 表示类envir 环境变量相关

注:
1.此成员为了保存envir类的实例中存储的一些环境变量,收集信息需要用到这些变量。

成员函数描述

成员函数 描述 参数 返回值
mktemp() 在/tmp目录下创建临时目录文件 None 临时文件路径
collect_info() 真正收集log的函数 None None
return_result() collector node返回result给master节点 None None
get_envir() 解析master node传递的envir实例 None None
__init__ 创建实例后调用的方法 self,envir类的实例 None
run() collector类的入口方法 None None

注:
1.collector类创建的的WORKDIR是$tmpdir/$DEST/$WE,创建动作完成后需要测试结果
2.collector node返回结果给master节点时候,打成tarball,通过流或者其他方式返回给master节点,master节点再解压缩(压缩是为了降低网络造成的瓶颈)。
3.master node ssh到collector node,实例一个对象,然后执行collector类的某个函数(此处存疑,不确定是执行collector脚本还是执行某一个入口函数)
4.collector类和master类都有一个成员是envir的实例,为了保存整个hb_report运行过程中的每一个全局的环境变量。
5.需要实现一个collector脚本,这个脚本就是调用collector类的run函数


envir类

关于定义为模块还是类存疑:模块可以作为一个全局参数不用在每个类和函数之间传递,但是模块在各个节点之间共享麻烦;类可以当作参数从一个节点传递到另外一个节点,但是类在对成员变量修改的函数必须作为参数传递进去,这个还要斟酌一下

根据不同的参数需要设置的不同的全局变量,以及一些其他的标志变量。倾向于把这些变量全部放在同一个类中,这样结构简单。envir类是每个节点都需要一份,因此在调用collector节点上hb_report之前,需要先复制这些变量。

成员变量及描述

| 成员变量|描述|相关|缺省值|

FROM_TIME 表示收集info开始时间 参数相关
TO_TIME 表示收集info结束时间 参数相关
NODE_SOURCE 表示节点来源 参数相关
USER_NODES 表示节点列表 参数相关
SSH_USER 表示ssh登陆用户(默认是root和hacluster) 参数相关
SSH_OPTS 表示ssh登陆的参数 参数相关
DEST 用户指明的tarball文件名 参数相关
HA_LOG 表示log file的位置(绝对路径) 参数相关
EDITOR 表示用户指明的偏好编辑器 参数相关
SANITIZE 参数相关
DO_SANITIZE 参数相关
SKIP_LVL 快速收集参数 参数相关
LOG_PATTERNS 参数相关
NO_SSH 表示只是收集master节点信息 参数相关
NO_DESCRIPTION 不要适应任何一个编辑器 参数相关
FORCE_TO_REMOYE 如果已经存在了目的tarball,删除tarball执行 参数相关
EXTRA_LOGS 需要收集的附加log 参数相关
USER_CLUSTER_TYPE 指明cluster类型 参数相关
VERBOSITY hb_report版本 参数相关
COMPRESS 不压缩结果 参数相关
SSH_PASSWD_NODES ssh需要密码的node(不明白怎么判断哪些node ssh需要密码) 未知相关性
LOGD_CF logd.cf的位置 全局标志
ANALYSIS_F 收集的analysis.txt文件 收集文件相关
DESCRIPTION_F 收集的description.txt文件 收集文件相关
HALOG_F 收集的ha-log.txt文件 收集文件相关
JOURNAL_F 收集的journal.log文件 收集文集相关
BT_F 收集的backtrace.txt文件 收集文件相关
SYSINFO_F 收集的sysinfo.txt文件 收集文件相关
SYSSTATS_F 收集的sysstats.txt文件 收集文件相关
DLM_DUMP_F 收集的dlm_dump.txt文件 收集文件相关
TIME_F 收集的time.txt文件 收集文件相关
CRM_MON_F 收集的crm_mon.txt文件 收集文件相关
MEMBERSHIP_F 收集的member.txt文件 收集文件相关
HB_UUID_F 收集的hb_uuid.txt文件 收集文件相关
HOSTCACHE 收集的hostcache文件 收集文件相关
CRM_VERITY_F 收集的crm_verity.txt文件 收集文件相关
PERMISSIONS_F 收集的permossion.txt文件 收集文件相关
CIB_F 收集的cib.xml文件 收集文件相关
CIB_TXT_F 收集的cib.txt文件 收集文件相关
COROSYNC_RECOERED_F 收集的fdata.txt文件 收集文件相关
CONFIGURATIONS 常量 未知相关性

成员函数及描述

成员函数 描述 参数 返回值
__init__() 设置上面参数相关的成员变量默认值 None None

类图

此处输入图片的描述

注意事项

集群文件系统和分布式文件系统的区别:
集群文件系统管理的是一块共享盘,实际上是同一块盘,并且数据都是一样的,集群文件系统因为要互斥每个节点对share storage的读写访问,需要使用DLM加锁。分布式文件系统管理的是每个pc下的不同的盘。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注