运维平台元数据稽核小结
? 數據庫運維中的元數據建設都是重中之重,如果元數據不具有參考的價值,那么后續的操作都會受到影響,但是元數據的建設也應該是分成幾個步子來走,首先得能夠收集到元數據或者元數據的錄入,數據有了后續做規范和標準化才有依據,否則還沒開始接入數據就設定一大堆的規范和標準,接入的時候難免開始就會有一種排斥感;其次,數據的收集不能一次性追求最完整,最系統,一定是能夠抓住重點,逐步來落實,否則剛開始設定的規范,到了后期集成的時候反復調整反復改,誰都受不了;有了數據,逐步來落實質量,這個過程就是逐步規范化的過程,這個過程中要把握的就是通用和定制的粒度,統一的模板,但是數據的意義可能會有所差別,這個平衡度就是關鍵。
????假設到了現在,你已經收錄了很多的元數據信息,也在這個過程中發現了一系列的問題,我們是時候來做一些稽核的工作了。
????比如你看到的一個元數據列表類似下面的形式,假設有9個數據庫實例,其實這個階段你也會犯嘀咕,要拍胸脯說元數據妥妥的,那是主觀片面的,我們怎么來驗證,或者怎么發現元數據問題來修復。
? ?當然你可以想出很多的可能,越多的可能會讓你偏離中心,所以也需要做到收斂。
????因為所有的實例都可以通過中控訪問,所以第一層驗證就是ssh是否可達。
????所以很快寫了一個后臺程序來掃描,結果發現20%的服務器存在ssh通信的問題。
????看起來數據很驚人,經過確認,發現是一部分的用戶屬主不一樣,比如mysql我們使用dba_mysql用戶,Redis使用dba_redis用戶,不能一概而論,其他有問題的數據庫也是這種情況,所以經過確認和修復,這個指標下降到了2%。
????第二個階段是對已有的元數據信息做確認,那些不可訪問的實例是否已經下線或者后期做了遷移,這個階段非常重要,直接關乎到數據質量。
????所以確認之后,發現這個比例降到了1%。
????當然到了這個時候,看起來元數據已經差不多了,剩下的1%的很快就可以確認了。工作量相對來說就很清晰了。
????第三個階段其實是對于未知問題的把握,比如我們的元數據庫中錄入了100個實例,但是可能某個服務器上另外又部署了2個實例,在元數據中可能遺漏了?;蛘哒f服務器上運行著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個實例沒有收錄到元數據中,至于具體的信息可以進一步確認,總體來說,到了這個階段,可以說元數據是基本值得信賴的了。
????最后還有一步是最難的,就是需要確認哪些沒有收錄到元數據中,但是確認存在的實例。這個工作如果滿分是五星,可以打到四星了。
????對于這個方案,你們有什么好的思路,歡迎提出來。
總結
以上是生活随笔為你收集整理的运维平台元数据稽核小结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 可以挂机赚钱的游戏有哪些?
- 下一篇: 屏幕分辨率、屏幕尺寸、屏幕像素、屏幕密度