閱讀839 返回首頁    go 阿裏雲 go 技術社區[雲棲]


TSDB之KairosDB:Tag對性能的影響測試

在使用TSDB時,在進行數據建模與項目實施時,都需要考慮如何設置標簽?
按常識標簽的數量,對性能是有影響的,所以在如何平衡“用戶統計需求”與“性能”之間,我們需要進行權衡。
那麼,問題出現了:

命題1:是否可以不斷增加標簽?

結論:不可以!增加標簽會犧牲性能
標簽個數從3到6,寫入性能下降20%,讀出性能下降40%。
應謹慎選擇標簽,當新建一些有用的標簽時,也應考慮去除一些無用的標簽。

命題2:標簽值的值域對KairosDB的性能有多大影響?

比如地理位置這樣的標簽,值域是很窄的,不會上千。
但host這樣的標簽,會隨著用戶的設備規模增加。
而如果使用一些帶時間信息的標簽,其值域則隨著時間的推移會不斷增加

結論:有較大的影響
標簽值域從1000做到30000(擴大30倍),寫入性能下降14%,讀出性能下降30%。

命題3:應該選擇多少標簽較為合適?

結論:建議選擇5個以下的標簽數

其它總結

總結1:每增加一個標簽,rowkey增加標簽key=value的字符串長度

由於kairosdb與opentsdb不同,以下是其生成的真實rowkey:
rowkey=0x73797374656d2e6370752e7573616765000000015923d3cc00000d6b6169726f735f646f75626c657461676b6b6b6b6b6b6b6b6b6b6b6b6b313d746167767676767676767676767676363a7461676b6b6b6b6b6b6b6b6b6b6b6b6b323d74616776767676767676767676767631313a7461676b6b6b6b6b6b6b6b6b6b6b6b6b333d7461677676767676767676767676763231333a
轉成string後
system.cpu.usage____Y#ÓÌ___kairos_doubletagkkkkkkkkkkkkk1=tagvvvvvvvvvvvv6:tagkkkkkkkkkkkkk2=tagvvvvvvvvvvvv11:tagkkkkkkkkkkkkk3=tagvvvvvvvvvvvv213:
可以看出,對於kairosdb來說,是直接使用字符串相加的方式,生成rowkey的,所以指標名與標簽的長度越長,rowkey越長。

總結2:標簽與值,應當選擇與時間無關的屬性

因為與時間有關的屬性,其標簽值數量總是會隨著運行時長不斷增長,導致string_index表會一直增長。
像一些項目中的日誌文件名,就含有時間屬性,因此不應該用來作為標簽。

總結3:kairosdb應進行改進,避免write failed無返回值

通過閱讀kairosdb的源代碼可以發現,其內部使用了以下代碼邏輯:
接收請求的線程,隻是簡單的把請求收到,並轉存到數據桶中
數據桶有個數配置,使用配置項kairosdb.datastore.cassandra.write_buffer_job_queue_size來設置
使用獨立的線程,消費數據桶。
所以當數據桶消費失敗時(如無法連接到cassandra、java線程池滿拒絕任務),無法把消息通知到kairosdb的client,導致client會以為寫入是順利的,一直不停的寫入。
通過修改kairosdb的TelnetServer模塊,可實現寫入失敗時,阻塞client,避免client一直寫入數據,導致數據丟失。

總結4:cassandra與kairosdb在windows平台無法充分利用機器性能

在測試過程中搭建了多個環境,發現cassandra與kairosdb無法在windows平台上充分利用機器性能,通過一些配置,都無法把CPU使用率與RAM提高。
但在linux下無此問題,虛擬機裏的性能甚至好於windows宿主機。

總結5:rowkey的查詢原理及租戶或指標間的影響性

kairosdb在處理寫入或查詢操作時,其過程如下:
1. 接收查詢參數:指標、時間範圍、標簽範圍、匯聚參數
2. 根據“指標與時間範圍”,生成rowkey_range_start與rowkey_range_end
3. 向cassandra查詢rowkey_range_start與rowkey_range_end間的所有rowkey,生成match1_rowkeys
4. 針對match1_rowkeys進行計算,分析是否包含了“標簽範圍”中指定的標簽,將包含的rowkeys,生成match2_rowkeys
5. 根據match2_rowkeys查詢數據,並根據“匯聚參數”進行匯聚與返回
由於上述step3 cassandra可以快速的利用集群能力查詢出所在範圍段內的rowkey,所以這裏的成本很低,最大的成本在於step 4,這裏需要大量的數據contains計算。

