学习clickhouse 集群搭建和分布式存储

news/2024/4/15 4:40:16/文章来源:https://blog.csdn.net/wujiesunlirong/article/details/136502366

为什么要用集群

使用集群的主要原因是为了提高系统的可扩展性、可用性和容错性。

  1. 可扩展性:当单个节点无法处理增加的负载时,可以通过添加更多的节点到集群来增加处理能力。这使得系统可以处理更大的数据量和更高的查询负载。
  2. 可用性:在集群中,如果一个节点出现故障,其他节点可以接管它的工作,从而保证系统的持续运行。这对于需要24/7运行的系统来说非常重要。
  3. 容错性:集群可以通过数据复制和故障转移来提高系统的容错性。如果一个节点出现故障,系统可以从其他节点获取数据,从而避免数据丢失。

为什么要分布式存储

使用分布式存储的主要原因有以下几点:

  1. 可扩展性:分布式存储系统可以通过添加更多的节点来扩展存储容量和处理能力,这使得它们可以处理大规模的数据。
  2. 高可用性:在分布式存储系统中,数据通常会在多个节点上进行复制,这意味着如果一个节点出现故障,其他节点可以提供数据,从而保证系统的可用性。
  3. 容错性:分布式存储系统通过数据复制和故障转移来提高系统的容错性。如果一个节点出现故障,系统可以从其他节点获取数据,从而避免数据丢失。
  4. 性能:分布式存储系统可以通过在多个节点上并行处理数据来提高性能。

那么今天我们今天用docker的形式搭建一个clickhouse集群来提供我们学习用。

dockerfile

docker-compose.yml

version: "3.7"services:ck1:image: yandex/clickhouse-serverulimits:nofile:soft: 300001hard: 300002ports:- 9001:9000volumes:- ./conf/config.xml:/etc/clickhouse-server/config.xml- ./conf/users.xml:/etc/clickhouse-server/users.xml- ./conf/metrika1.xml:/etc/metrika.xmllinks:- "zk1"depends_on:- zk1ck2:image: yandex/clickhouse-serverulimits:nofile:soft: 300001hard: 300002volumes:- ./conf/metrika2.xml:/etc/metrika.xml- ./conf/config.xml:/etc/clickhouse-server/config.xml- ./conf/users.xml:/etc/clickhouse-server/users.xmlports:- 9002:9000depends_on:- zk1ck3:image: yandex/clickhouse-serverulimits:nofile:soft: 300001hard: 300002volumes:- ./conf/metrika3.xml:/etc/metrika.xml- ./conf/config.xml:/etc/clickhouse-server/config.xml- ./conf/users.xml:/etc/clickhouse-server/users.xmlports:- 9003:9000depends_on:- zk1zk1:image: zookeeper:3.5restart: alwayshostname: zk1expose:- "2181"ports:- 2181:2181

注意:这里clickhouse的版本要和zookeeper的版本相互匹配上,不然后续就会有兼容性的问题。我的clickhouse的版本是22.1.3 所以我的zookeeper 的版本是3.5

配置

  1. user.xml
<?xml version="1.0"?>
<clickhouse><!-- Profiles of settings. --><profiles><!-- Default settings. --><default><!-- Maximum memory usage for processing single query, in bytes. --><max_memory_usage>10000000000</max_memory_usage><!-- How to choose between replicas during distributed query processing.random - choose random replica from set of replicas with minimum number of errorsnearest_hostname - from set of replicas with minimum number of errors, choose replicawith minimum number of different symbols between replica's hostname and local hostname(Hamming distance).in_order - first live replica is chosen in specified order.first_or_random - if first replica one has higher number of errors, pick a random one from replicas with minimum number of errors.--><load_balancing>random</load_balancing><allow_ddl>1</allow_ddl><readonly>0</readonly></default><!-- Profile that allows only read queries. --><readonly><readonly>1</readonly></readonly></profiles><!-- Users and ACL. --><users><!-- If user name was not specified, 'default' user is used. --><default><access_management>1</access_management><password></password><networks><ip>::/0</ip></networks><!-- Settings profile for user. --><profile>default</profile><!-- Quota for user. --><quota>default</quota><!-- User can create other users and grant rights to them. --><!-- <access_management>1</access_management> --></default><test><password></password><quota>default</quota><profile>default</profile><allow_databases><database>default</database><database>test_dictionaries</database></allow_databases><allow_dictionaries><dictionary>replicaTest_all</dictionary></allow_dictionaries></test></users><!-- Quotas. --><quotas><!-- Name of quota. --><default><!-- Limits for time interval. You could specify many intervals with different limits. --><interval><!-- Length of interval. --><duration>3600</duration><!-- No limits. Just calculate resource usage for time interval. --><queries>0</queries><errors>0</errors><result_rows>0</result_rows><read_rows>0</read_rows><execution_time>0</execution_time></interval></default></quotas>
</clickhouse>
  1. config.xml
