發(fā)布于:2021-01-07 10:23:46
0
243
0
NoSQLBench于2020年3月發(fā)布,它是第一個測試工具,旨在涵蓋任何嚴肅的測試工具在分布式系統(tǒng)上應(yīng)具備的所有基礎(chǔ)。同時,它旨在使休閑和認真的用戶都可以使用。
什么是NoSQLBench?
今天的開發(fā)人員希望構(gòu)建可擴展的應(yīng)用程序。這要求使用可在多個位置運行的分布式系統(tǒng),無論這些是容器映像還是跨公共,私有或混合云平臺運行的服務(wù)。但是,測試這些應(yīng)用程序比應(yīng)做的難。
規(guī)模系統(tǒng)的性能測試工具受到限制。NoSQLBench于2020年3月發(fā)布,它是第一個測試工具,旨在涵蓋任何嚴肅的測試工具在分布式系統(tǒng)上應(yīng)具備的所有基礎(chǔ)。同時,它旨在使休閑和認真的用戶都可以使用。
NoSQLBench旨在解決測試挑戰(zhàn),而其他工具根本不是針對這些挑戰(zhàn)而設(shè)計的。它允許用戶使用目標系統(tǒng)的本機查詢語言對訪問模式進行建模。它不假定所有NoSQL數(shù)據(jù)庫只是同一思想的不同版本。NoSQLBench不需要您成為開發(fā)人員就可以構(gòu)建有意義的測試,也不需要您隨批處理數(shù)據(jù)一起提供實際的測試數(shù)據(jù)或操作。
使用NoSQLBench配置工作負載后,就可以執(zhí)行了。如果您需要更改操作中使用的訪問模式或數(shù)據(jù),這是一個配置更改,您準備再次進行測試。即使使用任意大小的數(shù)據(jù)集,這也是可能的。這使用戶可以直接洞悉在生產(chǎn)時對于同等工作量的期望。
NoSQLBench具有其他測試工具中找不到的功能:
面向配方的過程數(shù)據(jù)生成—用于復制和粘貼訪問大量虛擬數(shù)據(jù)集的功能
確定性的工作負載行為-每個周期都是特定且可重復的
模塊化協(xié)議支持-從cql等開始
語句和數(shù)據(jù)的配置語言—操作和訪問模式的語言
內(nèi)置腳本—啟用自動機驅(qū)動的高級場景分析
特定于周期的操作和診斷-您可以重試任何特定的周期以了解更多信息
docker-metrics儀表板—支持自動運行和配置基于docker的grafana堆棧以實現(xiàn)豐富的儀表板
高保真度指標的一致視圖,支持協(xié)調(diào)的遺漏,具有多種輸出格式和報告選項
這些功能各自以各自的方式發(fā)揮重要作用。當放在一起時,他們會創(chuàng)建一個功能強大的工具箱,使每個人的性能測試變得更加輕松。NoSQLBench使我們能夠?qū)W⒂跍y試需求,而不會在測試工具上做出妥協(xié)。
這也意味著我們可以避免構(gòu)建一次性測試工具的昂貴且復雜的問題。實際上,這些短命的工具通常具有嚴重的缺陷。畢竟,構(gòu)建以所有正確方式正常工作的測試工具并非易事。我們希望通過提供可以處理所有堅硬零件而又不脫離用戶控制權(quán)的方式來打破這種模式。
性能測試工具需要花費一些時間才能在測試人員的工具箱中贏得一席之地。值得慶幸的是,無論對于DataStax還是客戶,NoSQLBench都已證明自己是一種寶貴的工具。
核心概念
NoSQLBench工作負載在YAML配置文件中進行組織。工作量主要基于語句 ,因此YAML格式強調(diào)了這一點。您還可以向這些語句添加綁定 ,以指定用于操作的數(shù)據(jù)。要組織和選擇活動語句,可以添加標簽。語句還可以具有特定于語句的語句參數(shù) ,例如是否將操作標記為冪等,或是否使用準備好的語句,等等。
Hello World
本教程是對基本NoSQLBench工作流程的高級介紹。您可以將其用作進行任何級別測試的基本模板。如果您在測試中需要更多具體細節(jié),請隨時添加。假設(shè)您想使用CQL將10億條記錄寫入目標系統(tǒng)。為此,您將要使用cql驅(qū)動程序。
假設(shè)您從這樣的語句草圖開始:
# hello-world-dml.yaml statements: - example: | insert into hello.world (cycle,name,sample) values ({cycle},{cyclename},{sample}); bindings: cycle: Identity() cyclename: NumberNameToString() sample: Normal(100.0D, 10.0D)
現(xiàn)在我們有了一個起點,我們?nèi)绾沃浪鼘⑼瓿晌覀兿胍模?/span>
您可以逐周期預覽語句的外觀。這是stdout驅(qū)動程序如何解釋此配置以產(chǎn)生一些語句的方式:
nb run driver=stdout yaml=hello-world-dml.yaml cycles=5# output Logging to logs/scenario_20200403_101645_863.log insert into hello.world (cycle,name,sample) values (0,zero,95.30390911280935); insert into hello.world (cycle,name,sample) values (1,one,104.73915634900615); insert into hello.world (cycle,name,sample) values (2,two,112.3236295086616); insert into hello.world (cycle,name,sample) values (3,three,111.38872920562173); insert into hello.world (cycle,name,sample) values (4,four,91.52878591168258);
很好,我們已經(jīng)有了一些有用的東西!您看到的是使用stdout 驅(qū)動程序執(zhí)行活動的結(jié)果。該驅(qū)動程序不講任何有線協(xié)議,但是它知道如何將渲染的操作打印到控制臺進行診斷。這是熟悉數(shù)據(jù)綁定的一種非常常見的方式。這也是一種快速檢查如果在Apache Cassandra數(shù)據(jù)庫上運行工作負載將執(zhí)行哪些操作的快速方法。為此,您需要做的就是將driver = stdout更改為driver = cql并提供要連接的主機。
這顯示了在整個測試場景中擁有一組通用的概念和配置原語的力量。這并不意味著不同的系統(tǒng)會神奇地說出彼此的陳述形式和協(xié)議,而是意味著您可以以慣用的方式表達它們并針對目標系統(tǒng)定制測試。NoSQLBench高級驅(qū)動程序(如cql)的工作是使語句模板適應(yīng)所使用協(xié)議的本機形式。任何不允許您使用目標系統(tǒng)的本地語言來控制訪問模式和操作的性能測試工具,對于認真的測試都沒有用。
輸出中的每一行都演示了每個操作的周期數(shù)是如何具體的,以及如何將其用作每個操作中使用的數(shù)據(jù)的基礎(chǔ)。
如果將達到此目標所需的工作量與任何其他測試工具進行比較,您將開始明白為什么我們要努力構(gòu)建此工具包。繼續(xù)閱讀,使用NoSQLBench的原因?qū)㈤_始堆積起來!
下一級
那么,我們?nèi)绾螌⑦@個草圖放在上面,并將其轉(zhuǎn)換為易于人們使用和運行的東西?為此,我們需要允許他們設(shè)置整個測試方案,包括DDL。值得慶幸的是,這很容易做到,因為NoSQLBench中沒有任何語句形式是神圣的。您只需創(chuàng)建語句來定義您的鍵空間和架構(gòu):
這是我們的架構(gòu)工作負載配置:
# hello-world-ddl.yaml statements: - create-keyspace: | create keyspace if not exists hello WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '1'}; params: prepared: false - create-table: | create table if not exists hello.world ( cycle bigint, name text, sample double, primary key(cycle) ); params: prepared: false
這顯示了兩個沒有綁定的語句(DDL不需要它們),還有一個新的YAML元素,稱為語句參數(shù)。的準備:錯誤設(shè)置禁止自動使用準備好的發(fā)言的,因為你不能做到這一點與DDL。
但是現(xiàn)在我們有兩個語句塊,只要將它們保存在單獨的文件中就可以了。但是,我們可以做得更好。NoSQLBench YAML格式已經(jīng)過改進,可以支持各種測試結(jié)構(gòu),包括塊,標簽和默認值。它仍然是完全有效的YAML,但是NoSQLBench知道如何以一種有用的方式將這些層組合在一起:
# hello-world.yaml bindings: cycle: Identity() cyclename: NumberNameToString() sample: Normal(100.0D, 10.0D) randomish_cycle: HashRangeScaled() blocks: - tags: phase: schema params: prepared: false statements: - create-keyspace: | create keyspace if not exists hello WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '1'}; - create-table: | create table if not exists hello.world ( cycle bigint, name text, sample double, primary key(cycle) ); - tags: phase: main statements: - insert-sample: | insert into hello.world (cycle,name,sample) values ({cycle},{cyclename},{sample}); ratio: 4 - read-sample: | select * from hello.world where cycle={randomish_cycle} ratio: 1
此版本中的新元素如下:
綁定部分未直接附加到insert-sample語句。由于插入樣本語句模板中的名稱引用了全局文檔范圍中提供的綁定名稱,因此將使用它們。任何未引用的綁定都只是一個配方。如果不使用它,則不會被調(diào)用。
介紹了語句塊。這是一種組織語句的方式,以便您可以將它們作為一組進行配置和引用。第一塊中的所有DDL語句的語句參數(shù)均為prepare:false
使用語句標簽。這使我們可以選擇活動語句,如我們在下一節(jié)中將演示的那樣。第一個塊中定義的所有語句都將具有塊級別的配置,標簽階段為:schema。第二個塊中的所有語句(唯一的一條)將具有標記階段:main
添加了新的語句來說明讀取。饋送randomish_cycle綁定的函數(shù)將生成一個介于0和當前操作周期之間的值。
為了說明目的,添加了一些比率。在上述比率下,每5次操作將使用4次插入操作,而讀取操作將是第5次操作。為每個周期選擇的陳述也基于比率確定。
現(xiàn)在我們已經(jīng)將不同類型的語句組織到了測試工作流的不同部分,我們可以單獨調(diào)用它們。
注意:重要的是要注意YAML文件中的正確縮進。第一次使用YAML的用戶經(jīng)常為此感到困擾。確保使用空格而不是制表符,并且縮進所有子元素而不是其父元素。如果您以前從未使用過YAML,那么在構(gòu)建更高級的方案之前先熟悉一下YAML是一個好主意。我們建議使用EAML Goebelbecker撰寫的YAML教程:幾分鐘內(nèi)入門所需的一切。
創(chuàng)建架構(gòu)(帶有標簽)
本部分要求您具有要連接的CQL系統(tǒng)。如果您還沒有,則可以使用以下這種方式啟動DSE實例:
docker run -e DS_LICENSE=accept --name my-dse -p 9042:9042 -d datastax/dse-server:6.7.7
讓我們創(chuàng)建模式。
nb run driver=cql yaml=hello-world tags=phase:schema host=host # output Logging to logs/scenario_20200205_013213_767.log
請注意,沒有控制臺輸出。這是因為NoSQLBench假定除非您要求,否則您不希望細節(jié)受到困擾。如果您確實想查看詳細信息,則可以始終拋出-v來提高控制臺日志記錄級別,從警告到信息,或者-vv進行調(diào)試。
打開它
現(xiàn)在,我們還可以執(zhí)行一些DML操作:
nb run driver=cql yaml=hello-world tags=phase:main host=host cycles=1M # output 01:53:23.719 [scenarios:001] WARN i.e.activityimpl.SimpleActivity - For testing at scale, it is highly recommended that you set threads to a value higher than the default of 1. hint: you can use threads=auto for reasonable default, or consult the topic on threads with `help threads` for more information. ^C (I hit control-C to interrupt it.)
NoSQLBench輕輕地提醒我們打開線程。很好。讓我們也將grafana的優(yōu)勢融入其中,這要歸功于與prometheus,grafana和石墨出口商的本地docker集成。
nb run driver=cql yaml=hello-world tags=phase:main host=host cycles=1B threads=20x --docker-metrics# output Logging to logs/scenario_20200205_015849_242.log # every minute you'll see a progress indicator hello-world: 0.36%/Running (details: min=0 cycle=3589475 max=1000000000) hello-world: 0.67%/Running (details: min=0 cycle=6734460 max=1000000000) hello-world: 0.98%/Running (details: min=0 cycle=9777225 max=1000000000)
使用–docker-metrics,在場景開始之前,將在本地系統(tǒng)上組成一個docker堆棧,并預先連接所有度量以自動進入。這是我們剛剛開始使用的功能,但它已經(jīng)非常有用。
外觀如下:
您可以根據(jù)需要以其他格式獲取結(jié)果。如果查看nb help的輸出,您將找到各種報告指標的方法,包括石墨,HDR日志,CSV等。
命名方案
如果您希望每個人都可以使用單個命令來運行您的工作負載,包括架構(gòu)設(shè)置和主階段,則可以執(zhí)行此操作。NoSQLBench的一項新增功能(稱為命名方案)使您可以將命令以如下形式嵌入到工作負載YAML中:
# add this to hello-world.yaml scenarios: default: ddl: run driver=cql tags==phase:schema threads==1 cycles==2 dml: run driver=cql tags==phase:main threads=auto cycles=1M
這樣,您可以運行以下命令從頭到尾運行測試:
nb hello-world host=host
最終結(jié)果是,使用了命名方案中的兩個模板化命令,而命令行上的任何選項都將其覆蓋,而不會被“ ==”鎖定。當然,您仍然可以將其與–docker-metrics和其他選項結(jié)合使用。您還可以使用default以外的名稱來編纂不同的命名方案,并將它們作為工作負載的yaml文件之外的第二個選擇器傳遞。這是一個相對較新的功能,但是已經(jīng)用于將常見工作負載的目錄烘焙到NoSQLBench中。
深入
您可以在http://docs.nosqlbench.io/上訪問NoSQLBench文檔。
您還可以使用docserver模式訪問NoSQLBench的文檔,作為該工具本身的一部分。使用與該工具捆綁在一起的文檔,您將永遠不會懷疑這些文檔是否與您使用的版本有關(guān)。此模式也是希望UI功能進入NoSQLBench的方式。
您可以使用以下docker命令啟動docserver模式:
docker run --rm -a STDOUT --net=host --name nb-docs nosqlbench/nosqlbench docserver http://0.0.0.0:12345/# output Started documentation server at http://0.0.0.0:12345/# ornb docserver # output Started documentation server at http://localhost:12345/
然后,您可以在啟動它的系統(tǒng)上的可路由地址處瀏覽到它。
要完全控制NoSQLBench場景,需要了解一些活動參數(shù),例如線程。強烈建議新用戶閱讀指南中的基本活動參數(shù)。
獲取NoSQLBench
您可以在https://github.com/nosqlbench/nosqlbench/releases下載NoSQLBench的最新版本。
未來
NoSQLBench一直在改進。必須首先構(gòu)建NoSQLBench的核心機制,但是下一個改進的時代將集中在增強用戶使用它的方式上。我們一直期待著重大的改進:
改進的文檔
內(nèi)置的改進示例
其他驅(qū)動程序
用戶界面以補充指南
NoSQLBench允許您查看在有或沒有應(yīng)用程序的情況下數(shù)據(jù)庫的性能。它使得可以迭代數(shù)據(jù)模型,測量基準性能并計劃規(guī)模。
無論您要測試的是什么NoSQL數(shù)據(jù)庫,我們都希望使每個人都能使用一組通用的概念和工具來簡化測試。為了實現(xiàn)這一目標,我們希望使NoSQLBench建立在用于NoSQL測試的事實上的標準上的工具集。通過將NoSQLBench和CQL驅(qū)動程序發(fā)布為開源,我們邁出了實現(xiàn)這一愿景的第一步。