運維開發裡的資料動態獲取和自動補錄

jeanron100發表於2018-05-16

在運維平臺的設計中,目前有兩套系統是並存,並行發展的,其中一部分原因是涉及的業務不同,關注點不同。所以在設計CMDB的部分時,最開始我是整合了已有的實現,把系統層的指標和資料都錄進去了,即錄入元資訊需要錄入資料庫層面,系統層面,應用層面等等。

顯然這不是一個好方法。如果記憶體是8G我錄入錯誤,寫成了80G有沒有問題,在資料庫運維平臺這邊是完全感知不到的,如果後續做了變更,我們也是無法感知的,與其這樣,還不如不維護,系統層面的資訊可以交由系統運維平臺的CMDB即可,而資料庫運維平臺只需要關注資料庫和業務資訊即可,如果更進一步,資料庫資訊其實很多都可以自動發現或者探測得到,唯一需要我們確認的是資料庫例項的應用資訊。而反過來系統層面對於資料庫的元資訊有什麼需求嗎,其實也是有的,比如資料庫MySQL的主從不應該部署在一個宿主機上,那麼對於系統層面如何去鑑別這個資訊呢,顯然沒有頭緒,這就需要資料庫層面介面資訊來提供資料庫的角色,如果資料庫角色和伺服器層面的資訊繫結起來,其實這些資訊就可以確認了。

運維開發裡的資料動態獲取和自動補錄

所以在資料庫運維平臺中,我不刻意去維護系統的資訊,而是主要通過API來來訪問獲取,當然為了提高效能,我會做一層過濾,我會把系統資訊都收集一遍,放入本地的資料庫表中,如果下一次訪問的時候首先在資料庫表中查詢,如果找到,就直接返回,否則就重新申請獲得。

然而看似優化的程式碼在運維平臺中還是丟擲了錯誤。

運維開發裡的資料動態獲取和自動補錄

我看了下程式碼,大體如下:

vm_info_dict = virtual_machine_info.objects.get(ip=vm_ip_addr) print(vm_info_dict) if vm_info_dict != None:
physical_server_ip = vm_info_dict.hostip device_info_dict = physical_server_info.objects.get(ip=physical_server_ip)
phy_contain_vms = virtual_machine_info.objects.filter(hostip=physical_server_ip) else:
token = gettoken('xxxxx', 'xxxxx')
vm_info_dict=getresponse('https://xxxxx/API/v1/GetServerInfo/'+vm_ip_addr, token)
physical_server_ip = vm_info_dict.get("hostip") print(physical_server_ip) device_info_dict=getresponse('https://xxxxxx/API/v1/GetDeviceInfo/'+physical_server_ip, token)

整體的思路就是通過Django API獲取虛擬機器資訊,如果不存在就通過API去訪問獲取。

這個問題看起來比較奇怪,按照錯誤的思路,應該是在exception的異常捕獲部門來處理,這麼做確實是可以的,但是如果要擴充套件邏輯,異常處理的邏輯就會越來越重,感覺怪怪的。

所以反覆測試,也算是明白了,使用get的方式去獲取資料,如果獲取不到就會拋錯,個人感覺這個介面還是不太友好,可以換一種方式,比如filter來實現,因為從表結構能夠定位到這是一個主鍵或者唯一性索引。

所以程式碼的部分根據count的方式來做了調整,然後在這個基礎上又做了改進,即如果在本地的資料庫中不存在,則訪問介面得到資料庫,把資料庫下沉到本地,整個過程對於我們使用是透明的,也算是一種比較友好的互動方式。

vm_info_dict_exists = virtual_machine_info.objects.filter(ip=vm_ip_addr).count() if vm_info_dict_exists >= 1:
vm_info_dict = virtual_machine_info.objects.get(ip=vm_ip_addr) print(vm_info_dict) physical_server_ip = vm_info_dict.hostip device_info_dict = physical_server_info.objects.get(ip=physical_server_ip)
phy_contain_vms = virtual_machine_info.objects.filter(hostip=physical_server_ip)
return_dict["device_info_dict"] = device_info_dict
return_dict["vm_info_dict"] = vm_info_dict
return_dict["phy_contain_vms"] = phy_contain_vms else:
token = gettoken('xxxx', 'xxxxxx')
vm_info_dict = getresponse('https://xxxxxx/API/v1/GetServerInfo/' + vm_ip_addr, token)
physical_server_ip = vm_info_dict.get("hostip") print(physical_server_ip) device_info_dict = getresponse('https://xxxxxxxAPI/v1/GetDeviceInfo/' + physical_server_ip, token)
return_dict["device_info_dict"] = device_info_dict
return_dict["vm_info_dict"] = vm_info_dict
vm_info = virtual_machine_info()
......
vm_info.memo = vm_info_dict.get("memo")
vm_info.save()
phy_exists = physical_server_info.objects.filter(ip=vm_info.hostip).count() if phy_exists == 0:
phy_info = physical_server_info()
phy_exists = physical_server_info.objects.filter(ip=vm_info.hostip).count() if phy_exists == 0:
phy_info = physical_server_info()
phy_info.update_date = device_info_dict.get("update_date")
......
phy_info.memo = device_info_dict.get("memo")
phy_info.save()
phy_contain_vms = virtual_machine_info.objects.filter(hostip=vm_info.hostip)
return_dict["phy_contain_vms"] = phy_contain_vms

後續準備對這些資訊做更進一步的改進,能夠實現後設資料的增量重新整理,即資料發生變化的時候我會呼叫介面重新整理資料到本地,否則還是保持不變。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-2154541/,如需轉載,請註明出處,否則將追究法律責任。

相關文章