發(fā)布于:2021-01-07 10:23:46
0
238
0
NoSQLBench于2020年3月發(fā)布,它是第一個(gè)測(cè)試工具,旨在涵蓋任何嚴(yán)肅的測(cè)試工具在分布式系統(tǒng)上應(yīng)具備的所有基礎(chǔ)。同時(shí),它旨在使休閑和認(rèn)真的用戶都可以使用。
什么是NoSQLBench?
今天的開(kāi)發(fā)人員希望構(gòu)建可擴(kuò)展的應(yīng)用程序。這要求使用可在多個(gè)位置運(yùn)行的分布式系統(tǒng),無(wú)論這些是容器映像還是跨公共,私有或混合云平臺(tái)運(yùn)行的服務(wù)。但是,測(cè)試這些應(yīng)用程序比應(yīng)做的難。
規(guī)模系統(tǒng)的性能測(cè)試工具受到限制。NoSQLBench于2020年3月發(fā)布,它是第一個(gè)測(cè)試工具,旨在涵蓋任何嚴(yán)肅的測(cè)試工具在分布式系統(tǒng)上應(yīng)具備的所有基礎(chǔ)。同時(shí),它旨在使休閑和認(rèn)真的用戶都可以使用。
NoSQLBench旨在解決測(cè)試挑戰(zhàn),而其他工具根本不是針對(duì)這些挑戰(zhàn)而設(shè)計(jì)的。它允許用戶使用目標(biāo)系統(tǒng)的本機(jī)查詢語(yǔ)言對(duì)訪問(wèn)模式進(jìn)行建模。它不假定所有NoSQL數(shù)據(jù)庫(kù)只是同一思想的不同版本。NoSQLBench不需要您成為開(kāi)發(fā)人員就可以構(gòu)建有意義的測(cè)試,也不需要您隨批處理數(shù)據(jù)一起提供實(shí)際的測(cè)試數(shù)據(jù)或操作。
使用NoSQLBench配置工作負(fù)載后,就可以執(zhí)行了。如果您需要更改操作中使用的訪問(wèn)模式或數(shù)據(jù),這是一個(gè)配置更改,您準(zhǔn)備再次進(jìn)行測(cè)試。即使使用任意大小的數(shù)據(jù)集,這也是可能的。這使用戶可以直接洞悉在生產(chǎn)時(shí)對(duì)于同等工作量的期望。
NoSQLBench具有其他測(cè)試工具中找不到的功能:
面向配方的過(guò)程數(shù)據(jù)生成—用于復(fù)制和粘貼訪問(wèn)大量虛擬數(shù)據(jù)集的功能
確定性的工作負(fù)載行為-每個(gè)周期都是特定且可重復(fù)的
模塊化協(xié)議支持-從cql等開(kāi)始
語(yǔ)句和數(shù)據(jù)的配置語(yǔ)言—操作和訪問(wèn)模式的語(yǔ)言
內(nèi)置腳本—啟用自動(dòng)機(jī)驅(qū)動(dòng)的高級(jí)場(chǎng)景分析
特定于周期的操作和診斷-您可以重試任何特定的周期以了解更多信息
docker-metrics儀表板—支持自動(dòng)運(yùn)行和配置基于docker的grafana堆棧以實(shí)現(xiàn)豐富的儀表板
高保真度指標(biāo)的一致視圖,支持協(xié)調(diào)的遺漏,具有多種輸出格式和報(bào)告選項(xiàng)
這些功能各自以各自的方式發(fā)揮重要作用。當(dāng)放在一起時(shí),他們會(huì)創(chuàng)建一個(gè)功能強(qiáng)大的工具箱,使每個(gè)人的性能測(cè)試變得更加輕松。NoSQLBench使我們能夠?qū)W⒂跍y(cè)試需求,而不會(huì)在測(cè)試工具上做出妥協(xié)。
這也意味著我們可以避免構(gòu)建一次性測(cè)試工具的昂貴且復(fù)雜的問(wèn)題。實(shí)際上,這些短命的工具通常具有嚴(yán)重的缺陷。畢竟,構(gòu)建以所有正確方式正常工作的測(cè)試工具并非易事。我們希望通過(guò)提供可以處理所有堅(jiān)硬零件而又不脫離用戶控制權(quán)的方式來(lái)打破這種模式。
性能測(cè)試工具需要花費(fèi)一些時(shí)間才能在測(cè)試人員的工具箱中贏得一席之地。值得慶幸的是,無(wú)論對(duì)于DataStax還是客戶,NoSQLBench都已證明自己是一種寶貴的工具。
核心概念
NoSQLBench工作負(fù)載在YAML配置文件中進(jìn)行組織。工作量主要基于語(yǔ)句 ,因此YAML格式強(qiáng)調(diào)了這一點(diǎn)。您還可以向這些語(yǔ)句添加綁定 ,以指定用于操作的數(shù)據(jù)。要組織和選擇活動(dòng)語(yǔ)句,可以添加標(biāo)簽。語(yǔ)句還可以具有特定于語(yǔ)句的語(yǔ)句參數(shù) ,例如是否將操作標(biāo)記為冪等,或是否使用準(zhǔn)備好的語(yǔ)句,等等。
Hello World
本教程是對(duì)基本NoSQLBench工作流程的高級(jí)介紹。您可以將其用作進(jìn)行任何級(jí)別測(cè)試的基本模板。如果您在測(cè)試中需要更多具體細(xì)節(jié),請(qǐng)隨時(shí)添加。假設(shè)您想使用CQL將10億條記錄寫(xiě)入目標(biāo)系統(tǒng)。為此,您將要使用cql驅(qū)動(dòng)程序。
假設(shè)您從這樣的語(yǔ)句草圖開(kāi)始:
# 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)在我們有了一個(gè)起點(diǎn),我們?nèi)绾沃浪鼘⑼瓿晌覀兿胍模?/span>
您可以逐周期預(yù)覽語(yǔ)句的外觀。這是stdout驅(qū)動(dòng)程序如何解釋此配置以產(chǎn)生一些語(yǔ)句的方式:
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ū)動(dòng)程序執(zhí)行活動(dòng)的結(jié)果。該驅(qū)動(dòng)程序不講任何有線協(xié)議,但是它知道如何將渲染的操作打印到控制臺(tái)進(jìn)行診斷。這是熟悉數(shù)據(jù)綁定的一種非常常見(jiàn)的方式。這也是一種快速檢查如果在Apache Cassandra數(shù)據(jù)庫(kù)上運(yùn)行工作負(fù)載將執(zhí)行哪些操作的快速方法。為此,您需要做的就是將driver = stdout更改為driver = cql并提供要連接的主機(jī)。
這顯示了在整個(gè)測(cè)試場(chǎng)景中擁有一組通用的概念和配置原語(yǔ)的力量。這并不意味著不同的系統(tǒng)會(huì)神奇地說(shuō)出彼此的陳述形式和協(xié)議,而是意味著您可以以慣用的方式表達(dá)它們并針對(duì)目標(biāo)系統(tǒng)定制測(cè)試。NoSQLBench高級(jí)驅(qū)動(dòng)程序(如cql)的工作是使語(yǔ)句模板適應(yīng)所使用協(xié)議的本機(jī)形式。任何不允許您使用目標(biāo)系統(tǒng)的本地語(yǔ)言來(lái)控制訪問(wèn)模式和操作的性能測(cè)試工具,對(duì)于認(rèn)真的測(cè)試都沒(méi)有用。
輸出中的每一行都演示了每個(gè)操作的周期數(shù)是如何具體的,以及如何將其用作每個(gè)操作中使用的數(shù)據(jù)的基礎(chǔ)。
如果將達(dá)到此目標(biāo)所需的工作量與任何其他測(cè)試工具進(jìn)行比較,您將開(kāi)始明白為什么我們要努力構(gòu)建此工具包。繼續(xù)閱讀,使用NoSQLBench的原因?qū)㈤_(kāi)始堆積起來(lái)!
下一級(jí)
那么,我們?nèi)绾螌⑦@個(gè)草圖放在上面,并將其轉(zhuǎn)換為易于人們使用和運(yùn)行的東西?為此,我們需要允許他們?cè)O(shè)置整個(gè)測(cè)試方案,包括DDL。值得慶幸的是,這很容易做到,因?yàn)镹oSQLBench中沒(méi)有任何語(yǔ)句形式是神圣的。您只需創(chuàng)建語(yǔ)句來(lái)定義您的鍵空間和架構(gòu):
這是我們的架構(gòu)工作負(fù)載配置:
# 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
這顯示了兩個(gè)沒(méi)有綁定的語(yǔ)句(DDL不需要它們),還有一個(gè)新的YAML元素,稱為語(yǔ)句參數(shù)。的準(zhǔn)備:錯(cuò)誤設(shè)置禁止自動(dòng)使用準(zhǔn)備好的發(fā)言的,因?yàn)槟悴荒茏龅竭@一點(diǎn)與DDL。
但是現(xiàn)在我們有兩個(gè)語(yǔ)句塊,只要將它們保存在單獨(dú)的文件中就可以了。但是,我們可以做得更好。NoSQLBench YAML格式已經(jīng)過(guò)改進(jìn),可以支持各種測(cè)試結(jié)構(gòu),包括塊,標(biāo)簽和默認(rèn)值。它仍然是完全有效的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語(yǔ)句。由于插入樣本語(yǔ)句模板中的名稱引用了全局文檔范圍中提供的綁定名稱,因此將使用它們。任何未引用的綁定都只是一個(gè)配方。如果不使用它,則不會(huì)被調(diào)用。
介紹了語(yǔ)句塊。這是一種組織語(yǔ)句的方式,以便您可以將它們作為一組進(jìn)行配置和引用。第一塊中的所有DDL語(yǔ)句的語(yǔ)句參數(shù)均為prepare:false
使用語(yǔ)句標(biāo)簽。這使我們可以選擇活動(dòng)語(yǔ)句,如我們?cè)谙乱还?jié)中將演示的那樣。第一個(gè)塊中定義的所有語(yǔ)句都將具有塊級(jí)別的配置,標(biāo)簽階段為:schema。第二個(gè)塊中的所有語(yǔ)句(唯一的一條)將具有標(biāo)記階段:main
添加了新的語(yǔ)句來(lái)說(shuō)明讀取。饋送randomish_cycle綁定的函數(shù)將生成一個(gè)介于0和當(dāng)前操作周期之間的值。
為了說(shuō)明目的,添加了一些比率。在上述比率下,每5次操作將使用4次插入操作,而讀取操作將是第5次操作。為每個(gè)周期選擇的陳述也基于比率確定。
現(xiàn)在我們已經(jīng)將不同類型的語(yǔ)句組織到了測(cè)試工作流的不同部分,我們可以單獨(dú)調(diào)用它們。
注意:重要的是要注意YAML文件中的正確縮進(jìn)。第一次使用YAML的用戶經(jīng)常為此感到困擾。確保使用空格而不是制表符,并且縮進(jìn)所有子元素而不是其父元素。如果您以前從未使用過(guò)YAML,那么在構(gòu)建更高級(jí)的方案之前先熟悉一下YAML是一個(gè)好主意。我們建議使用EAML Goebelbecker撰寫(xiě)的YAML教程:幾分鐘內(nèi)入門(mén)所需的一切。
創(chuàng)建架構(gòu)(帶有標(biāo)簽)
本部分要求您具有要連接的CQL系統(tǒng)。如果您還沒(méi)有,則可以使用以下這種方式啟動(dòng)DSE實(shí)例:
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
請(qǐng)注意,沒(méi)有控制臺(tái)輸出。這是因?yàn)镹oSQLBench假定除非您要求,否則您不希望細(xì)節(jié)受到困擾。如果您確實(shí)想查看詳細(xì)信息,則可以始終拋出-v來(lái)提高控制臺(tái)日志記錄級(jí)別,從警告到信息,或者-vv進(jìn)行調(diào)試。
打開(kāi)它
現(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輕輕地提醒我們打開(kāi)線程。很好。讓我們也將grafana的優(yōu)勢(shì)融入其中,這要?dú)w功于與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,在場(chǎng)景開(kāi)始之前,將在本地系統(tǒng)上組成一個(gè)docker堆棧,并預(yù)先連接所有度量以自動(dòng)進(jìn)入。這是我們剛剛開(kāi)始使用的功能,但它已經(jīng)非常有用。
外觀如下:
您可以根據(jù)需要以其他格式獲取結(jié)果。如果查看nb help的輸出,您將找到各種報(bào)告指標(biāo)的方法,包括石墨,HDR日志,CSV等。
命名方案
如果您希望每個(gè)人都可以使用單個(gè)命令來(lái)運(yùn)行您的工作負(fù)載,包括架構(gòu)設(shè)置和主階段,則可以執(zhí)行此操作。NoSQLBench的一項(xiàng)新增功能(稱為命名方案)使您可以將命令以如下形式嵌入到工作負(fù)載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
這樣,您可以運(yùn)行以下命令從頭到尾運(yùn)行測(cè)試:
nb hello-world host=host
最終結(jié)果是,使用了命名方案中的兩個(gè)模板化命令,而命令行上的任何選項(xiàng)都將其覆蓋,而不會(huì)被“ ==”鎖定。當(dāng)然,您仍然可以將其與–docker-metrics和其他選項(xiàng)結(jié)合使用。您還可以使用default以外的名稱來(lái)編纂不同的命名方案,并將它們作為工作負(fù)載的yaml文件之外的第二個(gè)選擇器傳遞。這是一個(gè)相對(duì)較新的功能,但是已經(jīng)用于將常見(jiàn)工作負(fù)載的目錄烘焙到NoSQLBench中。
深入
您可以在http://docs.nosqlbench.io/上訪問(wèn)NoSQLBench文檔。
您還可以使用docserver模式訪問(wèn)NoSQLBench的文檔,作為該工具本身的一部分。使用與該工具捆綁在一起的文檔,您將永遠(yuǎn)不會(huì)懷疑這些文檔是否與您使用的版本有關(guān)。此模式也是希望UI功能進(jìn)入NoSQLBench的方式。
您可以使用以下docker命令啟動(dòng)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/
然后,您可以在啟動(dòng)它的系統(tǒng)上的可路由地址處瀏覽到它。
要完全控制NoSQLBench場(chǎng)景,需要了解一些活動(dòng)參數(shù),例如線程。強(qiáng)烈建議新用戶閱讀指南中的基本活動(dòng)參數(shù)。
獲取NoSQLBench
您可以在https://github.com/nosqlbench/nosqlbench/releases下載NoSQLBench的最新版本。
未來(lái)
NoSQLBench一直在改進(jìn)。必須首先構(gòu)建NoSQLBench的核心機(jī)制,但是下一個(gè)改進(jìn)的時(shí)代將集中在增強(qiáng)用戶使用它的方式上。我們一直期待著重大的改進(jìn):
改進(jìn)的文檔
內(nèi)置的改進(jìn)示例
其他驅(qū)動(dòng)程序
用戶界面以補(bǔ)充指南
NoSQLBench允許您查看在有或沒(méi)有應(yīng)用程序的情況下數(shù)據(jù)庫(kù)的性能。它使得可以迭代數(shù)據(jù)模型,測(cè)量基準(zhǔn)性能并計(jì)劃規(guī)模。
無(wú)論您要測(cè)試的是什么NoSQL數(shù)據(jù)庫(kù),我們都希望使每個(gè)人都能使用一組通用的概念和工具來(lái)簡(jiǎn)化測(cè)試。為了實(shí)現(xiàn)這一目標(biāo),我們希望使NoSQLBench建立在用于NoSQL測(cè)試的事實(shí)上的標(biāo)準(zhǔn)上的工具集。通過(guò)將NoSQLBench和CQL驅(qū)動(dòng)程序發(fā)布為開(kāi)源,我們邁出了實(shí)現(xiàn)這一愿景的第一步。
作者介紹
熱門(mén)博客推薦