<?xml version="1.0"?>
<!--NOTE: User and query level settings are set up in "users.xml" file.If you have accidentally specified user-level settings here, server won't start.You can either move the settings to the right place inside "users.xml" fileor add <skip_check_for_incorrect_settings>1</skip_check_for_incorrect_settings> here.
-->
<clickhouse><logger><level>trace</level><log>/var/log/clickhouse-server/clickhouse-server.log</log><errorlog>/var/log/clickhouse-server/clickhouse-server.err.log</errorlog><size>1000M</size><count>10</count></logger><http_port>8123</http_port><tcp_port>9000</tcp_port><mysql_port>9004</mysql_port><postgresql_port>9005</postgresql_port><interserver_http_port>9009</interserver_http_port><max_connections>4096</max_connections><keep_alive_timeout>3</keep_alive_timeout><grpc><enable_ssl>false</enable_ssl><ssl_cert_file>/path/to/ssl_cert_file</ssl_cert_file><ssl_key_file>/path/to/ssl_key_file</ssl_key_file><ssl_require_client_auth>false</ssl_require_client_auth><ssl_ca_cert_file>/path/to/ssl_ca_cert_file</ssl_ca_cert_file><compression>deflate</compression><compression_level>medium</compression_level><max_send_message_size>-1</max_send_message_size><max_receive_message_size>-1</max_receive_message_size><verbose_logs>false</verbose_logs></grpc><openSSL><server><certificateFile>/etc/clickhouse-server/server.crt</certificateFile><privateKeyFile>/etc/clickhouse-server/server.key</privateKeyFile><dhParamsFile>/etc/clickhouse-server/dhparam.pem</dhParamsFile><verificationMode>none</verificationMode><loadDefaultCAFile>true</loadDefaultCAFile><cacheSessions>true</cacheSessions><disableProtocols>sslv2,sslv3</disableProtocols><preferServerCiphers>true</preferServerCiphers></server><client> <loadDefaultCAFile>true</loadDefaultCAFile><cacheSessions>true</cacheSessions><disableProtocols>sslv2,sslv3</disableProtocols><preferServerCiphers>true</preferServerCiphers><invalidCertificateHandler><name>RejectCertificateHandler</name></invalidCertificateHandler></client></openSSL><max_concurrent_queries>100</max_concurrent_queries><max_server_memory_usage>0</max_server_memory_usage><max_thread_pool_size>10000</max_thread_pool_size><max_server_memory_usage_to_ram_ratio>0.9</max_server_memory_usage_to_ram_ratio><total_memory_profiler_step>4194304</total_memory_profiler_step><total_memory_tracker_sample_probability>0</total_memory_tracker_sample_probability><uncompressed_cache_size>8589934592</uncompressed_cache_size><mark_cache_size>5368709120</mark_cache_size><mmap_cache_size>1000</mmap_cache_size><compiled_expression_cache_size>134217728</compiled_expression_cache_size><compiled_expression_cache_elements_size>10000</compiled_expression_cache_elements_size><path>/var/lib/clickhouse/</path><tmp_path>/var/lib/clickhouse/tmp/</tmp_path><user_files_path>/var/lib/clickhouse/user_files/</user_files_path><ldap_servers></ldap_servers><user_directories><users_xml><path>users.xml</path></users_xml><local_directory><path>/var/lib/clickhouse/access/</path></local_directory></user_directories><default_profile>default</default_profile><custom_settings_prefixes></custom_settings_prefixes><default_database>default</default_database><mlock_executable>true</mlock_executable><remap_executable>false</remap_executable><![CDATA[Uncomment below in order to use JDBC table engine and function.To install and run JDBC bridge in background:* [Debian/Ubuntu]export MVN_URL=https://repo1.maven.org/maven2/ru/yandex/clickhouse/clickhouse-jdbc-bridgeexport PKG_VER=$(curl -sL $MVN_URL/maven-metadata.xml | grep '<release>' | sed -e 's|.*>\(.*\)<.*|\1|')wget https://github.com/ClickHouse/clickhouse-jdbc-bridge/releases/download/v$PKG_VER/clickhouse-jdbc-bridge_$PKG_VER-1_all.debapt install --no-install-recommends -f ./clickhouse-jdbc-bridge_$PKG_VER-1_all.debclickhouse-jdbc-bridge &* [CentOS/RHEL]export MVN_URL=https://repo1.maven.org/maven2/ru/yandex/clickhouse/clickhouse-jdbc-bridgeexport PKG_VER=$(curl -sL $MVN_URL/maven-metadata.xml | grep '<release>' | sed -e 's|.*>\(.*\)<.*|\1|')wget https://github.com/ClickHouse/clickhouse-jdbc-bridge/releases/download/v$PKG_VER/clickhouse-jdbc-bridge-$PKG_VER-1.noarch.rpmyum localinstall -y clickhouse-jdbc-bridge-$PKG_VER-1.noarch.rpmclickhouse-jdbc-bridge &Please refer to https://github.com/ClickHouse/clickhouse-jdbc-bridge#usage for more information.]]><remote_servers incl="clickhouse_remote_servers"><test_unavailable_shard><shard><replica><host>localhost</host><port>9000</port></replica></shard><shard><replica><host>localhost</host><port>1</port></replica></shard></test_unavailable_shard></remote_servers><zookeeper incl="zookeeper-servers"></zookeeper><builtin_dictionaries_reload_interval>3600</builtin_dictionaries_reload_interval><max_session_timeout>3600</max_session_timeout><default_session_timeout>60</default_session_timeout><query_log><database>system</database><table>query_log</table><partition_by>toYYYYMM(event_date)</partition_by><flush_interval_milliseconds>7500</flush_interval_milliseconds></query_log><trace_log><database>system</database><table>trace_log</table><partition_by>toYYYYMM(event_date)</partition_by><flush_interval_milliseconds>7500</flush_interval_milliseconds></trace_log><query_thread_log><database>system</database><table>query_thread_log</table><partition_by>toYYYYMM(event_date)</partition_by><flush_interval_milliseconds>7500</flush_interval_milliseconds></query_thread_log><query_views_log><database>system</database><table>query_views_log</table><partition_by>toYYYYMM(event_date)</partition_by><flush_interval_milliseconds>7500</flush_interval_milliseconds></query_views_log><part_log><database>system</database><table>part_log</table><partition_by>toYYYYMM(event_date)</partition_by><flush_interval_milliseconds>7500</flush_interval_milliseconds></part_log><metric_log><database>system</database><table>metric_log</table><flush_interval_milliseconds>7500</flush_interval_milliseconds><collect_interval_milliseconds>1000</collect_interval_milliseconds></metric_log><asynchronous_metric_log><database>system</database><table>asynchronous_metric_log</table><flush_interval_milliseconds>7000</flush_interval_milliseconds></asynchronous_metric_log><opentelemetry_span_log><engine>engine MergeTreepartition by toYYYYMM(finish_date)order by (finish_date, finish_time_us, trace_id)</engine><database>system</database><table>opentelemetry_span_log</table><flush_interval_milliseconds>7500</flush_interval_milliseconds></opentelemetry_span_log><crash_log><database>system</database><table>crash_log</table><partition_by /><flush_interval_milliseconds>1000</flush_interval_milliseconds></crash_log><session_log><database>system</database><table>session_log</table><partition_by>toYYYYMM(event_date)</partition_by><flush_interval_milliseconds>7500</flush_interval_milliseconds></session_log><top_level_domains_lists></top_level_domains_lists><dictionaries_config>*_dictionary.xml</dictionaries_config>
<user_defined_executable_functions_config>*_function.xml</user_defined_executable_functions_config><encryption_codecs></encryption_codecs><distributed_ddl><path>/clickhouse/task_queue/ddl</path></distributed_ddl><graphite_rollup_example><pattern><regexp>click_cost</regexp><function>any</function><retention><age>0</age><precision>3600</precision></retention><retention><age>86400</age><precision>60</precision></retention></pattern><default><function>max</function><retention><age>0</age><precision>60</precision></retention><retention><age>3600</age><precision>300</precision></retention><retention><age>86400</age><precision>3600</precision></retention></default></graphite_rollup_example><format_schema_path>/var/lib/clickhouse/format_schemas/</format_schema_path><query_masking_rules><rule><name>hide encrypt/decrypt arguments</name><regexp>((?:aes_)?(?:encrypt|decrypt)(?:_mysql)?)\s*\(\s*(?:'(?:\\'|.)+'|.*?)\s*\)</regexp><replace>\1(???)</replace></rule></query_masking_rules><send_crash_reports><enabled>false</enabled><anonymize>false</anonymize><endpoint>https://6f33034cfe684dd7a3ab9875e57b1c8d@o388870.ingest.sentry.io/5226277</endpoint></send_crash_reports><include_from>/etc/metrika.xml</include_from>
</clickhouse>
  1. metrika.xml
    这里我们3个metrika.xml都是一样的
<yandex><clickhouse_remote_servers><test_cluster><shard><internal_replication>true</internal_replication><replica><host>ck1</host><port>9000</port></replica></shard><shard><internal_replication>true</internal_replication><replica><host>ck2</host><port>9000</port></replica></shard><shard><internal_replication>true</internal_replication><replica><host>ck3</host><port>9000</port></replica></shard></test_cluster></clickhouse_remote_servers><zookeeper-servers><node index="1"><host>zk1</host><port>2181</port></node></zookeeper-servers></yandex>

我们将配置文件在conf文件夹里面创建好以后执行docker-compose up -d 就可以启动我们的集群了。

创建表

通过docker-compose ps 查看端口号
在这里插入图片描述
通过clickhouse-client --port 9001 连接数据库
在这里插入图片描述

创建数据表

分表在3台节点啥


CREATE TABLE access_logs
(`create_time` DateTime,`status` String,`runtime` String,`client_ip` String,`method` String,`url` String,`body` String,`response` String,`hander` String,`request_id` String
)
ENGINE = ReplacingMergeTree
PARTITION BY toYYYYMM(create_time)
PRIMARY KEY request_id
ORDER BY (request_id, create_time)
TTL create_time + toIntervalHour(48)

找一台节点执行一下sql

CREATE TABLE access_logs_all ENGINE = Distributed(test_cluster, big_data_all, access_logs, rand());

第二条sql的意思,我们通过on cluster在每个节点上创建了一个分布式的表,该表指向了我们已经有的表access_logs。

test_cluster : 集群的名称
big_data_all: 远程数据库的名称
access_logs: 远程数据表的名称
rand(): 分片的逻辑,我们这里使用的是随机分配,还有hivehash 等。

Distributed Engine

ClickHouse 的 Distributed 引擎并不存储数据,而是允许在物理上分布在多个节点上的表之间进行查询。当一个查询被发送到 Distributed 表时,它将查询分发到所有的本地表,然后汇总结果。

  1. 当一个查询被发送到 Distributed 表时,ClickHouse 首先将查询分解为两部分:一个主查询和一个子查询。

  2. 子查询被发送到集群中的每个节点。每个节点在其本地表上执行子查询,并返回结果。

  3. 主查询在 Distributed 表所在的节点上执行。它从所有的子查询中收集结果,然后汇总这些结果。

  4. 如果查询包含聚合函数,如 SUM()COUNT(),那么 ClickHouse 将在每个节点上进行部分聚合,然后在 Distributed 表所在的节点上进行最终聚合。

  5. 如果查询包含 ORDER BY 子句,那么排序将在每个节点上进行,然后在 Distributed 表所在的节点上进行最终排序。

通过这种方式,Distributed 引擎可以在多个节点上并行执行查询,从而提高查询性能。同时,由于数据是在多个节点上存储的,因此可以提供更大的存储容量。

在 ClickHouse 中,你可以直接向 Distributed 表插入数据。当你向 Distributed 表插入数据时,ClickHouse 会根据分片键将数据分发到相应的分片上。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_996705.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux基础——进程控制

1. 进程创建 在这之前我们曾了解过进程创建&#xff08;详见进程初识&#xff08;二&#xff09;&#xff09;&#xff0c;我们在这里对fork函数做一些补充 其实对于父子进程来说&#xff0c;若是有一方试图修改数据时&#xff0c;会向物理内存中申请一份新空间&#xff0c;并…

每日学习总结20240306

每日总结 20240306 1. 断言测试判断 #include <iostream> #include <assert.h> #include <cassert> #include <stdio.h>#define STR_OK "[\x1b[1;32m OK \x1b[0m]" #define STR_FAIL "[\x1b[1;31mFAIL\x1b[0m]"…

威步安全技术保护铁路免受网络威胁

IoW的TrainCAS列车碰撞预警系统保护铁路列车免受网络攻击。TrainCAS系统内置的高端技术及其被非法利用的风险&#xff0c;让安全和知识产权保护成为公司的首要任务。TrainCAS软件及其轨道图通过CodeMeter AxProtector和Core API工具的结合得到保护&#xff0c;有效防止未授权使…

Android Split APK是什么

Android Split APK是一项应用程序分发和安装的技术&#xff0c;可以将大型应用程序拆分为多个较小的模块&#xff0c;以便用户可以选择性地下载和安装所需的模块&#xff0c;而无需一次性下载整个应用程序。这种技术旨在提高用户体验、减少下载时间和节省存储空间。 Android S…

【数据结构】矩阵的压缩存储

矩阵的压缩存储 5.1 普通矩阵的存储 用二维数组存储 分为行优先和列优先&#xff1a; 行优先&#xff1a;优先存放一行的数据。 列优先&#xff1a;优先存放一列的数据。 注意下标是从0还是1开始的&#xff01; 5.2 对称矩阵的存储 对称矩阵定义 若n阶方阵中任意一个元素 a i …

VR全景数字工厂,制造业企业线上营销新助手

VR全景技术逐渐渗透到各行各业&#xff0c;其中&#xff0c;很多实体工厂的线上营销宣传也借助720云VR全景技术也迎来了新的变革。 一、VR全景技术的独特魅力 VR全景技术是一种基于虚拟现实技术的全新视觉呈现方式&#xff0c;能够为用户带来身临其境的沉浸式体验。通过VR全景…

Redis基本使用和基础知识整理

Redis是做什么的&#xff1f; Redis是一个开源&#xff0c;内存存储的数据结构服务器&#xff0c;可用作数据库&#xff0c;高速缓存和消息队列。Redis将数据储存在内存当中 内存的特点 易失性&#xff08;在断电之后数据就没有了&#xff09;进行读取数据等IO操作的速度要比…

【异常处理】BadSqlGrammarException低级SQL语法异常

报错 org.springframework.jdbc.BadSqlGrammarException: ### Error querying database. Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use …

苹果曝出两个 iOS 系统 0-Day 漏洞

最近&#xff0c;苹果公司发布了紧急安全更新&#xff0c;解决了两个 iOS 零日漏洞。这些漏洞存在于 iOS 内核&#xff08;CVE-2024-23225&#xff09;和 RTKit&#xff08;CVE-2024-23296&#xff09;中&#xff0c;威胁攻击者可利用其绕过内核内存保护&#xff0c;这就给了具…

NLP:spacy库安装与zh_core_web_sm配置

到公司来第一个项目竟然是偏文本信息抽取与结构化的&#xff0c;&#xff08;也太高看我了┭┮﹏┭┮&#xff09; 反正给机会了就上吧&#xff0c;我就一臭实习的&#xff0c;怕个啥。配置了两天的环境&#xff0c;也踩了不少坑&#xff0c;我把我的经历给大家分享一下&#…

什么是B+树,和B树有什么不同?

&#x1f449;博主介绍&#xff1a; 博主从事应用安全和大数据领域&#xff0c;有8年研发经验&#xff0c;5年面试官经验&#xff0c;Java技术专家&#xff0c;WEB架构师&#xff0c;阿里云专家博主&#xff0c;华为云云享专家&#xff0c;51CTO 专家博主 ⛪️ 个人社区&#x…

鸿蒙App动画、弹窗

动画 属性动画 https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-animatorproperty-0000001478181445-V3 组件的某些通用属性变化时&#xff0c;可以通过属性动画实现渐变过渡效果&#xff0c;提升用户体验。支持的属性包括width、height、backg…

vb.net获取Windows主题颜色、深色模式窗体,实时响应

先上效果图 可直接跳到完整代码 目录 先上效果图 开始教学 响应用户的更改 API讲解 读取深浅模式、主题颜色、十六进制颜色转换 完整代码 如果大家留意资源管理器的“文件”菜单的话就会发现它的底色就是你设置的主题色&#xff0c;在更改Windows颜色模式时&#xff0c;…

泰迪智能科技2024全国高校大数据与人工智能师资研修班即将开班

为推动各院校完善专业建设&#xff0c;解决专业教学中行业案例缺失和实战能力不足等相关痛点问题&#xff0c;泰迪科技基于十余年深耕数据智能产业实践经验&#xff0c;特推出全国高校大数据与人工智能师资研修班&#xff0c;每年在全国范围内滚动开展&#xff0c;截止目前已在…

新书速览|Photoshop+CorelDRAW商业广告设计入门到精通:视频教学版

8章实例剖析商业案例&#xff0c;帮你提升设计效率。商业实战案例&#xff0c;真正掌握设计技能&#xff01; 本书内容 《PhotoshopCorelDRAW商业广告设计入门到精通&#xff1a;视频教学版》以创作精美、类型多样的案例&#xff0c;全面地讲解Photoshop与CorelDRAW软件相结合…

Android SDK2 (实操三个小目标)

书接上回&#xff1a;Android SDK 1&#xff08;概览&#xff09;-CSDN博客 今天讲讲三个实际练手内容&#xff0c;用的是瑞星微的sdk。 1 实操编译Android.bp 首先还是感叹下&#xff0c;现在的系统真的越搞越复杂&#xff0c;最早只有gcc&#xff0c;后面多了make&#xf…

web3时事粥报

比特币正成为更具有吸引力的通胀对冲工具 在通胀的宏观经济浪潮中&#xff0c;比特币正逐渐崭露头角&#xff0c;成为那些渴望多元化投资组合的投资者眼中的璀璨明星。Kooner 预测&#xff0c;2024年&#xff0c;各种宏观经济挑战可能进一步提升比特币、黄金和白银等资产的避险…

VSCode 隐藏侧边栏文件或文件夹

开发时有些文件根部就会动&#xff0c;可能是运行的环境或者缓存&#xff0c;可能是其他的文件。 但是又不能删除&#xff0c;影响开发的观感&#xff0c;那么怎么在侧边栏栏隐藏文件呢 搜索的时候想要加快速度&#xff0c;怎么屏蔽某些文件呢 隐藏侧栏显示文件或屏蔽搜索范围…

代码随想录刷题笔记 DAY 42 | 背包问题 - 二维 | 背包问题 - 一维 | 分割等和子集 No.416

文章目录 Day 4201. 背包问题 - 二维<1> 01 背包问题<2> 动态规划优化 02. 背包问题 - 一维03. 分割等和子集&#xff08;No. 416&#xff09;<1> 题目<2> 笔记<3> 代码 Day 42 01. 背包问题 - 二维 <1> 01 背包问题 有 n 个物品和最多…

SpringBoot集成ElasticSearch(ES)

ElasticSearch环境搭建 采用docker-compose搭建&#xff0c;具体配置如下&#xff1a; version: 3# 网桥es -> 方便相互通讯 networks:es:services:elasticsearch:image: registry.cn-hangzhou.aliyuncs.com/zhengqing/elasticsearch:7.14.1 # 原镜像elasticsearch:7.…