etcd 和 MongoDB 的混沌(故障注入)測試方法

https://img-blog.csdnimg.cn/370f265df9904be9bfe366dffe402986.png

最近在對一些自建的數據庫 driver/client 基礎庫的健壯性做混沌(故障)測試, 去驗證了解業務的故障處理機制和恢復時長. 主要涉及到了 MongoDB 和 etcd 這兩個基礎組件. 本文會介紹下相關的測試方法.

MongoDB 中的故障測試

MongoDB 是比較世界上熱門的文檔型數據庫, 支持 ACID 事務、分布式等特性.

社區上大部分對 MongoDB 進行混沌(故障)測試的文章大多都是外圍通過對 monogd 或 mongos 進行做處理進行模擬的. 比如如果想要讓 MongoDB 自己觸發副本集切換, 可以通過一下這樣一段 shell 腳本:

# 將副本集主節點進程掛死
kill -s STOP <mongodb-primary-pid># 掛死之后, 業務受損, MongoDB 在幾秒到十幾秒應該會進程主備切換
# 切換完成后, 業務能自動將連接切換到新的工作正常的主節點, 無需人工干預, 業務恢復正常
# 這里一般驗證的是 Mongo Client Driver 的可靠性

上面提到的手段一般是系統層級的, 如果我們只是想要模擬某個 MongoDB command 命令遇到網絡問題了, 怎么做?進一步想要進行更細粒度的測試. 其實 MongoDB 在 4.x 以上版本內部已經實現了一套可控的故障點模擬機制 -> failCommand.

在測試環境部署 MongoDB 副本集的時候, 一般可以通過以下方式啟動這個特性:

mongod --setParameter enableTestCommands=1

然后我們可以通過 mongo shell 針對特定的 command 開啟故障點, 例如針對一次 find 操作讓其返回錯誤碼 2:

db.adminCommand({configureFailPoint: "failCommand",mode: {"times": 1,},data: {errorCode: 2, failCommands: ["find"]}
});

這些故障點模擬是可控的, 成本相對于必直接在機器上搞破壞比較低, 也很適合融入持續集成自動化流程. MongoDB 內置的故障點機制還支持了很多的特性, 比如讓某個故障概率發生、返回任意 MongoDB 支持的錯誤碼類型等等, 通過該機制, 我們可以很方便的在單元測試和集成測試中驗證我們自己實現的 MongoDB Client Driver 的可靠性.

如果想具體知道 MongoDB 支持哪些故障點, 可以詳細查看 MongoDB 提供的 specification, 里面有提到針對 MongoDB 每一個特性, driver 可以使用哪些故障點進行測試.

MongoDB 官方提供的 go 實現的 dirver 代碼倉庫中也有不少的例子可以參考 https://github.com/mongodb/mongo-go-driver/blob/345ea9574e28732ca4f9d7d3bb9c103c897a65b8/mongo/with_transactions_test.go#L122.

etcd 中的故障測試

etcd 是一個開源的、高可用的分布式鍵值存儲系統, 它主要用于共享配置和服務發現.

之前我們提到了 MongoDB 內置了可控的故障點注入機制方便我們做故障點測試, 那么 etcd 是否也提供了呢?

沒錯, etcd 官方也提供了內置的可控故障注入手段方便我們圍繞 etcd 做故障模擬測試, 不過官方提供的可供部署的二進制分發默認是沒有使用故障注入特性的, 區別于 MongoDB 提供了開關, etcd 需要我們手動從源碼編譯出包含故障注入特性的二進制出來去部署.

etcd 官方實現了一個 Go 包 gofail 去做 "可控" 的故障點測試, 可以控制特定故障發生的概率和次數. gofail 可以用于任意 Go 實現的程序中.

