日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

运维平台元数据稽核小结

發(fā)布時(shí)間:2023/12/15 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 运维平台元数据稽核小结 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

? 數(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。