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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > windows >内容正文

windows

如何使用 Kafka、MongoDB 和 Maxwell’s Daemon 构建 SQL 数据库的审计系统

發(fā)布時間:2024/4/11 windows 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何使用 Kafka、MongoDB 和 Maxwell’s Daemon 构建 SQL 数据库的审计系统 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
點(diǎn)擊上方“朱小廝的博客”,選擇“設(shè)為星標(biāo)” 后臺回復(fù)"書",獲取后臺回復(fù)“k8s”,可領(lǐng)取k8s資料

本文要點(diǎn)

? ? ?審計(jì)日志系統(tǒng)有很多應(yīng)用場景,而不僅僅是存儲用于審計(jì)目的的數(shù)據(jù)。除了合規(guī)性和安全性的目的之外,它還能夠被市場營銷團(tuán)隊(duì)使用,以便于鎖定目標(biāo)用戶,也可以用來生成重要的告警。

? ? ?數(shù)據(jù)庫內(nèi)置的審計(jì)日志功能可能并不夠用,要處理所有的用戶場景,它肯定不是理想的方式。

? ? ?目前,有很多的開源工具,如Maxwell’s Daemons、Debezium,它們能夠以最少的基礎(chǔ)設(shè)施和時間需求支持這些需求。

? ? Maxwell’s daemons 能夠讀取 SQL bin 日志并發(fā)送事件到各種生產(chǎn)者,比如Kafka、Amazon Kinesis、SQS、Rabbit MQ等。

SQL 數(shù)據(jù)庫生成的 bin 日志必須是基于 ROW 的格式,這樣才能使整個環(huán)境運(yùn)行起來。

假設(shè)你正在使用關(guān)系型數(shù)據(jù)來維護(hù)事務(wù)性數(shù)據(jù)并且你需要存儲某些數(shù)據(jù)的審計(jì)跟蹤信息,而這些數(shù)據(jù)本身是以表的形式存在的。如果你像大多數(shù)開發(fā)人員那樣,那么最終所采用的方案可能如下所示:

1. 使用數(shù)據(jù)庫的審計(jì)日志功能

