1. 程式人生 > >Python 和 SQL Server 2017 的強大功能

Python 和 SQL Server 2017 的強大功能

Python是SQL Server 2017的新功能。它主要是為了允許在SQL
Server中使用基於Python的機器學習,但是它可以與任何Python庫或框架一起使用。為了提供可能的例子,Hitendra展示瞭如何安全地使用該功能來提供智慧應用程式快取,其中SQL
Server可以自動指示資料何時更改以觸發快取重新整理。

MS SQL Server 2017已經通過啟用SQL伺服器通過“使用Python的機器學習服務”在TSQL中執行Python指令碼,新增到其高階分析擴充套件,現在稱為“機器學習服務”。這基本上提供了一種資料庫程式設計師可以直接從Python傳遞資料的方法。這樣做的有用性不僅限於為資料分析提供機器學習功能,因為Python具有許多易於使用的模組和框架來解決許多問題,例如使用資料結構執行大量計算工作,用於分析的圖形處理,網路操作,資料庫操作,網路操作或基於本地/網路的檔案系統操作。顯然,其中許多在中介軟體方面做得最好,但是在資料庫系統中,有時候直接與外部系統通訊,而不是依靠外部程序通過輪詢資料來源來執行任務更方便。如果在資料庫或資料層中有一個這樣的解決方案,並且不提供任何安全性問題時,這不是問題。

在這裡,我們將嘗試演示在Advanced Analytics Extension中使用Python的示例,顯示資料庫如何觸發外部程序來對作為引數提供的資料執行活動。這是為了考慮安全性,資料可靠性和事務響應時間的問題。

Python的用例

通過從SQL呼叫Python指令碼而不是依賴於中介軟體,可以更容易地完成某些任務。特別是在資料庫中事件發起任務的情況下。任務可能包括

  1. 通過TCP / HTTP / SOAP向網路系統傳送資料或從基於網路的系統接收資料。
  2. 利用本地平臺資源,如檔案系統,網路或GPU。
  3. 通過使用通用資料格式(如JSON,XML或YAML)構建一個或多個系統之間的實時整合。
  4. 通過與外部應用程式通訊生成資料或檔案。

當然也難免存在一些潛在的缺點

  1. 如果您使用Python需要網際網路訪問,那麼存在必須保持安全的資料可能會被意外地通過網際網路共享的風險。任何網際網路訪問必須由網路仔細監管。
  2. 允許通過“啟用外部指令碼執行”在伺服器上執行Python指令碼來暴露安全風險。
  3. 相同伺服器上的資源密集型Python指令碼可能會影響大型OLTP系統上正在進行的事務的效能。

衡量這些優點和缺點,似乎有時候Python可以發揮有用的作用,如果可以最小化風險。作為一個例子,讓我們考慮一下我們如何使用Python構建資料快取系統供應用層使用。

快取示例解決方案

快取資料可以提高應用程式的效能。以快取的儲存開銷為代價,當遇到與資料庫的聊天網路通訊以及資料庫面臨重複查詢時資源消耗高的情況下,我們可以獲得有用的效能提升。當我們構建快取基礎架構時,我們面臨著什麼時候重新整理快取的內容的常見問題。我們傾向於在一定時間間隔之後採用重建快取的簡單解決方案。然而,這是非常低效的。當資料更改時重新整理快取更好,只重新整理改變的內容。在建立,更新或刪除資料時,我們可以實時接近實時。有許多工具和框架可用於解決重新整理問題,但是它們受到如何確定資料發生變化以及何時發生更改的問題。資料庫是最好的所有能夠做到這一點。

對於我們這裡提供的快取系統,我們將把自己限制在微軟堆疊中,以防止Python本身。

Microsoft SQL Server 2017(CPT)

  • 服務代理隔離事務資料庫。
  • Python執行指令碼,可以通過HTTP更新快取(Python 3.5可執行檔案與Anaconda發行版中的庫)

.Net 4.5.2

  • ASP.Net MVC為我們的示例Web UI
  • ASP.Net WebAPI封裝快取儲存為我們的示例解決方案。

