clickhouse的多路徑存儲策略

存儲策略

clickhouse從19.15開始,MergeTree實現了自定義存儲策略的功能:

  • JBOD策略:這種策略適合服務器掛多磁盤但沒做raid的場景。JBOD是一種輪詢策略,每次執行INSERT或者MERGE,所以產生的新分區會輪詢寫入各個磁盤。這種策略可以減低單盤負載,在一定條件下提升數據并行讀寫的性能。
  • HOT/COLD策略:這種策略適合服務掛不通類型磁盤的場景。將磁盤分為HOT與COLD兩類區域,HOT區使用小容量高速存儲,注重存取性能;COLD區使用大容量低速存儲,注重容量。MergeTree寫入時,會在HOT區創建分區目錄保存數據,當分區數據達到閾值,數據自動移動到COLD區。每個區內部也支持定義多個磁盤,支持JBOD策略。
配置語法
  • storage_configuration 標簽定義多路徑存儲策略
  • disks 標簽定義磁盤
  • policies 標簽定義策略
  • keep_free_space_bytes: 選填項,用于指定指定磁盤的預留空間,單位字節bit。
  • max_data_part_size_bytes:選填,字節為單位 默認1G,表示在這個卷的單個disk磁盤中,一個數據分區的最大磁盤存儲閾值,若當前分區的數據大小超過閾值,則之后的分區會寫入下一個disk磁盤。
  • move_factor:選填項,默認值為0.1,;若當前卷的可用空間大小小于factor因子,并且定義多個卷,則數據會自動移動到下一個卷。
JBOD

配置:

<storage_configuration><disks><disk_01><path>/data/chbase/data_01/</path></disk_01><disk_02><path>/data/chbase/data_02/</path></disk_02><disk_03><path>/data/chbase/data_03/</path></disk_03></disks><policies><jbod_policies><volumes><jbod_volume><disk>disk_01</disk><disk>disk_02</disk></jbod_volume></volumes></jbod_policies></policies>
</storage_configuration>

查看disk配置:

localhost :) SELECT name, path, formatReadableSize(free_space) AS free, formatReadableSize(total_space) AS total, formatReadableSize(keep_free_space) AS reserved FROM system.disks;┌─name────┬─path────────────────────────────┬─free──────┬─total─────┬─reserved─┐
│ default │ /data/database/clickhouse/data/ │ 13.19 GiB │ 29.98 GiB │ 0.00 B   │
│ disk_01 │ /data/chbase/data_01/           │ 13.19 GiB │ 29.98 GiB │ 0.00 B   │
│ disk_02 │ /data/chbase/data_02/           │ 13.19 GiB │ 29.98 GiB │ 0.00 B   │
│ disk_03 │ /data/chbase/data_03/           │ 13.19 GiB │ 29.98 GiB │ 0.00 B   │
└─────────┴─────────────────────────────────┴───────────┴───────────┴──────────┘

查看policies策略:

localhost :) SELECT policy_name, volume_name, volume_priority, disks, formatReadableSize(max_data_part_size) AS max_data_part_size, move_factor FROM system.storage_policies;┌─policy_name───┬─volume_name─┬─volume_priority─┬─disks─────────────────┬─max_data_part_size─┬─move_factor─┐
│ default       │ default     │               1 │ ['default']           │ 0.00 B             │           0 │
│ jbod_policies │ jbod_volume │               1 │ ['disk_01','disk_02'] │ 0.00 B             │         0.1 │
└───────────────┴─────────────┴─────────────────┴───────────────────────┴────────────────────┴─────────────┘

建表測試:

##使用settings storage_policy='jbod_policies'指定策略
localhost :) CREATE TABLE jbod_table_v1
(`id` UInt64
)
ENGINE = MergeTree()
ORDER BY id
SETTINGS storage_policy = 'jbod_policies'##寫入第一批數據,創建第一個分區目錄
localhost :) INSERT INTO jbod_table_v1 SELECT rand() FROM numbers(10);##查看系統分區表,可以看到第一個分區all_1_1_0被寫入到disk_01
localhost :) SELECT name, disk_name FROM system.parts WHERE table='jbod_table_v1';
┌─name──────┬─disk_name─┐
│ all_1_1_0 │ disk_01   │
└───────────┴───────────┘##寫入第二批數據,創建第二個分區目錄
localhost :) INSERT INTO jbod_table_v1 SELECT rand() FROM numbers(10);##可以看到第二個分區all_2_2_0被寫入到disk_02 
localhost :) SELECT name, disk_name FROM system.parts WHERE table='jbod_table_v1';
┌─name──────┬─disk_name─┐
│ all_1_1_0 │ disk_01   │
│ all_2_2_0 │ disk_02   │
└───────────┴───────────┘##反復幾次
localhost :) SELECT name, disk_name FROM system.parts WHERE table='jbod_table_v1';
┌─name──────┬─disk_name─┐
│ all_1_1_0 │ disk_01   │
│ all_2_2_0 │ disk_02   │
│ all_3_3_0 │ disk_01   │
│ all_4_4_0 │ disk_02   │
└───────────┴───────────┘

