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.mzph.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;官方…