isv大規模數據遷移和加密

来源:http://www.cnblogs.com/jocce/archive/2017/07/30/7259841.html
-Advertisement-
Play Games

公司的核心業務合作伙伴淘寶網,最近出現泄漏用戶信息的現象,找了好久找不到根源,於是乎,淘寶那邊決定對所有敏感數據進行加密,從出口和入口都走密文,於是乎,我們的工作量就來了。 我們的一個底單資料庫,存儲了大量淘寶賣家和買家的訂單列印,申請單號,發貨,回收單號等等操作的日誌,大概有10億左右數據(自動刪 ...


公司的核心業務合作伙伴淘寶網,最近出現泄漏用戶信息的現象,找了好久找不到根源,於是乎,淘寶那邊決定對所有敏感數據進行加密,從出口和入口都走密文,於是乎,我們的工作量就來了。

  我們的一個底單資料庫,存儲了大量淘寶賣家和買家的訂單列印,申請單號,發貨,回收單號等等操作的日誌,大概有10億左右數據(自動刪除2個月之前的數據),哎呦我的fuck啊,也就是說,我們這邊要對10億數據做加密處理。。。。。。。。。

  很榮幸,整個數據的操作過程由我來寫工具,其中的考慮和過程,我來這裡大致的記錄一下,以便留下深的記憶。

  好吧,先上一張我們用戶與底單庫的數據架構圖。

 

圖上,我大致說一下,我們這一個獨立庫存儲用戶的獨立信息,有一張總用戶表,用戶id/5000取int值,也就是5000個用戶的底單數據插入到底單庫中對應的一張表中。

  底單庫的伺服器是阿裡聚石塔最高級別的專用資料庫伺服器,容量2T,由於表的欄位很多,數據占用磁碟空間的限制,我們保存用戶2個月的數據,勉強維持2T的數據容量,但是,表中的例如用戶手機,收件人,買家旺旺等欄位需要加密,加密都是走阿裡提供的加密解密介面方式,本來一個欄位就20個字元最多,加密後就要200以內字元,這樣不用全部加密硬碟空間就沒了,經過討論,確定方案是,加資料庫,增加兩台新的底單庫,存儲邏輯下圖:

上圖顯示,加了新庫,所以,在加密之前,首先要遷移用戶數據。

  要把底單1庫(老庫)中的51-100的表數據遷移到底單2庫,101以上的表數據遷移到底單3庫。為了保存老數據,底單2和3庫新建的表要分別是51-100,101+,這裡註意一點,新庫的新表的起始自增id千萬不要從0開始,因為,當你開始遷移數據的時候,對應的應用伺服器一定會更新程式,這時候51表以上的用戶的數據不會再往老庫插,而是對應的入到新庫裡面,由於要把老庫數據遷移過來,如果自增id從0開始,就會導致新數據的id和老數據的id產生唯一約束衝突。所以,看了下所有的舊表數據最大自增id,最多的在8000多W,所以,再程式上線前,我們給新表的自增id設置成1億,來防止這個問題出現。

  最後落實的遷移數據方案:由於數據比較多,就算每天半夜12點以後大規模遷移,也不現實,應用伺服器不可能同時更新,所以最後決定細水長流模式,以業務伺服器和用戶為外迴圈,來操作遷移,每台業務伺服器的用戶的用戶不規律的操作日誌數據存在不同的底單庫表中,也就是說一個老底單庫的51-148(我們老底單庫分表分了148張)的表中可能都會有當前伺服器用戶的數據,我以每個表啟動一個線程來分別跑當前表的用戶數據,,寫的是每個業務伺服器,固定開98個線程,去跑不同的底單表用戶數據,跑了幾台伺服器後,發現個嚴重問題,由於每用戶可跑的線程,也會迴圈查一次獨立庫的伺服器,開2台伺服器同時跑數據,就會造成獨立庫伺服器的CPU飆升到100%,計算加上各種延遲,也不可避免,還影響效率。所以,最後在當前業務伺服器的站點啟動的時候,計算當前伺服器的用戶具體分佈到哪幾張底單表中,然後就單獨開這幾個線程,極大的降低了獨立庫的資料庫壓力,改完之後,同時更新10台伺服器同時跑數據,毫無壓力,因為很多伺服器的用戶數據分佈的底單表比較少,都是10以內張。這樣在獨立庫創建一個用戶狀態表,裡面欄位:

再加一個欄位host,當前用戶對應的應用伺服器。

這樣,每台應用伺服器每個線程的任務就是,不斷的取當前線程(表)的底單數據,我是每次取1000條,往新庫對應表裡通過事務導入,並且在狀態表記錄logid,當前1000條數據最小的id,下次迴圈,再查數據的時候只查比這個logid小的數據的1000條,這麼做的原因是,防止中間程式未知問題掛掉,不知道從哪裡開始繼續導入,防止重覆數據,當迴圈取當前用戶數據為0的時候,跳出當前用戶的迴圈,更改狀態表的status為1,線程休眠自定義時間,繼續下一個用戶。做好日誌記錄。思維導圖就不畫了。

  經過2周時間,用戶數據全部遷移完畢,過程也不是那麼一番順利,有個別用戶,出現問題,從新跑的數據。接下來開始數據加密了。

  數據加密,因為還有一個純列印日誌表,這個表也需要進行加密,也就是1個用戶需要加密的是底單數據和列印日誌數據,為了可以讓所有伺服器可以同時更新加密數據,每台伺服器只開兩個線程,1個線程加密用戶底單數據,一個線程加密列印日誌數據。列印日誌表,跟每台業務伺服器資料庫放在一起,,下圖是我們公司對這幾個數據存儲的架構圖:

加密數據,老底單庫的前50張表也要加密。具體的代碼邏輯和遷移數據差不多,只是稍微複雜了一些流程而已。

  最後落實的工具,導用戶到用戶遷移/加密狀態表頁面,用戶數據遷移/加密的監控頁面,業務資料庫連接層的擴展。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 原文:https://www.stevejgordon.co.uk/asp-net-core-mvc-anatomy-addmvccore發佈於:2017年3月環境:ASP.NET Core 1.1 歡迎閱讀新系列的第一部分,我將剖析MVC源代碼,給大家展示隱藏在錶面之下的工作機制。此系列將分析MV ...
  • 1.什麼是委托? 1.1委托是一種引用類型,該類型適用於將方法用特定的簽名封裝,我們可以將委托理解為一個封裝了函數指針和方法的特殊類型。 1.2使用委托我們可以將方法封裝在委托中,然後調用委托就可以調用其中的方法 2.委托的基本聲明格式 修飾符 delegate 返回類型 委托名(參數列表)——返回 ...
  • 前面講了 "文件的上傳" ,今天來聊聊文件的下載。 老規矩,還是從最簡單粗暴的開始。那麼多簡單算簡單?多粗暴算粗暴?我告訴你可以不寫一句代碼,你信嗎?直接把一個文件往IIS伺服器上一扔,就支持下載。還TM麽可以斷點續傳(IIS服務端預設支持)。 在貼代碼之前先來瞭解下什麼是斷點續傳( 這裡說的是下載 ...
  • IdentityServer4 是一個提供 認證服務,單點登錄/登出(SSO),API訪問控制,聯合認證通道的可定製、免費商業支持的框架。 ...
  • IdentityServer4 是一個提供 認證服務,單點登錄/登出(SSO),API訪問控制,聯合認證通道的可定製、免費商業支持的框架。 ...
  • IdentityServer4 是一個提供 認證服務,單點登錄/登出(SSO),API訪問控制,聯合認證通道的可定製、免費商業支持的框架。 ...
  • IdentityServer4 是一個提供 認證服務,單點登錄/登出(SSO),API訪問控制,聯合認證通道的可定製、免費商業支持的框架。 ...
  • 非同步非常重要的一點就是不會使當前線程阻塞,C#主要通過委托機制來實現非同步編程。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...