所以從上述原理可以看出:
1. 指標數量增加,影響非常小,因為step3的成本很低
2. 時間的增加,影響非常小,因為step3的成本很低
3. 標簽組合出來的值域越大,性能越低。因為導致step4的成本較高
測試方案與數據

編寫一個程序,使用不同的tag組合,20線程並發寫入與10線程並發讀取3000萬筆指標,組合如下:

| 序號 | 標簽數 | 標簽組合 | 測試次數 | 寫入TPS | 讀取TPS | rowkey長度 |
| :-: | :-: | --- | :-: | :-: | :-: |
| 1 | 3 | 1. TagPolicy{key='tagkkkkkkkkkkkkk1', value='tagvvvvvvvvvvvv0~10'}
2. TagPolicy{key='tagkkkkkkkkkkkkk2', value='tagvvvvvvvvvvvv0~30'}
3. TagPolicy{key='tagkkkkkkkkkkkkk3', value='tagvvvvvvvvvvvv0~1000'}
| 3 | 33406 | 1.55 | 148 |
| 2 | 6 | 1. TagPolicy{key='tagkkkkkkkkkkkkk1', value='tagvvvvvvvvvvvv0~10'}
2. TagPolicy{key='tagkkkkkkkkkkkkk2', value='tagvvvvvvvvvvvv0~30'}
3. TagPolicy{key='tagkkkkkkkkkkkkk3', value='tagvvvvvvvvvvvv0~1000'}
4. TagPolicy{key='tagkkkkkkkkkkkkk4', value='tagvvvvvvvvvvvv0~10'}
5. TagPolicy{key='tagkkkkkkkkkkkkk5', value='tagvvvvvvvvvvvv0~10'}
6. TagPolicy{key='tagkkkkkkkkkkkkk6', value='tagvvvvvvvvvvvv0~10'} | 2 | 26860 | 0.95 | 無 |
| 3 | 9 | 1. TagPolicy{key='tagkkkkkkkkkkkkk1', value='tagvvvvvvvvvvvv0~10'}
2. TagPolicy{key='tagkkkkkkkkkkkkk2', value='tagvvvvvvvvvvvv0~30'}
3. TagPolicy{key='tagkkkkkkkkkkkkk3', value='tagvvvvvvvvvvvv0~1000'}
4. TagPolicy{key='tagkkkkkkkkkkkkk4', value='tagvvvvvvvvvvvv0~10'}
5. TagPolicy{key='tagkkkkkkkkkkkkk5', value='tagvvvvvvvvvvvv0~10'}
6. TagPolicy{key='tagkkkkkkkkkkkkk6', value='tagvvvvvvvvvvvv0~10'}
7. TagPolicy{key='tagkkkkkkkkkkkkk7', value='tagvvvvvvvvvvvv0~10'}
8. TagPolicy{key='tagkkkkkkkkkkkkk8', value='tagvvvvvvvvvvvv0~10'}
9. TagPolicy{key='tagkkkkkkkkkkkkk9', value='tagvvvvvvvvvvvv0~10'} | 1 | 23610 | 0.8 | 364 |
| 4 | 4 | 1. TagPolicy{key='tagkkkkkkkkkkkkk1', value='tagvvvvvvvvvvvv0~10', uniqure=true}
2. TagPolicy{key='tagkkkkkkkkkkkkk2', value='tagvvvvvvvvvvvv0~30', uniqure=true}
3. TagPolicy{key='tagkkkkkkkkkkkkk3', value='tagvvvvvvvvvvvv0~1000', uniqure=true}
4. TagPolicy{key='tagkkkkkkkkkkkkk4', value='tagvvvvvvvvvvvv0~300000', uniqure=false} | 1 | 26065 | 無 | 無 |
| 5 | 3 |1. TagPolicy{key='tagkkkkkkkkkkkkk1', value='tagvvvvvvvvvvvv0~1000', uniqure=true}
2. TagPolicy{key='tagkkkkkkkkkkkkk3', value='tagvvvvvvvvvvvv0~30000', uniqure=false}
3. TagPolicy{key='tagkkkkkkkkkkkkk2', value='tagvvvvvvvvvvvv0~300', uniqure=true} | 1 | 28841 | 1.1 | 154 |

最後更新:2017-11-05 21:03:48

  上一篇:go  SqlServer 正確使用索引
  下一篇:go  centos 7 LAMP 服務配置