|NO.Z.00024|——————————|BigDataEnd|——|Hadoop&OLAP_ClickHouse.V05|——|ClickHouse.v05|ClickHouse:ClickHouse副本分片|副本|
一、副本和分片
### --- 副本
~~~ ReplicatedMergeTree
~~~ zk: 实现多个实例之间的通信。
### --- 副本的特点:作为数据副本的主要实现载体,ReplicatedMergeTree在设计上有一些显著特点:
~~~ # 依赖ZooKeeper:
~~~ 在执行INSERT和ALTER查询的时候,
~~~ ReplicatedMergeTree需要借助ZooKeeper的分布式协同能力,以实现多个副本之间的同步。
~~~ 但是在查询副本的时候,并不需要使用ZooKeeper。关于这方面的更多信息,会在稍后详细介绍。
~~~ # 表级别的副本:
~~~ 副本是在表级别定义的,
~~~ 所以每张表的副本配置都可以按照它的实际需求进行个性化定义,
~~~ 包括副本的数量,以及副本在集群内的分布位置等。
~~~ # 多主架构(Multi Master):
~~~ 可以在任意一个副本上执行INSERT和ALTER查询,它们的效果是相同的。
~~~ 这些操作会借助ZooKeeper的协同能力被分发至每个副本以本地形式执行。
~~~ # Block数据块:
~~~ 在执行INSERT命令写入数据时,
~~~ 会依据max_insert_block_size的大小(默认1048576行)将数据切分成若干个Block数据块。
~~~ 所以Block数据块是数据写入的基本单元,并且具有写入的原子性和唯一性。
~~~ # 原子性:
~~~ 在数据写入时,一个Block块内的数据要么全部写入成功,要么全部失败。
~~~ # 唯一性:
~~~ 在写入一个Block数据块的时候,会按照当前Block数据块的数据顺序、
~~~ 数据行和数据大小等指标,计算Hash信息摘要并记录在案。
~~~ 在此之后,如果某个待写入的Block数据块与先前已被写入的
~~~ Block数据块拥有相同的Hash摘要(Block数据块内数据顺序、数据大小和数据行均相同),
~~~ 则该Block数据块会被忽略。这项设计可以预防由异常原因引起的Block数据块重复写入的问题。
~~~ 如果只是单纯地看这些特点的说明,可能不够直观。
~~~ 没关系,接下来会逐步展开,并附带一系列具体的示例。
二、副本和分片下:zk配置方式
### --- zk的配置方式
~~~ # 新建配置文件 /etc/clickhouse-server/config.d/metrika.xml
[root@hadoop01 ~]# vim /etc/clickhouse-server/config.d/metrika.xml
<!--zookeeper集群配置信息 -->
<zookeeper-servers>
<node index="1">
<host>hadoop01</host>
<port>2181</port>
</node>
<node index="2">
<host>hadoop02</host>
<port>2181</port>
</node>
<node index="3">
<host>hadoop03</host>
<port>2181</port>
</node>
</zookeeper-servers>
### --- 修改配置文件/etc/clickhouse-server/config.xml
~~~ # 修改config.xml配置文件下zookeeper配置
[root@hadoop01 ~]# vim /etc/clickhouse-server/config.xml
~~~ 添加如下配置参数:333~334行
<zookeeper incl="zookeeper-servers" optional="true" />
<include_from>/etc/clickhouse-server/config.d/metrika.xml</include_from>
三、副本和分片下:副本的形式定义表
### --- 副本的定义形式
~~~ # 语法
hadoop01 :) CREATE TABLE table_name(
EventDate DateTime,
CounterID UInt32,
UserID UInt32
) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{layer}-{shard}/table_name', '{replica}')
PARTITION BY toYYYYMM(EventDate)
ORDER BY (CounterID, EventDate, intHash32(UserID))
SAMPLE BY intHash32(UserID);
### --- 创建一个副本表
~~~ # 创建一个表
hadoop01 :) create table replicated_sales_5 (
id String,
price Float64,
create_time DateTime
)ENGINE=ReplicatedMergeTree('/clickhouse/tables/01/replicated_sales_5','hadoop01')
PARTITION BY toYYYYMM(create_time)
ORDER BY id;
~~~ # 参数说明
~~~ ENGINE = ReplicatedMergeTree('/clickhouse/tables/01/replicated_sales_5', 'hadoop01')
~~~ 说明:/clickhouse/tables: 约定俗称的路径固定前缀
~~~ 01:分片编号
~~~ replicated_sales_5:数据表的名字,建议与物理表名相同
~~~ hadoop01: 在zk中创建副本的名称,约定俗成使用服务器的名称。
### --- CH提供了一张zookeeper的代理表,可用通过SQL语句读取远端ZooKeeper的数据:
hadoop01 :) select * from system.zookeeper where path = '/clickhouse';
┌─name───┬─value─┬───────czxid─┬───────mzxid─┬───────────────ctime─┬───────────────mtime─┬─version─┬─cversion─┬─aversion─┬─ephemeralOwner─┬─dataLength─┬─numChildren─┬───────pzxid─┬─path────────┐
│ tables │ │ 64424509755 │ 64424509755 │ 2021-11-04 19:00:13 │ 2021-11-04 19:00:13 │ 0 │ 1 │ 0 │ 0 │ 0 │ 1 │ 64424509756 │ /clickhouse │
└────────┴───────┴─────────────┴─────────────┴─────────────────────┴─────────────────────┴─────────┴──────────┴──────────┴────────────────┴────────────┴─────────────┴─────────────┴─────────────┘
### --- 通过zk查看
[root@hadoop03 ~]# zkCli.sh
[zk: localhost:2181(CONNECTED) 0] ls /
[myKafka, zookeeper, clickhouse]
[zk: localhost:2181(CONNECTED) 1] ls /clickhouse
[tables]
[zk: localhost:2181(CONNECTED) 2] ls /clickhouse/tables
[01]
[zk: localhost:2181(CONNECTED) 4] ls /clickhouse/tables/01
[replicated_sales_5]
[zk: localhost:2181(CONNECTED) 5] ls /clickhouse/tables/01/replicated_sales_5
[metadata, temp, mutations, log, leader_election, columns, blocks, nonincrement_block_numbers, replicas, quorum, block_numbers]
Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart
——W.S.Landor
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?