原理上通過注釋在源代碼中通過注釋 (// gofail:) 去對可能發生問題的地方埋藏一些故障注入點, 偏于進行測試驗證, 例如:

    if t.backend.hooks != nil {// gofail: var commitBeforePreCommitHook struct{}t.backend.hooks.OnPreCommitUnsafe(t)// gofail: var commitAfterPreCommitHook struct{}}

在使用 go build 構建出二進制之前, 使用 gofail 提供的命令行工具 gofail enable 可以取消這些故障注入相關代碼的注釋, 并生成故障點相關的代碼,這樣編譯出的二進制可以用于故障場景的細粒度測試. 使用 gofail disable 去注釋去除掉生成的故障點相關代碼, 再使用 go build 編譯出的二進制就可以在生產環境使用.

在執行二進制的時候, 可以通過環境變量 GOFAIL_FAILPOINTS 去喚醒故障點, 如果你的二進制程序是個永不停機的服務, 那么可以通過 GOFAIL_HTTP 環境變量在程序啟動的同時, 啟動一個 HTTP endpoint 去給外部測試工具喚醒埋藏的故障點.

具體的原理實現可以查看下 gofail 的設計文檔 -> design.

值的一提的是 pingcap 重新基于 gofail 重新造了個輪子, 做了不少優化: failpoint 相關代碼不應該有任何額外開銷; 不能影響正常功能邏輯,不能對功能代碼有任何侵入; failpoint 代碼必須是易讀、易寫并且能引入編譯器檢測; 最終生成的代碼必須具有可讀性; 生成代碼中,功能邏輯代碼的行號不能發生變化(便于調試); 如果想要了解它的實現原理, 可以查看這篇官方文章: Golang Failpoint 的設計與實現 這篇深度剖析的博客也值得一讀: 在 Go 中使用 Failpoint 注入故障

接下來我們看看如何在 etcd 中啟用這些故障埋點。

編譯出可供進行故障測試的 etcd

etcd 官方倉庫的 Makefile 已經內置了對應的指令幫我們快速編譯出包含故障點二進制 etcd server. 編譯步驟大致如下:

git clone git@github.com:etcd-io/etcd.git
cd etcd# 激活故障點注釋
make gofail-enable
make build
# 還原代碼
make gofail-disable

經過如上步驟之后, 編譯好的二進制文件直接可以在 bin 目錄下可以看到, 讓我們啟動 etcd 看一下:

# 開啟通過 HTTP 激活故障點的方式
GOFAIL_HTTP="127.0.0.1:22381" ./bin/etcd

使用 curl 看下有哪些故障點可以使用:

curl http://127.0.0.1:22381afterCommit=
afterStartDBTxn=
afterWritebackBuf=
applyBeforeOpenSnapshot=
beforeApplyOneConfChange=
beforeApplyOneEntryNormal=
beforeCommit=
beforeLookupWhenForwardLeaseTimeToLive=
beforeLookupWhenLeaseTimeToLive=
beforeSendWatchResponse=
beforeStartDBTxn=
beforeWritebackBuf=
commitAfterPreCommitHook=
commitBeforePreCommitHook=
compactAfterCommitBatch=
compactAfterCommitScheduledCompact=
compactAfterSetFinishedCompact=
compactBeforeCommitBatch=
compactBeforeCommitScheduledCompact=
compactBeforeSetFinishedCompact=
defragBeforeCopy=
defragBeforeRename=
raftAfterApplySnap=
raftAfterSave=
raftAfterSaveSnap=
raftAfterWALRelease=
raftBeforeAdvance=
raftBeforeApplySnap=
raftBeforeFollowerSend=
raftBeforeLeaderSend=
raftBeforeSave=
raftBeforeSaveSnap=
walAfterSync=
walBeforeSync=

知道了故障點, 就可以針對指定故障設置故障類型, 如下:

# beforeLookupWhenForwardLeaseTimeToLive 故障點處 sleep 1 秒
curl http://127.0.0.1:22381/beforeLookupWhenForwardLeaseTimeToLive -XPUT -d'sleep(10000)'
# 查看故障點狀態
curl http://127.0.0.1:22381/beforeLookupWhenForwardLeaseTimeToLive
sleep(1000)

故障點的描述語法見: https://github.com/etcd-io/gofail/blob/master/doc/design.md#syntax

至此, 已經可以利用 etcd 內置的故障點做一些故障模擬測試了, 具體怎么使用這些故障點可以參考下 etcd 官方的集成測試實現 -> etcd Robustness Testing. 通過故障點名稱搜索相關代碼即可.

除了上述這些 etcd 內置的故障點, etcd 的官方倉庫也提供了一份系統級的集成測試例子 -> etcd local-tester, 它模擬了 etcd 集群模式下的節點宕機測試.

好了, 本文的分享, 到此暫時結束啦 ?( ′・?・` )~

小廣告插播: 最近維護了可以維護多個 etcd server、etcdctl、etcductl 版本的工具 vfox-etcd, 你也可以用它來在機器上安裝多個包含 failpoint 的 etcd 版本進行混沌 (故障模擬) 測試哦~

本文由博客一文多發平臺 OpenWrite 發布!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/13873.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/13873.shtml
英文地址,請注明出處:http://en.pswp.cn/web/13873.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

AI網絡爬蟲:批量爬取電視貓上面的《慶余年》分集劇情

電視貓上面有《慶余年》分集劇情&#xff0c;如何批量爬取下來呢&#xff1f; 先找到每集的鏈接地址&#xff0c;都在這個class"epipage clear"的div標簽里面的li標簽下面的a標簽里面&#xff1a; <a href"/drama/Yy0wHDA/episode">1</a> 這個…

速盾:負載均衡能防ddos攻擊嗎?

負載均衡是一種分布式系統的設計思想&#xff0c;通過將流量分散到多個服務器上&#xff0c;以提高系統的穩定性和可擴展性。然而&#xff0c;負載均衡本身并不能完全防止DDoS攻擊&#xff0c;但可以在一定程度上減輕其影響。 DDoS&#xff08;分布式拒絕服務&#xff09;攻擊…

【C語言】8.C語言操作符詳解(1)

文章目錄 1.操作符的分類2.?進制和進制轉換3.原碼、反碼、補碼4.移位操作符4.1 左移操作符4.2 右移操作符 5.位操作符&#xff1a;&、|、^、~5.1 &&#xff1a;按位與5.2 |&#xff1a;按位或5.3 ^&#xff1a;按位異或5.4 ~&#xff1a;按位取反5.5 例題例題1例題2例…

短視頻矩陣系統4年獨立開發正規代發布接口源碼搭建部署開發

1. 短視頻矩陣源碼技術開發要求及實現流程&#xff1a; 短視頻矩陣源碼開發要求具備視頻錄制、編輯、剪輯、分享等基本功能&#xff0c;支持實時濾鏡、特效、音樂等個性化編輯&#xff0c;能夠實現高效的視頻渲染和處理。開發流程主要包括需求分析、技術選型、設計架構、編碼實…

Web前端開發技術、詳細文章、(例子)html 列表、有序列表、無序列表、列表嵌套

目錄 列表概述 列表類型與標記符號 無序列表 語法&#xff1a; 語法說明&#xff1a; 無序列表標記的 type 屬性及其說明 代碼解釋 有序列表 基本語法 屬性說明 1、列表 o1標記的屬性 2、列表項li標記的屬性 有序列表 o1標記的屬性、值 代碼解釋 列表嵌套 基本…

如何將Qt pro工程文件 改成CMakeLists.txt

Qt pro工程管理文件&#xff0c;本人認為是很好用的&#xff0c;語法簡潔易懂&#xff0c;但是只能在QtCreator中使用&#xff0c;想用使用其它IDE比如Clion或者vs&#xff0c;CMakeLists是種通用的選擇&#xff0c;另外QtCreator的調試功能跟粑粑一樣。 一&#xff0c;思路 …

FreeBSD/Linux下的系統資源監視器排隊隊

bpytop bpytop 是一個基于 Python 的資源監視器&#xff0c;可以在 FreeBSD 上使用。它提供了對文件寫入磁盤、網絡、CPU 和內存占用的監視功能。 pkg install bpytop 或者用ports安裝 cd /usr/ports/sysutils/bpytop/ make install clean bashtop bashtop 也是一個基于 P…

化簡資源分配圖判斷是否發生死鎖

目錄 1.資源分配圖的概念 2.判斷是否發生死鎖 1.資源分配圖的概念 資源分配圖表示進程和資源之間的請求關系&#xff0c;例如下圖&#xff1a; P代表進程&#xff0c;R代表資源&#xff0c;R方框中 有幾個圓球就表示有幾個這種資源&#xff0c;在圖中&#xff0c;R1指向P1&a…

C++ RPC ORM 高速解析

支持所有常用編程語 https://capnproto.org/GitHub - capnproto/capnproto: Capn Proto serialization/RPC system - core tools and C library https://capnproto.org/capnproto-c-win32-1.0.2.zip 常用命令&#xff1a; capnp help capnp compile -oc myschema.capn…

java文件上傳時給pdf、word、excel、ppt、圖片添加水印

前言 在開發的過程中&#xff0c;因為文件的特殊性&#xff0c;需要給pdf、word、excel、ppt、圖片添加水印。添加水印可以在文件上傳時添加&#xff0c;也可以在文件下載時添加。因為業務的某些原因&#xff0c;文件需要在瀏覽器預覽&#xff0c;如果用戶將文件另存為則無法添…

算法與數據結構匯總

基本 數組 字符串 排序 矩陣 模擬 枚舉 字符串匹配 桶排序 計數排序 基數排序 回文&#xff1a;中心擴展 馬拉車 樹上啟發式合并 括號 數學表達式 字符串&#xff1a;前后綴分解。 貢獻法 分組&#xff1a; 【狀態機dp 狀態壓縮 分組】1994. 好子集的數目 【動態規劃】【前綴…

Excel中sum的跨表求和

#實際工作中&#xff0c;一個xlsx文件中會包含多個Excel表格&#xff0c;一般會有“總-分”的關系&#xff0c;如何把分表里的數字匯總到總表里呢&#xff1f; 一般有上圖所示的兩種表達方式。 可以使用通配符 *&#xff1a;代表任意個數、任意字符&#xff1b; &#xff1f;&…

51單片機的最小系統詳解

51單片機的最小系統詳解 1. 引言 在嵌入式系統中,51單片機被廣泛應用于各種小型控制器和嵌入式開發板中。相信很多人都接觸過51單片機,但是對于51單片機的最小系統卻了解得不夠深入。本文將從振蕩電路、電源模塊、復位電路、LED指示燈和調試接口五個方面詳細介紹51單片機的…

quartz定時任務

Quartz 數據結構 quartz采用完全二叉樹&#xff1a;除了最后一層每一層節點都是滿的&#xff0c;而且最后一層靠左排列。 二叉樹節點個數規則&#xff1a;每層從左開始&#xff0c;第一層只有一個&#xff0c;就是2的0次冪&#xff0c;第二層兩個就是2的1次冪&#xff0c;第三…

DOS學習-目錄與文件應用操作經典案例-attrib

新書上架~&#x1f447;全國包郵奧~ python實用小工具開發教程http://pythontoolsteach.com/3 歡迎關注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目錄 一.前言 二.使用 三.案例 一.前言 DOS系統中的attrib命令是一個用于顯示或更改文件&#…

設計模式——職責鏈(責任鏈)模式

目錄 職責鏈模式 小俱求實習 結構圖 實例 職責鏈模式優點 職責鏈模式缺點 使用場景 1.springmvc流程 ?2.mybatis的執行流程 3.spring的過濾器和攔截器 職責鏈模式 使多個對象都有機會處理請求&#xff0c;從而避免請求的發送者和接受者之間的耦合關系。將這個對象連成…

github設置項目分類

https://www.php.cn/faq/541957.html https://docs.github.com/zh/repositories/working-with-files/managing-files/creating-new-files

什么是回表,如何解決回表問題

下面表中:主鍵id是聚簇索引&#xff0c;name是輔助索引。 執行這樣一條SQL: select name from A where name"s;name字段是有索引&#xff0c;所以MYSQL在通過name進行査詢的時候&#xff0c;是需要掃描兩顆Btree樹的。 第一遍:先通過二級索引定位主鍵值1。第二遍:根據主鍵…

免費發布web APP的四個途徑(Python和R)

免費發布數據分析類&#x1f310;web APP的幾個途徑&#x1f4f1; 數據分析類web APP目前用來部署生信工具&#xff0c;統計工具和預測模型等&#xff0c;便利快捷&#xff0c;深受大家喜愛。而一個免費的APP部署途徑&#xff0c;對于開發和測試APP都是必要的。根據筆者的經驗…

word-形狀繪制、smartart、visio

一、人員架構圖繪制 小技巧&#xff1a; 1、ctrlshift水平復制 2、點擊圖形&#xff0c;右鍵設置為默認形狀 3、插入-形狀-右鍵-鎖定繪圖模式&#xff0c;按esc退出狀態 4、插入-形狀-新建繪圖畫布&#xff0c;代替組合問題 畫布中存在錨點&#xff0c;便于直線連接 二、s…