运维平台元数据稽核小结

数据库运维中的元数据建设都是重中之重,如果元数据不具有参考的价值,那么后续的操作都会受到影响,但是元数据的建设也应该是分成几个步子来走,首先得能够收集到元数据或者元数据的录入,数据有了后续做规范和标准化才有依据,否则还没开始接入数据就设定一大堆的规范和标准,接入的时候难免开始就会有一种排斥感;其次,数据的收集不能一次性追求最完整,最系统,一定是能够抓住重点,逐步来落实,否则刚开始设定的规范,到了后期集成的时候反复调整反复改,谁都受不了;有了数据,逐步来落实质量,这个过程就是逐步规范化的过程,这个过程中要把握的就是通用和定制的粒度,统一的模板,但是数据的意义可能会有所差别,这个平衡度就是关键。

假设到了现在,你已经收录了很多的元数据信息,也在这个过程中发现了一系列的问题,我们是时候来做一些稽核的工作了。

比如你看到的一个元数据列表类似下面的形式,假设有9个数据库实例,其实这个阶段你也会犯嘀咕,要拍胸脯说元数据妥妥的,那是主观片面的,我们怎么来验证,或者怎么发现元数据问题来修复。

当然你可以想出很多的可能,越多的可能会让你偏离中心,所以也需要做到收敛。

因为所有的实例都可以通过中控访问,所以第一层验证就是ssh是否可达。

所以很快写了一个后台程序来扫描,结果发现20%的服务器存在ssh通信的问题。

看起来数据很惊人,经过确认,发现是一部分的用户属主不一样,比如mysql我们使用dba_mysql用户,Redis使用dba_redis用户,不能一概而论,其他有问题的数据库也是这种情况,所以经过确认和修复,这个指标下降到了2%。

第二个阶段是对已有的元数据信息做确认,那些不可访问的实例是否已经下线或者后期做了迁移,这个阶段非常重要,直接关乎到数据质量。

所以确认之后,发现这个比例降到了1%。

当然到了这个时候,看起来元数据已经差不多了,剩下的1%的很快就可以确认了。工作量相对来说就很清晰了。

第三个阶段其实是对于未知问题的把握,比如我们的元数据库中录入了100个实例,但是可能某个服务器上另外又部署了2个实例,在元数据中可能遗漏了。或者说服务器上运行着5个实例,但是在元数据里面是6个实例,因为之前做的都是ssh是否可达的校验,这一层的校验目前还是空白。

所以零零散散的拼接起来,大体就是下面的几类问题了。

整个对比就是一个全面的比较,元数据就是一个列表,系统中抓取的信息也是一个列表,两个列表互相对比,就能够得到一些差异的数据。

所以这个阶段的工作相对会有一点难度,但是经过这个维度的对比,整个过程思路会更加清晰,而且结果也具有说服力。

我写了如下的两段程序来完成这个基本的工作。

def cmdb_info_batch(request):

return_dict = {}

for vm_ip_addr_s in Cmdb_server.objects.filter(server_status=1).values("server_ip_addr").distinct():

vm_ip_addr = vm_ip_addr_s['server_ip_addr']

db_instance = Cmdb_server.objects.filter(server_ip_addr=vm_ip_addr)[0:1]

if len(db_instance) > 0:

db_type = db_instance[0].server_db_type

else:

db_type = 'others'

ansible_user = get_ansible_user(db_type)

result = ansible_adhoc(ansible_user, vm_ip_addr, "shell", 'date', True)

if len(result['success']) > 0:

print('success:',result['success'])

Cmdb_server.objects.filter(server_ip_addr=vm_ip_addr).update(

server_status=1,

)

if len(result['unreachable']) >0:

print('unreachle:',result['unreachable'])

Cmdb_server.objects.filter(server_ip_addr=vm_ip_addr).update(

server_status=2,

)

if len(result['failed']) >0:

print('failed:',result['failed'])

return return_response(request, 'cmdb/cmdb_info_ext_list.html', return_dict)

def instance_detect_batch(request):

return_dict = {}

for vm_ip_addr_s in Cmdb_server.objects.filter(server_status=1,server_db_type='MySQL').values("server_ip_addr").distinct():

vm_ip_addr = vm_ip_addr_s['server_ip_addr']

result = ansible_adhoc('dba_mysql', vm_ip_addr, "script", '/home/dba_mysql/scripts/get_mysql_info_by_host.sh', True)

#print(result)

if len(result['success']) > 0:

script_db_ports = []

for script_db_port in result['success'][vm_ip_addr]:

db_port = script_db_port.split(' ')[0]

script_db_ports.append(int(db_port))

cmdb_ports = []

for cmdb_port in Cmdb_server.objects.filter(server_ip_addr=vm_ip_addr).values("server_db_port"):

cmdb_ports.append(cmdb_port['server_db_port'])

if len(script_db_ports) > 0:

print(vm_ip_addr,'script_db_ports',script_db_ports, 'is missing in cmdb_db_ports',cmdb_ports,',result:',A_Missing_From_B(script_db_ports,cmdb_ports))

if len(cmdb_ports) > 0:

