一.项目背景
随着集团MHA集群的日渐增长,MHA管理平台话越来越迫切。而MHA平台的建设第一步就是将这些成百上千套的MHA集群信息收集起来,便于查询和管理。
MHA主要信息如下:
(1)基础配置信息;
(2)运行状态信息;
(3)启动及FailOver的log信息。
集团目前数据库的管理平台是在Archery的基础上打造,所以,需要将此功能嵌入到既有平台上。通过Archery系统进行查询展示。
二.架构
简单来说,通过 Filebeat + Logstash + MySQL 架构 来收集保存各个集群的配置信息、启动及FailOver的log信息 和运行状态信息。
运行状态信息是通过一个小程序获取的,这个小程序每分钟执行一次,会把执行结果输出到文件中。当然这个文件是被failbeat监控的。
三.实现
3.1 获取MHA状态的脚本
文件为mha_checkstatus.py
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import os
import io
import re
import ConfigParser
Path='/etc/mha'
#fout=open('输出文件名','w')
for Name in os.listdir(Path) :
Pathname= os.path.join(Path,Name)
## print(Pathname)
## print(Name)
config =ConfigParser.ConfigParser()
try:
config.read(Pathname)
server_item = config.sections()
server1_host = '' ##MHA cnf 配置文件中的节点1
server2_host = '' ##MHA cnf 配置文件中的节点2
server3_host = '' ##MHA cnf 配置文件中的节点3
mha_cnf_remark = ''
if 'server1' in server_item:
server1_host = config.get('server1','hostname')
else:
mha_cnf_remark = mha_cnf_remark + 'Server1未配置;'
if 'server2' in server_item:
server2_host = config.get('server2','hostname')
else:
mha_cnf_remark = mha_cnf_remark + 'Server2未配置;'
if 'server3' in server_item:
server3_host = config.get('server3','hostname')
##print(mha_cnf_remark)
except Exception as e:
print(e)
mha_status_result =''
###20190330
Name = Name.replace(".cnf", "")
###集群一主一从
if server1_host <> '' and server2_host <> '' and server3_host == '':
cmd_mha_status ='/???/???/bin/masterha_check_status --conf='+Pathname
with os.popen(cmd_mha_status) as mha_status:
mha_status_result = mha_status.read()
if 'running(0:PING_OK)' in mha_status_result:
print(Name+':::'+Pathname+':::0:::'+server1_host+':::'+mha_status_result)
print(Name+':::'+Pathname+':::0:::'+server2_host+':::'+mha_status_result)
if 'stopped(2:NOT_RUNNING)' in mha_status_result:
print(Name+':::'+Pathname+':::None:::'+server1_host+':::'+mha_status_result)
print(Name+':::'+Pathname+':::None:::'+server2_host+':::'+mha_status_result)
####集群一主两从
if server1_host <> '' and server2_host <> '' and server3_host <> '':
cmd_mha_status ='/???/???/bin/masterha_check_status --conf='+Pathname
with os.popen(cmd_mha_status) as mha_status:
mha_status_result = mha_status.read()
if 'running(0:PING_OK)' in mha_status_result:
print(Name+':::'+Pathname+':::0:::'+server1_host+':::'+mha_status_result)
print(Name+':::'+Pathname+':::0:::'+server2_host+':::'+mha_status_result)
print(Name+':::'+Pathname+':::0:::'+server3_host+':::'+mha_status_result)
if 'stopped(2:NOT_RUNNING)' in mha_status_result:
print(Name+':::'+Pathname+':::None:::'+server1_host+':::'+mha_status_result)
print(Name+':::'+Pathname+':::None:::'+server2_host+':::'+mha_status_result)
print(Name+':::'+Pathname+':::None:::'+server3_host+':::'+mha_status_result)