開源數據庫每每不具有商業數據庫同樣的高端能力,可是卻因簡單易用,無需 license 費用等深得你們喜歡,但在雲服務時代,打造一款同時具有了開源數據庫的性價比和商業數據庫的安全性的數據庫,幾乎是全部使用者心中的夢想。騰訊雲數據庫 TDSQL 基於這樣的考慮,實現了雲化的審計能力,下面就讓咱們一塊兒來看看具體的技術細節。前端
各模塊特色node
1) proxyweb
三個無差異 proxy Ip,保證一個或者兩個 proxy 故障時,剩餘 proxy Ip 正常工做用戶無感知。算法
旁路信息進入 kafka 時,對數據進行壓縮上傳同時 kafka 必須半數節點響應成功後纔算正確上傳。數據庫
每一個用戶實例都有本身單獨的 proxy,在數據上傳是不一樣實例消息併發上傳到 kafak 的 topic,保證每一個用戶信息及時進入審計消息隊列。安全
2) Kafka服務器
Kafka 是一種分佈式的,基於發佈/訂閱的消息系統。主要設計目標以下:網絡
以時間複雜度爲 O(1) 的方式提供消息持久化能力,即便對 TB 級以上數據也能保證常數時間的訪問性能多線程
高吞吐率。即便在很是廉價的商用機器上也能作到單機支持每秒 100K 條消息的傳輸架構
支持 Kafka Server 間的消息分區,及分佈式消費,同時保證每一個 partition 內的消息順序傳輸
同時支持離線數據處理和實時數據處理
Kafka解析
Terminology
Broker:Kafka 集羣包含一個或多個服務器,這種服務器被稱爲 broker
Topic:每條發佈到 Kafka 集羣的消息都有一個類別,這個類別被稱爲 topic。(物理上不一樣 topic 的消息分開存儲,邏輯上一個 topic 的消息雖然保存於一個或多個 broker 上但用戶只需指定消息的 topic 便可生產或消費數據而沒必要關心數據存於何處)
Partition:parition 是物理上的概念,每一個 topic 包含一個或多個 partition,建立topic 時可指定parition數量。每一個 partition 對應於一個文件夾,該文件夾下存儲該 partition 的數據和索引文件
Producer:負責發佈消息到 Kafka broker
Consumer:消費消息。每一個 consumer 屬於一個特定的 consumer group(可爲每一個 consumer 指定 group name,若不指定 group name 則屬於默認的group)。使用 consumer high level API 時,同一 topic 的一條消息只能被同一個 consumer group 內的一個 consumer 消費,但多個 consumer group 可同時消費這一消息。
Kafka框架
如上圖所示,一個典型的 kafka 集羣中包含若干 producer(能夠是 web 前端產生的 page view,或者是服務器日誌,系統 CPU、memory 等),若干 broker(Kafka 支持水平擴展,通常 broker 數量越多,集羣吞吐率越高),若干 consumer group,以及一個 Zookeeper 集羣。Kafka 經過 Zookeeper 管理集羣配置,選舉 leader,以及在 consumer group 發生變化時進行rebalance。producer 使用 push 模式將消息發佈到 broker,consumer使用 pull 模式從 broker 訂閱並消費消息。
3) audit-server
audit-server 是分佈式服務,採用一致性 hash 算法進行路由
多協程併發處理模式保證 kafka 數據秒級別消費
一致性 hash
在分佈式集羣中,對於機器的添加和刪除已經故障機器自動脫離集羣不影響服務是分佈式集羣的最基本的功能。本次審計服務採用一致性 hash 完成這種基本功能。
具體描述以下:按照經常使用的 hash 算法來將對應的 key 哈希到一個具備 2^32 次方個桶的空間中,即 0~(2^32)-1 的數字空間中,也就是將 object1,object2, object3, object4 四個(假設有四個實例對象)實例對象經過 hash 散列到 hash 環上。如圖(來自於網絡)
同時將三個服務節點(假設三個服務節點),經過 hash 也散列到 hash 環上。如圖(來自於網絡),經過找出距離本身最近的 node 節點,便可找到服務節點。
在服務節點添加刪除或故障時實例對象都會自動的調整找到距離本身最近的服務節點進行審計服務。
同時,在引入 audit-server 路由時,咱們發現 node 服務節點分佈越均勻,每一個服務節點的負載也就越均勻。這裏引用了虛擬節點來解決這一問題。
審計策略
獨立規則加載協程:在規則加載時,不影響審計規則功能區性能
優先級:策略支持用戶自定義優先級,在策略匹配時,優先匹配到優先級較高的策略。
規則設置豐富: 支持規則=, !=,>, >=, <, <= 以及正則匹配。
權限:支持二次認證,保證數據安全性。
多併發協程
協程,不須要搶佔式調度,能夠有效提升線程的任務併發性,而避免多線程的缺點(go 原生支持)
故障優化
耦合關係:保證一個子系統發生故障時,不會影響其餘系統的正常運行。
審計服務故障時保障數據不丟:消息消費時會動態的記錄匹配到規則的或者超過必定閾值消息的 offset,保證服務被分配到其餘節點或者故障服務修復啓動時都會從正確的位置消費消息。
數據旁路 kafka 數據不丟:在數據傳入到kafka是必須保證半數以上的節點響應此消息時,才進行下面的數據傳輸。
告警及時感知:kafka 或者 MongoDB 不可用時會秒級別感知,發送告警信息給系統負責人,及時恢復服務。
自動擴容:匹配規則消息存儲採用騰訊雲 MongoDB,經過後臺打通,在存儲空間不夠時支持自動擴容。
數據順序性:每一個消息在旁路時都會被打上一個時間戳同時消息也是按順序進入消息隊列,在數據讀取時按照時間戳順序讀取。
騰訊雲MongoDB
騰訊雲 MongoDB 特色
設計服務數據存儲採用,騰訊雲自有的 MongoDB 服務,該產品具有如下特色:
雲存儲服務,是騰訊雲平臺提供的面向互聯網應用的數據存儲服務。
提供了高性能、高可靠、易用、便捷的 MongoDB 集羣服務,每個實例都是至少一主一從的副本集或者包含多個副本集的分片集羣。
整合了備份、擴容等功能,儘量的保證用戶數據安全以及動態伸縮能力
固然,爲了用戶的安全考慮,咱們全部的數據,都是須要用戶主動開啓審計的前提下,纔會記錄流水數據,並對數據進行過濾和存儲。
使用雲數據庫 MongoDB 服務的好處:
安全:提供在線的至少兩份數據存儲,確保線上數據安全。同時經過備份機制保存多天的備份數據以便於在災難狀況進行數據恢復。
高性能:集中安裝專用高性能存儲服務器(高內存全 SSD 機型)來支持海量訪問。 省心:提供 7×24 小時的專業服務,擴容和遷移對用戶透明且不影響服務。提供全面監控,可隨時掌控 MongoDB 服務質量。