print(vm_ip_addr,'cmdb_db_ports',cmdb_ports, 'is missing in script_db_ports',script_db_ports,',result:',B_Missing_From_A(script_db_ports,cmdb_ports))

if len(result['unreachable']) > 0:

print('unreachle:',result['unreachable'])

if len(result['failed']) >0:

print('failed:',result['failed'])

return return_response(request, 'cmdb/cmdb_info_ext_list.html', return_dict)

其中涉及到两个列表对比的部分,代码可以参考:

def union_A_AND_B(listA, listB):

return list(set(listA).union(set(listB)))

def A_Missing_From_B(listA, listB):

return list(set(listB).difference(set(listA)))

def B_Missing_From_A(listA, listB):

return list(set(listA).difference(set(listB)))

def main():

listA = [1, 2, 3, 4, 5, 7]

listB = [3, 4, 5, 6, 7]

A_Missing_From_B(listA, listB)

B_Missing_From_A(listA, listB)

一段代码校验后的输出如下:

(u'192.168.xxx.xx', 'script_db_ports', [4323, 4359, 4360], 'is missing in cmdb_db_ports', [4308, 4320, 4322, 4323, 4325, 4350, 4352, 4358, 4359, 4360, 4367, 4377, 4600, 7379, 7380, 7386, 7391, 7392, 7397, 7398, 7399], ',result:', [4320, 4352, 4322, 4325, 4358, 7399, 7392, 7398, 4367, 7379, 7380, 4377, 4600, 4308, 7386, 7391, 4350, 7397])

(u'192.168.xx.xx', 'cmdb_db_ports', [4308, 4320, 4322, 4323, 4325, 4350, 4352, 4358, 4359, 4360, 4367, 4377, 4600, 7379, 7380, 7386, 7391, 7392, 7397, 7398, 7399], 'is missing in script_db_ports', [4323, 4359, 4360], ',result:', [])

可以看到在这个测试环境里,有差不多18个实例没有收录到元数据中,至于具体的信息可以进一步确认,总体来说,到了这个阶段,可以说元数据是基本值得信赖的了。

最后还有一步是最难的,就是需要确认哪些没有收录到元数据中,但是确认存在的实例。这个工作如果满分是五星,可以打到四星了。

对于这个方案,你们有什么好的思路,欢迎提出来。

原文发布于微信公众号 - 杨建荣的学习笔记(jianrong-notes)

原文发表时间:2018-06-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏云计算D1net

云计算网络应用防火墙提高应用程序的安全性

人们通过云计算网络应用防火墙以确保未在本地托管的应用程序,这是可行的。行业专家马特·帕斯库奇解释它们是如何工作的,以及企业对此所需要了解哪些事情。 如今,网络应...

39611
来自专栏Golang语言社区

一个调度系统的开发与性能优化

背景:随着Go的不断发展,流行度越来越高,业界对Go的认可度也越来越高,所以很多团队或者公司在遇到性能问题时都会尝试使用Go来重构系统,尤其是云计算领域,大家期...

1911
来自专栏嵌入式程序猿

嵌入式系统开发过程中的常见问题和解决方法

1. Bootloader如何写入Flash ? 初学者一般都会遇到如何将程序写入处理器的问题。对于不同的处理器,可以采用不同的方法。例如Intel的Xscal...

3597
来自专栏数据小魔方

当PowerBI遇到R语言

PowerBI作为微软系最新的商务智能办公系统,自去年发布以来,一直都备受瞩目。 他的更新频次相当之高,功能更新迭代非常迅速。 大概对可视化领域稍有涉猎的朋友们...

5184
来自专栏程序员的知识天地

Python爬虫入门,8个常用爬虫技巧盘点

编程对于任何一个新手来说都不是一件容易的事情,Python对于任何一个想学习的编程的人来说的确是一个福音,阅读Python代码像是在阅读文章,源于Python语...

1591
来自专栏Java学习网

互联网高手教你如何搜集你想要的信息

  写在前面   几个月前,团队邀我做次内部的分享,主题是如何有效搜索信息。这是因为平时工作中,我经常会分享一些专业学习文档,而这些文档的出现往往很及时,回应一...

3818
来自专栏.NET技术

整理自己的.net工具库

  今天我会把自己平日整理的工具库给开放出来,提供给有需要的朋友,如果有朋友平常也在积累欢迎提意见,我会乐意采纳并补充完整。按照惯例在文章结尾给出地址^_^。

852
来自专栏大数据文摘

解密千万密码:透过密码看人性

1912
来自专栏码神联盟

高效编程所需要做的那点事

聊聊如果才能高效编程 计划(Plan) 所谓Plan,其实就是对应于编程中的设计阶段,当然,这里的Plan并不像设计那样重量级。它要求我们程序员在正式...

2839
来自专栏FreeBuf

一张GIF引发的微信崩溃

今早,朋友发了一个表情给我,看下面,就是这个。。 ? 这不是天线宝宝卖萌系列表情包么,正当我看着俩宝宝撞屁股的GIF图寻开心的时候,微信突然卡死闪退了。。然后我...

3409

扫码关注云+社区

领取腾讯云代金券