JBOD策略,每當生成一個新數據分區的時候,分區目錄會根據volume中定義的disk順序依次輪詢并寫入各個disk。

HOT/COLD

配置:

<storage_configuration><disks><disk_01><path>/data/chbase/data_01/</path></disk_01><disk_02><path>/data/chbase/data_02/</path></disk_02><clod_disk><path>/data/chbase/cold_data/</path><keep_free_space_bytes>21474836480</keep_free_space_bytes></clod_disk></disks><policies><hot_to_cold><volumes><hot_volume><disk>disk_01</disk><disk>disk_02</disk><max_data_part_size_bytes>1048576</max_data_part_size_bytes></hot_volume><cold_volume><disk>clod_disk</disk></cold_volume></volumes><move_factor>0.2</move_factor></hot_to_cold></policies>
</storage_configuration>

查看disk配置:

localhost :) SELECT name, path, formatReadableSize(free_space) AS free, formatReadableSize(total_space) AS total, formatReadableSize(keep_free_space) AS reserved FROM system.disks;┌─name──────┬─path────────────────────────────┬─free──────┬─total─────┬─reserved──┐
│ clod_disk │ /data/chbase/cold_data/         │ 29.94 GiB │ 29.97 GiB │ 20.00 GiB │
│ default   │ /data/database/clickhouse/data/ │ 16.49 GiB │ 27.94 GiB │ 0.00 B    │
│ disk_01   │ /data/chbase/data_01/           │ 9.96 GiB  │ 9.99 GiB  │ 0.00 B    │
│ disk_02   │ /data/chbase/data_02/           │ 9.96 GiB  │ 9.99 GiB  │ 0.00 B    │
└───────────┴─────────────────────────────────┴───────────┴───────────┴───────────┘

查看policies策略:

localhost :) SELECT policy_name, volume_name, volume_priority, disks, formatReadableSize(max_data_part_size) AS max_data_part_size, move_factor FROM system.storage_policies;┌─policy_name─┬─volume_name──┬─volume_priority─┬─disks─────────────────┬─max_data_part_size─┬─move_factor─┐
│ default     │ default      │               1 │ ['default']           │ 0.00 B             │           0 │
│ hot_to_cold │ hot_volume   │               1 │ ['disk_01','disk_02'] │ 1.00 GiB           │         0.2 │
│ hot_to_cold │ cold_volume  │               2 │ ['clod_disk']         │ 0.00 B             │         0.2 │
└─────────────┴──────────────┴─────────────────┴───────────────────────┴────────────────────┴─────────────┘可以看出,hot_to_cold策略有兩個volume: hot_volume、cold_volume。其中hot_volume有兩塊磁盤:disk_01、disk_02。

建表測試:

localhost : CREATE TABLE htc_table_1
(`id` UInt64
)
ENGINE = MergeTree()
ORDER BY id
SETTINGS storage_policy = 'hot_to_cold';##寫入兩個分區
localhost :) INSERT INTO htc_table_1 SELECT rand() FROM numbers(100000);##查看兩次生成的分區采用JBOD策略均衡在disk_01、disk_02
localhost :) SELECT name, disk_name FROM system.parts WHERE table='htc_table_1';┌─name──────┬─disk_name─┐
│ all_1_1_0 │ disk_01   │
│ all_2_2_0 │ disk_02   │
└───────────┴───────────┘##由于max_data_part_size_bytes配置是1M,寫入一個超過1M大小的分區
localhost :) INSERT INTO htc_table_1 SELECT rand() FROM numbers(300000);##可以看到第三個分區被寫入到clod_disk
localhost :) SELECT name, disk_name FROM system.parts WHERE table='htc_table_1';┌─name──────┬─disk_name─┐
│ all_1_1_0 │ disk_01   │
│ all_2_2_0 │ disk_02   │
│ all_3_3_0 │ clod_disk │
└───────────┴───────────┘

HOT/COLD策略,由多個disk組成volume組。每當一個新數據分區生成的時候,按照閾值(max_data_part_size_bytes)的大小,分區目錄會按照volume組中定義的順序依次寫入。

合并分區或者一次性寫入的分區大小超過max_data_part_size_bytes,也會被寫入到COLD卷中。

分區移動

雖然MergeTree定義完存儲策略后不能修改,但卻可以移動分區