以下是我們的示例解決方案快取系統的圖示:

WasBlurry

  • WebApplication提供用於讀取和更新資料的使用者介面。
  • 我們示例快取儲存解決方案中的RESTful.Cache應用程式是使用ASP.Net WebAPI2構建的,其內容型別為JSON。 HTTP-GET操作從本地快取(靜態集合)傳送資料。
  • MS SQL Server 2017(CPT)是一個數據庫伺服器
    • TransDB OLTP資料庫,處理事務繁忙。
    • Cacher執行Python指令碼執行的代理資料庫,啟用了啟用“外部指令碼啟用”選項的指令碼執行。 請參閱Microsoft.Doc:啟用外部指令碼的伺服器配置選項
    • Service Broker是SQL伺服器的可靠訊息傳遞框架,有助於橋接Cacher-Agent和TransDB。 可以處理Cacher-Agent接收到的訊息來更新快取。
  • Python是使用SQL 2017(CPT)的資料庫系統的整合指令碼語言

解決方案的架構

在我們的解決方案中,我們將在RESTful.Cache應用程式中快取實體“產品型別名稱”,並且WebApplication將具有建立新產品型別條目並從RESTful.Cache讀取的功能。

條件

除此之外,還有一些先決條件和一些我們需要考慮的資訊。

  1. 儲存CacheDB的SQL例項必須安裝“具有Python的機器學習服務
  2. 要在CacheDB中使用TSQL執行Python指令碼,應執行SQL Service MSSQLLaunchpad或SQL Server Launchpad。 請參閱Microsoft.Net:Microsoft機器學習服務
Python
1 sp_configure'external scripts enabled',1;

RECONFIGURE;

  1. TransDB和Cacher託管的環境應該在其例項上建立一個Service Broker端點,如果這兩個端點獨立託管在兩個不同的SQL例項上,那麼每個例項應該有自己的端點。
  2. Python
    1 ALTER DATABASE TransDB SETENABLE_BROKER;
Python
1234 GOALTER DATABASE CacheDB SETENABLE_BROKER;GO

.NET應用程式

WebApplication有兩個主要的MVC動作; 一個使用HTTP動詞POST更新TransDB中的一個新實體,另一個使用HTTP動詞GET從快取返回產品型別列表的操作。

word-image-1

RESTful.Cache有兩種操作方法,一種是使用HTTP動詞POST更新新新增的實體產品型別的快取,另一種用於從本地快取獲取所有快取的產品型別。

word-image-1

對於我們的示例解決方案,這兩個應用程式都在IIS中託管在各個應用程式池標識下,以保護應用程式安全 但是對於實際的系統實現,託管環境可以是內部網或網際網路環境中的單個Web伺服器。

word-image-1

RESTful.Cache授權規則只有兩個服務帳戶來處理HTTP請求,即

word-image-1

abc WebApp_SVC和abc CacherAgent_SVC。 abc CacherAgent_SVC服務帳戶允許SQL中的Python指令碼通過HTTP到達應用程式來重新整理快取。

abc WebApp_SVC使用者用於具有授權規則模式的WebApplication,以允許訪問RESTful.Cache應用程式。

SQL資料庫和服務代理

OLTP資料庫TransDB有幾個物件,包括表,儲存過程和Service Broker物件。

word-image-1

CacheIntegrationError表。

word-image-1

對於我們的示例解決方案,TransDB是建立新的ProductType記錄時建立更新快取訊息的源資料庫,執行操作的訊息,它具有UpdateMessage訊息型別,CacheIntegration合同將CacheSource服務傳送到目標資料庫。該服務具有CacheQueue,由Service Broker元件用於執行可靠的訊息傳遞。 ToCacheTarget路由具有將訊息傳遞到其目標的資訊。