大多數(shù)數(shù)據(jù)庫都提供了插件來支持審計(jì)日志。這些插件可以很容易地安裝和配置,以便于記錄數(shù)據(jù)。但是,這種方式存在如下的問題:

  • 完整的審計(jì)日志插件一般只有企業(yè)級版本才提供。社區(qū)版可能會缺失這樣的插件。以 MySQL 為例,審計(jì)日志插件只有企業(yè)版中才能使用。值得一提的是,MySQL 社區(qū)版的用戶依然可以安裝來自 MariaDB 或 Percona 的其他審計(jì)日志組件以繞過這個限制。

  • 數(shù)據(jù)庫級別的審計(jì)日志會導(dǎo)致數(shù)據(jù)庫服務(wù)器 10-20%的額外負(fù)載,正如該文和該文所討論的。通常,對于高負(fù)載的系統(tǒng),我們可能想要僅對較慢的查詢啟用審計(jì)日志,而不是針對所有的查詢。

  • 審計(jì)日志會寫入到日志文件中,數(shù)據(jù)不易于搜索。為了實(shí)現(xiàn)數(shù)據(jù)分析和審計(jì)的目的,我們可能想要審計(jì)數(shù)據(jù)能夠遵循可搜索的格式。

  • 大量的審計(jì)歸檔文件會消耗非常重要的數(shù)據(jù)庫存儲,因?yàn)樗鼈兇鎯υ谂c數(shù)據(jù)庫相同的服務(wù)器上。

  • 2. 使用應(yīng)用程序來負(fù)責(zé)審計(jì)日志

    要實(shí)現(xiàn)這一點(diǎn),你可以采用如下的方案之一:

    a.在更新現(xiàn)有的數(shù)據(jù)之前,復(fù)制現(xiàn)有的數(shù)據(jù)到另外一個表中,然后再更新當(dāng)前表中的數(shù)據(jù)。

    b.為數(shù)據(jù)添加一個版本號,然后每次更新都會插入一條已遞增版本號的數(shù)據(jù)。

    c.寫入到兩個數(shù)據(jù)庫表中,其中一張表包含最新的數(shù)據(jù),另外一張表包含審計(jì)跟蹤信息。

    作為設(shè)計(jì)可擴(kuò)展系統(tǒng)的一項(xiàng)原則,我們必須要避免多次寫入相同的數(shù)據(jù),因?yàn)檫@不僅會降低系統(tǒng)的性能,還會引發(fā)各種數(shù)據(jù)不同步的問題。

    那么企業(yè)為什么需要審計(jì)數(shù)據(jù)呢?

    在開始介紹審計(jì)日志系統(tǒng)的架構(gòu)之前,我們首先看一下各種組織對審計(jì)日志系統(tǒng)的一些需求。

  • 合規(guī)性和審計(jì):審計(jì)人員需要從他們的角度出發(fā),以有意義和相關(guān)的方式獲取數(shù)據(jù)。數(shù)據(jù)庫審計(jì)日志適用于 DBA 團(tuán)隊(duì),但并不適合審計(jì)人員。

  • 對于任何大型軟件來說,一個最基本的需求就是能夠在遇到安全漏洞的時候生成重要的告警。審計(jì)日志可以用來實(shí)現(xiàn)這一點(diǎn)。

  • 你必須回答各種問題,比如誰訪問了數(shù)據(jù),數(shù)據(jù)在此之前的狀態(tài)是什么,在更新的時候都修改了哪些內(nèi)容以及內(nèi)部用戶是否濫用了權(quán)限等等。

  • 還有很重要的一點(diǎn)需要注意,因?yàn)閷徲?jì)跟蹤信息能夠有助于識別滲透者,這能夠強(qiáng)化對“內(nèi)部人員”的威懾力。人們?nèi)绻雷约旱男袨闀粚彶?#xff0c;那么他們就不太可能會訪問未經(jīng)授權(quán)的數(shù)據(jù)庫或篡改特定的數(shù)據(jù)。

  • 所有的行業(yè),從金融和能源到餐飲服務(wù)和公共項(xiàng)目,都需要分析數(shù)據(jù)訪問情況,并定期向各種政府機(jī)構(gòu)提交詳細(xì)的報(bào)告。根據(jù)“健康保險(xiǎn)流通與責(zé)任法案(Health Insurance Portability and Accountability Act,HIPAA)”,該法案要求醫(yī)療服務(wù)供應(yīng)商提供所有接觸他們數(shù)據(jù)記錄的每個人的審計(jì)跟蹤數(shù)據(jù),這個要求要到數(shù)據(jù)行和記錄級別。新的歐盟通用數(shù)據(jù)保護(hù)條例(European Union General Data Protection Regulation,GDPR)也有類似的需求。薩班斯-奧克斯利法案(Sarbanes-Oxley Act,SOX)對公眾公司提出了廣泛的會計(jì)法規(guī)。這些組織需要定期分析數(shù)據(jù)訪問情況并生成詳細(xì)的報(bào)告。

  • 在本文中,我將會使用像 Maxwell’s Daemon 和 Kafka 這樣的技術(shù)提供一個可擴(kuò)展的方案,以管理審計(jì)跟蹤數(shù)據(jù)。

  • 問題陳述

    構(gòu)建一個獨(dú)立于應(yīng)用程序和數(shù)據(jù)模型的審計(jì)系統(tǒng)。該系統(tǒng)必須要具備可擴(kuò)展性并且經(jīng)濟(jì)劃算。

    架構(gòu)

    重要提示:本系統(tǒng)只適用于使用 MySQL 數(shù)據(jù)庫的情況,并且使用基于 ROW 的binlog日志格式。

    在我們討論解決方案的細(xì)節(jié)之前,我們先快速看一下本文中所討論的每項(xiàng)技術(shù)。

    Maxwell’s Daemon

    Maxwell’s Daemon(MD)是一個來自Zendesk的開源項(xiàng)目,它會讀取 MySQL bin 日志并將 ROW 更新以 JSON 的格式寫入到 Kafka、Kinesis 或其他流平臺上。Maxwell 的運(yùn)維開銷非常低,除了 MySQL 和一些寫入數(shù)據(jù)的地方之外,就沒有其他的需求了,如項(xiàng)目網(wǎng)站所述。簡而言之,MD 是一個數(shù)據(jù)變化捕獲(Change-Data-Capture,CDC)的工具。

    市場上有很多可用的 CDC 變種,比如 Redhat 的 Debezium、Netflix 的 DBLog 以及 LinkedIn 的 Brooklyn。我們這里的環(huán)境可以采用這些工具中的任意一個來實(shí)現(xiàn)。但是,Netflix 的 DBLog 以及 LinkedIn 的 Brooklyn 是為了滿足不足的使用場景而開發(fā)的,正如上述的鏈接中所闡述的那樣。不過,Debezium 與 MD 非常類似,可以用來取代我們的架構(gòu)中的 MD。關(guān)于該選擇 MD 還是 Debezium,我簡要列出了幾件需要考慮的事情。

    ? ? ? ? Debezium 只能寫入數(shù)據(jù)到 Kafka 中,至少這是它支持的主要的生產(chǎn)者。而 MD 支持各種生產(chǎn)者,包括 Kafka。MD 支持的生產(chǎn)者是 afka, Kinesis、Google Cloud Pub/Sub、SQS、Rabbit MQ和 Redis。

    ? ? ? ? MD 提供了編寫自己的生產(chǎn)者并對其進(jìn)行配置的方案。詳情可參考該文檔。

    ? ? ? ?Debezium 的優(yōu)勢在于它可以從多個源讀取變化數(shù)據(jù),比如MySQL、MongoDB、PostgreSQL、SQL Server、Cassandra、DB2和Oracle。在添加新的數(shù)據(jù)源方面,他們非常活躍。而 MD 目前只支持 MySQL 數(shù)據(jù)源。

    Kafka

    Apache Kafka是一個開源的分布式事件流平臺,能夠用于高性能的數(shù)據(jù)管道、流分析、數(shù)據(jù)集成和任務(wù)關(guān)鍵型的應(yīng)用。

    MongoDB

    MongoDB是一個通用的、基于文檔的分布式數(shù)據(jù)庫,它是為現(xiàn)代應(yīng)用開發(fā)人員和云時代所構(gòu)建的。我們使用 MongoDB 只是為了進(jìn)行闡述,你可以選擇其他的方案,比如S3,也可以選擇其他的時序數(shù)據(jù)庫如InfluxDB或Cassandra。

    下圖展示了審計(jì)跟蹤方案的數(shù)據(jù)流圖。

    圖 1 數(shù)據(jù)流圖

    在審計(jì)跟蹤管理系統(tǒng)中,要涉及到如下幾個步驟。

    應(yīng)用程序執(zhí)行數(shù)據(jù)庫寫入、更新或刪除操作。

    SQL 數(shù)據(jù)庫將會以 ROW 格式為這些操作生成 bin 日志。這是 SQL 數(shù)據(jù)庫相關(guān)的配置。

    Maxwell’s Daemon 輪詢 SQL bin 日志,讀取新的條目并將其寫入到 Kafka 主題中。

    消費(fèi)者應(yīng)用輪詢 Kafka 主題以讀取數(shù)據(jù)并進(jìn)行處理。

    消費(fèi)者將處理后的數(shù)據(jù)寫入到新的數(shù)據(jù)存儲中。

    環(huán)境搭建

    為了實(shí)現(xiàn)簡便的環(huán)境搭建,我們在所有可能的地方都盡可能使用 Docker 容器。如果你的機(jī)器還沒有安裝 docker 的話,那么可以考慮安裝Docker Desktop。

    MySQL 數(shù)據(jù)庫

    1.在本地運(yùn)行 mysql 服務(wù)器。如下的命令將會在 3307 端口啟動一個 mysql 容器。

    docker run -p 3307:3306 -p 33061:33060 --name=mysql83 -d mysql/mysql-server:latest

    2.如果這是全新安裝的話,我們并不知道 root 密碼,運(yùn)行如下的命令在控制臺打印密碼出來。

    docker logs mysql83 2>&1 | grep GENERATED

    3.如果需要的話,登錄容器并更改密碼。

    docker exec -it mysql83 mysql -uroot -p alter uer 'root'@'localhost' IDENTIFIED BY 'abcd1234'

    4.處于安全的原因,mysql docker 容器默認(rèn)不允許從外部應(yīng)用進(jìn)行連接。我們需要運(yùn)行如下的命令改變這一點(diǎn)。

    update mysql.user set host = '%' where user='root';

    5.從 mysql 提示窗口退出并重啟 docker 容器。

    docker container restart mysql83

    6.重新登錄 mysql 客戶端并運(yùn)行如下的命令為 maxwell’s daemon 創(chuàng)建用戶。關(guān)于該步驟的詳細(xì)信息,請參考Maxwell’s Daemon的快速指南。

    Kafka 代理

    搭建 Kafka 是一項(xiàng)非常簡單直接的任務(wù)。從該鏈接下載 Kafka。

    運(yùn)行如下的命令:

    提取 Kafka

    tar -xzf kafka_2.13-2.6.0.tgzcd kafka_2.13-2.6.0

    運(yùn)行 Zookeeper,這是目前使用 Kafka 所需要的

    bin/zookeeper-server-start.sh config/zookeeper.properties

    在一個單獨(dú)的終端啟動 Kafka

    bin/kafka-server-start.sh config/server.properties

    在一個單獨(dú)的終端創(chuàng)建主題

    bin/kafka-topics.sh --create --topic maxwell-events --bootstrap-server localhost:9092 --partitions 1 --replication-factor 1

    上述的命令會啟動一個 Kafka 代理并在其中創(chuàng)建一個名為“maxwell-events”的主題。

    要推送消息到該 Kafka 主題,我們可以在新的終端運(yùn)行如下的命令

    bin/kafka-console-producer.sh --topic maxwell-events --broker-list localhost:9092

    上述的命令會給我們顯示一個提示,從中可以輸入消息內(nèi)容,然后點(diǎn)擊回車鍵,以便于發(fā)送消息到 Kafka 中。

    消費(fèi)來自 Kafka 主題的消息

    bin/kafka-console-producer.sh --topic quickstart-events --broker-list localhost:9092

    Maxwell’s Daemon

    通過該地址下載 maxwell’s daemon。

    將其解壓并運(yùn)行如下的命令。

    bin/maxwell --user=maxwell --password=pmaxwell --host=localhost --port=3307

    這樣的話,我們就建立好了 Maxwell 來監(jiān)控前面所搭建的數(shù)據(jù)庫的 bin 日志。當(dāng)然,我們也可以只監(jiān)控幾個數(shù)據(jù)庫或幾個表。關(guān)于這方面的更多信息,請參考Maxwell’s Daemon配置文檔。

    測試環(huán)境

    要測試搭建的環(huán)境是否正確的話,我們可以連接 MySQL,并在一張表中插入一些數(shù)據(jù)。

    現(xiàn)在,在另外一個終端中,運(yùn)行如下的命令:

    bin/kafka-console-consumer.sh --topic maxwell-events? --from-beginning --bootstrap-server localhost:9092

    在終端中,你應(yīng)該能夠看到如下所示的內(nèi)容:

    {"database":"maxwelltest","table":"Persons","type":"insert","ts":1602904030,"xid":17358,"commit":true,"data": {"PersonId":1,"LastName":"Erichsen","FirstName":"Tom","City":"Stavanger"}}

    正如我們所看到的,Maxwell’s Daemon 捕獲到了數(shù)據(jù)庫插入事件并寫入一個 JSON 字符串到 Kafka 主題中,其中包含了事件的詳情。

    搭建 MongoDB

    要在本地運(yùn)行 MongoDB,可以運(yùn)行如下的命令:

    docker run --name mongolocal -p 27017:27017 mongo:latest

    Kafka 消費(fèi)者

    Kafka-consumer 的代碼可以通過GitHub項(xiàng)目獲取。下載源碼并參考 README 文檔以了解如何運(yùn)行。

    最終測試

    最后,我們的環(huán)境搭建終于完成了。登錄 MySQL 數(shù)據(jù)庫并運(yùn)行任意的插入、刪除或更新命令。如果環(huán)境搭建正確的話,將會在 mongodb auditlog 數(shù)據(jù)庫中看到相應(yīng)的條目。我們可以愉快地開始進(jìn)行審計(jì)了!

    結(jié)論

    在本文中所描述的系統(tǒng)在實(shí)際部署中能夠很好地運(yùn)行,為我們提供了一個用戶數(shù)據(jù)之外的額外數(shù)據(jù)源,但是在采用這種架構(gòu)之前,有些權(quán)衡你必須要注意。

  • 基礎(chǔ)設(shè)施成本:要運(yùn)行這種環(huán)境,需要額外的基礎(chǔ)設(shè)施。數(shù)據(jù)要經(jīng)歷網(wǎng)絡(luò)上的多次跳轉(zhuǎn),從數(shù)據(jù)庫到 Kafka,再到另外一個數(shù)據(jù)庫,后面可能還會到一個備份中。這會增加基礎(chǔ)設(shè)施的成本。

  • 因?yàn)閿?shù)據(jù)要經(jīng)歷多次跳轉(zhuǎn),審計(jì)日志無法以實(shí)時的形式進(jìn)行維護(hù)。它可能會延遲幾秒到幾分鐘。我們可能會反問“誰能需要實(shí)時的審計(jì)日志呢?”但是,如果你計(jì)劃使用這種數(shù)據(jù)進(jìn)行實(shí)時監(jiān)控的話,必須要考慮到這一點(diǎn)。

  • 在這個架構(gòu)中,我們捕獲了數(shù)據(jù)的變化,而不是誰改變了數(shù)據(jù)。如果你還關(guān)心哪個數(shù)據(jù)庫用戶改變了數(shù)據(jù)的話,那么這種設(shè)計(jì)就不能提供直接的支持了。

  • 在強(qiáng)調(diào)完這種架構(gòu)的一些權(quán)衡之后,我想重申一下這種環(huán)境的收益,它的主要好處在于:

  • 這種環(huán)境減少了數(shù)據(jù)庫在審計(jì)日志方面的性能損耗,并且滿足傳統(tǒng)數(shù)據(jù)源在市場營銷和告警方面的需要。

  • 易于搭建,并且比較健壯:環(huán)境中任意組件的任意問題都不會造成數(shù)據(jù)的丟失。例如,如果 MD 出現(xiàn)故障的話,數(shù)據(jù)依然會保存在 bin 日志文件中,當(dāng) daemon 下次運(yùn)行的時候,能夠從上次處理的地方繼續(xù)讀取。如果 Kafka 代理出現(xiàn)故障的話,MD 能夠探測到并且會停止從 bin 日志中讀取數(shù)據(jù)。如果 Kafka 消費(fèi)者崩潰的話,數(shù)據(jù)會依然保留在 Kafka 代理中。所以,在最糟糕的情況下,審計(jì)日志會延遲但是不會出現(xiàn)數(shù)據(jù)丟失。

  • 環(huán)境搭建過程非常簡單,并不需要耗費(fèi)太多的開發(fā)精力。

  • 原文地址:https://www.infoq.cn/article/KuhboGV2zpeI00k1Rxwu

    作者簡介

    Vishal Sinha 是一位充滿激情的技術(shù)專家,對分布式計(jì)算和大型可擴(kuò)展系統(tǒng)有著專業(yè)的知識和濃厚的興趣。目前,他在一家領(lǐng)先的印度獨(dú)角獸公司擔(dān)任技術(shù)總監(jiān)。在 16 年的軟件行業(yè)生涯中,他曾在多家跨國公司和創(chuàng)業(yè)公司工作,開發(fā)過各種大規(guī)模的系統(tǒng),并領(lǐng)導(dǎo)過一個由眾多軟件工程師組成的團(tuán)隊(duì)。他喜歡解決復(fù)雜的問題和嘗試新技術(shù)。

    想知道更多?掃描下面的二維碼關(guān)注我后臺回復(fù)"技術(shù)",加入技術(shù)群后臺回復(fù)“k8s”,可領(lǐng)取k8s資料【精彩推薦】
    • 原創(chuàng)|OpenAPI標(biāo)準(zhǔn)規(guī)范

    • 中臺不是萬能藥,關(guān)于中臺的思考和嘗試

    • ClickHouse到底是什么?為什么如此牛逼!

    • 原來ElasticSearch還可以這么理解

    • 面試官:InnoDB中一棵B+樹可以存放多少行數(shù)據(jù)?

    • 微服務(wù)下如何解耦?對于已經(jīng)緊耦合下如何重構(gòu)?

    • 如何構(gòu)建一套高性能、高可用、低成本的視頻處理系統(tǒng)?

    • 架構(gòu)之道:分離業(yè)務(wù)邏輯和技術(shù)細(xì)節(jié)

    • 星巴克不使用兩階段提交

    點(diǎn)個贊+在看,少個 bug?????

    總結(jié)

    以上是生活随笔為你收集整理的如何使用 Kafka、MongoDB 和 Maxwell’s Daemon 构建 SQL 数据库的审计系统的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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