## 將某個分區移動到當前volume的另一個disk
localhost :) ALTER TABLE htc_table_1 MOVE PART 'all_1_1_0' TO DISK 'disk_02';localhost :) SELECT name, disk_name FROM system.parts WHERE table='htc_table_1';┌─name──────┬─disk_name─┐
│ all_1_1_0 │ disk_02   │
│ all_2_2_0 │ disk_02   │
│ all_3_3_0 │ clod_disk │
└───────────┴───────────┘##將某個分區移動到其他volume
localhost :) ALTER TABLE htc_table_1 MOVE PART 'all_1_1_0' TO VOLUME 'cold_volume';localhost :) SELECT name, disk_name FROM system.parts WHERE table='htc_table_1';┌─name──────┬─disk_name─┐
│ all_1_1_0 │ clod_disk │
│ all_2_2_0 │ disk_02   │
│ all_3_3_0 │ clod_disk │
└───────────┴───────────┘

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

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

相關文章

C#面:Application , Cookie 和 Session 會話有什么不同

Application、Cookie 和 Session 是在Web開發中常用的三種會話管理方式 Application&#xff08;應用程序&#xff09;&#xff1a; Application 是在服務器端保存數據的一種方式&#xff0c;它可以在整個應用程序的生命周期內共享數據。Application 對象是在應用程序啟動時創…

Nginx 隱藏版本信息和logo

