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