為了消除任何增加事務處理時間的機會以及避免事務資料庫中其餘資料的任何安全風險,我們將通過使用我們的示例解決方案中名為Cacher資料庫的代理資料庫來解除快取更新過程。 Service Broker訊息傳遞基礎設施將有助於連線TransDB和Cacher資料庫,基於事件的訊息處理將使我們能夠更新駐留在基於網路的系統上的快取儲存。 Cacher資料庫正在扮演代理角色,以便在更新訊息到達時執行快取重新整理。它通過執行Python指令碼更新快取。

word-image-1

Cacher資料庫具有:

  1. CacheLog和CacheIntegrationError表,以跟蹤快取何時被重新整理,並且具有在快取重新整理過程中可能發生的任何錯誤的記錄。
  2. PerformCacheUpdate過程通過Service Broker從TransDB接收傳入訊息。如果訊息的型別是UpdateMessage,那麼它將執行另一個過程UpdateWebCache,執行Python指令碼執行。
    1. UpdateWebCache過程的執行結果儲存在表變數中,然後在訊息對話結束時插入到CacheLog表中。
    2. 當接收到的訊息具有錯誤或結束訊息型別時,過程也會結束會話,並且在錯誤型別上,將異常日誌寫入CacheIntegrationError表中。
  3. UpdateWebCache過程從作為引數傳遞的傳入XML訊息中提取Id和Name,並將這些值嵌入到Python指令碼文字中。指令碼執行結果集是型別為UpddateCacheLog的結構化表。

word-image-1

Cacher的Service Broker物件,主要是UpdateMessage訊息型別和CacheIntegration契約與TransDB的相同,CacheQueue有一個稱為PerfomCacheUpdate的啟用過程,一個名為CacheTarget的服務,該路由具有有關TransDB服務CacheService和端點地址的資訊。

對於我們的示例解決方案,資料庫佇列的最大佇列讀取器設定為1。 如果需要,可以增加這一點,例如,如果資料修改很高,並且您需要增加快取重新整理率。

服務代理端點

對於我們的解決方案,資料庫託管在同一個例項上,因此兩者都使用相同的Service Broker Endpoint來發送和接收訊息。

word-image-9

但是,如果我們要在單個例項上託管資料庫,那麼每個SQL例項的服務帳戶都應該有一個Service Broker端點。 並且這兩個SQL例項都應該有許可權允許將訊息傳送到對方的端點。 連線的授權和授予可以通過以下TSQL命令集完成。 請注意,在訊息傳遞基礎結構中,有一個傳送方,另一方是接收方,正如所提到的,如果SQL例項是傳送方和接收方的一部分,則每個例項都應該有自己的程序標識。 下圖顯示了每個SQL Server在其自身身份下執行的方式。

word-image-1

這是用於在Cacher資料庫的SQL例項中授權和授予端點連線到TransDB的SQL例項服務帳戶[identity]的SQL程式碼。

Python
1234 ALTER AUTHORIZATION ON ENDPOINT::ServiceBrokerEndpoint TO[abc\TransDB_SVC]GOGRANT CONNECT ON ENDPOINT::ServiceBrokerEndpoint TO[abc\TransDB_SVC]GO

同樣,這裡是用於授權和授予端點連線到Cache SQL資料庫SQL例項服務帳戶[identity]的程式碼。

Python
1234 ALTER AUTHORIZATION ON ENDPOINT::ServiceBrokerEndpoint TO[abc\CacherAgent_SVC]GOGRANT CONNECT ON ENDPOINT::ServiceBrokerEndpoint TO[abc\CacherAgent_SVC]GO

Python指令碼

這是Python指令碼文字,在TSQL變數@UpdateCache中儲存為字串。 它具有具有邏輯的UpdateCache方法,通過傳遞具有作為輸入引數接收的Name和Id欄位的資料物件來對RESTful.Cache執行HTTP POST呼叫。 它接收一個JSON物件,並將其作為方法的輸出結果返回給呼叫者。

在指令碼結束時,返回的物件被轉換為陣列,因此可以將其結構化為SQL結果。