1.隱藏版本信息 http {### 隱藏版本號 server_tokens off; } 2.隱藏圖標 2.1 cd nginx 安裝的路徑 cd/XXXX/nginx-1.2.0 2.2 編輯文件 vim src/core/nginx.h 修改define nginx_ver 中的內容 vim src/http/ngx_http_special_response.c 修改 u_char ngx_http_error_tail[]…

java 基礎(核心知識搭配代碼)

前言 java的學習分為了上部分以及下部分進行學習&#xff0c;上部分就是對于java的基礎知識&#xff0c;面向對象上&#xff0c;面向對象下&#xff0c;異常操作&#xff0c;javaApi&#xff1b;下部主要是集合&#xff0c;泛型&#xff0c;反射&#xff0c;IO流&#xff0c;J…

Grid-Based Continuous Normal Representation for Anomaly Detection 論文閱讀

Grid-Based Continuous Normal Representation for Anomaly Detection 論文閱讀 摘要簡介方法3.1 Normal Representation3.2 Feature Refinement3.3 Training and Inference 4 實驗結果5 總結 文章信息&#xff1a; 原文鏈接&#xff1a;https://arxiv.org/abs/2402.18293 源碼…

ChatGPT4.0使用次數限制解讀

ChatGPT4.0使用次數限制解讀 ChatGPT4.0簡介 ChatGPT4.0&#xff0c;由OpenAI開發的先進通用聊天機器人模型&#xff0c;基于GPT4技術構建&#xff0c;為用戶提供了自然語言處理等多項任務的解決方案。 ChatGPT4.0使用次數限制 在日常使用過程中&#xff0c;用戶會遇到Chat…

【MIT 6.S081】2020, 實驗記錄(6),Lab: Copy-on-Write Fork

目錄 Task: Implement copy-on writestep 1&#xff1a;對內存塊進行引用計數step 2&#xff1a;uvmcopy 實現 fork 時將 parent 的物理頁映射到 child 中step 3&#xff1a;在 usertrap 中增加對 page fault 的處理執行測試 官方說明&#xff1a;Lab: Copy-on-Write Fork for …

IP地址工具,判斷IP是否在指定范圍內(支持ipv6)

常用方法&#xff0c;判斷一個ip是否在指定的ip范圍內&#xff0c;范圍可能包括起始ip范圍或者掩碼形式&#xff0c;無其它依賴&#xff0c; package com.yk.ip;import java.math.BigInteger; import java.net.InetAddress; import java.net.UnknownHostException; import jav…

操作系統-文件原理

目錄 一、磁盤 1.1 磁盤結構 1. 盤片&#xff1a; 2. 盤面&#xff1a; 3. 磁頭&#xff1a; 4. 磁道&#xff1a; 5. 扇區&#xff1a; 6. 磁道密度和扇區密度&#xff1a; 1.2 磁盤訪問 1. 尋道&#xff08;Seeking&#xff09;&#xff1a; 2. 延遲旋轉&#xff…

C++進階-- map和set

關聯式容器 在前面&#xff0c;我們所學的vector、list、deque&#xff0c;這些都是序列容器&#xff0c;也就是底層為線性序列的數據結構。 而關聯式容器是C標準庫中的一種類別&#xff0c;用于存儲鍵值對&#xff08;key-value pair&#xff09;&#xff0c;關聯式容器中的元…

vxe-table編輯單元格動態插槽slot的使用

業務場景&#xff1a;表格中只有特定某一行的的單元格可以編輯&#xff0c;列很多&#xff0c;為每個列寫個插槽要寫很多重復代碼&#xff0c;所以這里使用動態插槽&#xff0c;簡化代碼量。顯示編輯圖標&#xff0c;點擊編輯圖標隱藏。失去焦點保存調后臺接口。 解決辦法&…

Linux多線程服務端編程:使用muduo C++網絡庫 學習筆記 附錄C 關于Boost的看法

這是作者為電子工業出版社出版的《Boost程序庫完全開發指南》寫的推薦序&#xff0c;此處節選了作者對在C工程項目中使用Boost的看法。 最近一年&#xff08;這篇文章寫于2010年8月&#xff09;作者電話面試了數十位C應聘者。慣用的暖場問題是“工作中使用過STL的哪些組件&…

十行代碼開發一個AI應用

Semantic Kernal 簡介 Semantic Kernel (SK) is a lightweight SDK that lets you easily mix conventional programming languages with the latest in Large Language Model (LLM) AI "prompts" with templating, chaining, and planning capabilities out-of-the-…

關于vue中關于eslint報錯的問題

1 代碼保存的時候會自動將單引號報錯為雙引號 導致eslint報錯的問題&#xff0c; 解決思路&#xff1a; 在項目根目錄下新建一個.prettierrc.json文件 { “tabWidth”: 2,“useTabs”: false,“singleQuote”: true,“semi”: false} 2 關于報錯代碼的時候 出現尾隨逗號報錯…

Zabbix 系統告警“More than 75% used in the configuration cache”處理辦法

Zabbix系統報錯提示 Zabbix 系統告警“More than 75% used in the configuration cache”&#xff0c;看了一下意思是可用的配置緩存超過75%。 修改緩存大小 vim /etc/zabbix/zabbix_server.confesc : /CacheSize 找到配置 將64M改大一點&#xff0c;保存退出。 重啟zabbix…

WPF常用mvvm開源框架介紹 vue的mvvm設計模式鼻祖

WPF&#xff08;Windows Presentation Foundation&#xff09;是一個用于構建桌面應用程序的.NET框架&#xff0c;它支持MVVM&#xff08;Model-View-ViewModel&#xff09;架構模式來分離UI邏輯和業務邏輯。以下是一些常用的WPF MVVM開源框架&#xff1a; Prism Prism是由微軟…

代碼隨想錄算法訓練營 Day32 | LeetCode122.買賣股票的最佳時機II、LeetCode55. 跳躍游戲、LeetCode45.跳躍游戲II

LeetCode122.買賣股票的最佳時機II 那么這里面根據貪心思想&#xff1a; 1、在最低點時買入&#xff0c;如果該點比上一點價格更低&#xff0c;只有兩種情況&#xff1a;上一點為買入點&#xff0c;則此時更新買入點&#xff1b;上一點不是買入點&#xff0c;則此時將股票賣出…

物聯網的核心技術有哪些?

物聯網的核心技術有哪些? 說起物聯網的相關技術&#xff0c;涉及到很多&#xff0c;比如自動識別技術、傳感器技術、網絡通信技術、云計算等&#xff0c;但說到核心技術&#xff0c;我認為有以下6個。這6個核心技術分別是感知和識別技術、物聯網設備硬件、通信技術、數據處理技…

【MySQL】數據庫中常用的函數

目錄 聚合函數COUNT()函數的多種用法COUNT(*)COUNT(主鍵)COUNT(1)COUNT(常量)COUNT(非主鍵)COUNT(distinct(字段)) COUNT()函數小結 字符函數length(str)函數&#xff1a;獲取參數值的字節個數concat(str1,str2,...)函數&#xff1a;字符串拼接upper(str)、lower(str)函數:大小…

Linux高負載排查最佳實踐

在Linux系統中&#xff0c;經常會因為負載過高導致各種性能問題。那么如何進行排查&#xff0c;其實是有跡可循&#xff0c;而且模式固定。 本次就來分享一下&#xff0c;CPU占用過高、磁盤IO占用過高的排查方法。 還是那句話&#xff0c;以最佳實踐入手&#xff0c;真傳一句話…

1 開源鴻蒙OpenHarmony niobe407 STM32F407IGT6芯片輕型系統全量源碼4.1版本下載流程

開源鴻蒙OpenHarmony niobe407 STM32F407IGT6芯片輕型系統全量源碼4.1版本下載流程 作者將狼才鯨日期2024-02-27 一、前景提要 如果通過DevEco Marketplace網站獲取下載源碼的話&#xff0c;不全&#xff0c;有些板子下不到&#xff1b;OpenHarmony開發板列表&#xff0c;官方…