Python
1234567891011121314 DECLARE@UpdateCache NVARCHAR(MAX)=N'import pandas as PND #data structure packagedef UpdateCache(name,id):  import requests as HTTP #http request package  #Perfom HTTP POST to update cache  httpRequest = HTTP.post( http://localhost/RESTful.Cache/ProductType/UpdateCache ,{ Name :name, Id :id})   cacheLog = httpRequest.json()  return cacheLog#Update cache and build log elementlog = [UpdateCache( '+@Name+' ,'+CAST(@IdasVARCHAR(10))+')]#Return data frame i.e. table structure from SQLOutputDataSet = PND.DataFrame(data=log)';

在SQL Server中使用Python指令碼時,有一些值得注意的事情。

  1. 我們可以編寫一個連續的指令碼或將它們分組到我們在這個解決方案中所做的方法中。或者,我們可以建立一個內聯類或建立一個包,並在命令提示符下使用PIP命令在python中匯入它們。
  2. 在這個MST的CPT版本中,import語句只能在它放置的範圍內匯入包,因此我們可以注意到ImportCache中存在匯入請求import語句,並且import語句匯入熊貓存在於指令碼的頂部在指令碼的最後。
  3. 方法UpdateCache的輸出物件立即轉換為陣列,這樣pandas.DataFrame可以將物件轉換成資料結構,SQL Server可以輕鬆地將其解釋為具有行和列的表。
  4. 分配給OutputDataSet物件的資料結構在SQL Server的TSQL執行上下文中可用。
  5. 最後一行程式dbo.UpdateWebCache,WITH RESULT SETS(AS TYPE dbo.UpdateCacheLog);具有使用者定義的表型別dbo.UpdateCacheLog,它有助於保持底層列的順序,並避免在從接收的資料結構生成結果集的過程中發生任何不匹配。另一種方法是在Python和結果集中構建對映列結構。

資料庫安全

TransDB是一個OLTP資料庫,我們不希望對系統發生任何安全漏洞,因此,通過我們的示例解決方案,這種資料庫可以託管在未安裝“機器學習服務”的SQL例項上。 Cacher是能夠到達基於網路的系統的代理,因此可以保留在安裝機器學習服務的SQL例項上。 兩個SQL例項都可以具有單獨的服務帳戶身份,該身份已被授權僅連線到特定埠的Service Broker端點。 安全認證通訊的另一種方法是使用證書。 對於Service Broker端點授權,請參閱Microsoft.Technet:如何:通過使用證書(Transact-SQL)允許服務代理程式網路訪問.aspx)以獲取更多詳細資訊。

所有元件放在一起

放置所有元件後,我們的WebApplication允許我們建立一個新的ProductType,並通過RESTful HTTP呼叫從重新整理的快取中列出相同的產品型別。 在牆後面有管理資料的元件,快取記憶體對前端應用程式是不可見的。

word-image-9

結論

諸如電子商務,醫療電子治理等應用可以從良好的快取實現中受益。通過擴充套件我們熟悉的技術的使用,我們可以獲得易於維護的解決方案,而無需學習新框架或功能的成本。

我們的示例解決方案符合我們所需要的

  • 當通過其中一個OLTP事務建立或修改資料時,系統重新整理基於網路的快取系統進行讀取訪問。
  • 它能夠使用非同步事件來重新整理快取,靠近實時。這不會影響原始交易的表現。
  • 它可以通過HTTP在事務和快取系統之間繪製一條安全線,以保持資料在OLTP資料庫中的安全。
  • 它具有最小的監控功能;一個快取日誌和異常日誌,可以進一步加強構建管理控制檯。
  • 使用Service Broker訊息元件,解決方案足夠靈活,可以在非同步訊息處理髮生時觸發或到達基於網路的系統。換句話說,資料庫與SQL Service Broker訊息整合在一起,並且基於接收到的資料,執行一個動作來獲取或傳送資料到外部資料層以外的系統。
  • 通過使用服務代理訊息隔離外部系統觸發專用資料庫內的事件有助於保護OLTP資料庫的事務和資料。