ClickHouse
ClickHouse简介
ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS)。它是由俄罗斯搜索引擎公司Yandex开发,并于2016年6月发布的开源DBMS,与Hadoop,Spark相比,ClickHouse轻量很多。
创建集群
登录百度智能云控制台,选择“产品服务->百度MapReduce BMR”,点击“创建集群”,进入集群创建页。购置集群时勾选 ClickHouse 组件即可。
登陆集群
-
远程登录到创建好的集群
ssh root@$public_ip
使用创建集群时输入的密码
-
登录ClickHouse客户端
su - clickhouse clickhouse-client -m -u admin --password 集群密码
clickhouse-client常用参数:
- -h 主机名
- -d 数据库名
- -m 客户端支持多行SQL输入以分号结尾,不指定该参数默认以回车作为SQL结尾
- -u 账户,默认admin
- --password 默认创建集群时的密码
其他client参数可以执行以下命令进行查看
clickhouse-client --help
表操作
- 本地表使用示例
- 创建本地表:
CREATE TABLE `check_local` (
`Id` UInt16,
`Name` String,
`CreateDate` Date)
ENGINE = MergeTree()
PARTITION BY CreateDate
ORDER BY Id;
- 本地表插入数据:
insert into check_local (Id, Name, CreateDate) values (1, 'aa', '2020-01-01');
- 本地表查询数据:
select * from check_local;
-
分布式表使用示例
- 在默认集群上批量建立本地表:
CREATE TABLE `check_local2` ON CLUSTER default_cluster (
`Id` UInt16,
`Name` String,
`CreateDate` Date)
ENGINE = MergeTree()
PARTITION BY CreateDate
ORDER BY Id;
备注:ClickHouse集群支持分布式DDL语句,即在DDL语句上加上ON CLUSTER <cluster_neme>
的语法,使得该DDL语句执行一次便可在所有实例上创建该表。默认集群名字为default_cluster。
- 创建分布式表:
CREATE TABLE dis_check_all ON CLUSTER default_cluster
AS check_local2
ENGINE = Distributed(default_cluster, default, check_local2, rand());
- 分布式表插入语法同本地表:
insert into dis_check_all (Id, Name, CreateDate)values (1,'aa','2020-01-01');
或者
insert into dis_check_all values (1,'aa','2020-01-01');
- 分布式表查询:
select * from dis_check_all;
- 副本表使用示例
注意,如果创建的不是副本表(replicated table),数据完整性,在宕机、故障的时候无法保证。
请在不添加参数的情况下创建表。例如:
ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/table_name', '{replica}', ver)
ENGINE = ReplicatedMergeTree
前缀Replicated
添加到表引擎名称。例如:ReplicatedMergeTree
。
- *MergeTree参数
zoo_path:ClickHouse Keeper中表的路径。
replica_name:ClickHouse Keeper中的副本名称。
other_parameters:用于创建复制版本的引擎的参数,例如ReplacingMergeTree
中的版本。
例如:
CREATE TABLE table_name
(
EventDate DateTime,
CounterID UInt32,
UserID UInt32,
ver UInt16
ENGINE = ReplicatedReplacingMergeTree('/clickhouse/tables/{layer}-{shard}/table_name', '{replica}', ver)
PARTITION BY toYYYYMM(EventDate)
ORDER BY (CounterID, EventDate, intHash32(UserID))
SAMPLE BY intHash32(UserID);
弃用语法示例:
CREATE TABLE table_name
(
EventDate DateTime,
CounterID UInt32,
UserID UInt32
) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/table_name', '{replica}', EventDate, intHash32(UserID), (CounterID, EventDate, intHash32(UserID), EventTime), 8192);
如示例所示,这些参数可以包含大括号内的替换值。替换值取自配置文件的宏部分。
例如:
<macros>
<shard>02</shard>
<replica>example05-02-1</replica>
</macros>
ClickHouse Keeper 中表的路径对于每个复制表应该是唯一的。不同分片上的表应该有不同的路径。在这种情况下,路径由以下部分组成:
/clickhouse/tables/
是常用前缀。{shard}
将扩展为分片标识符。table_name
是 ClickHouse Keeper 中表的节点名称。最好将其与表名相同。它是明确定义的,因为与表名不同,它在 RENAME 查询后不会改变。 提示:您也可以在前面添加数据库名称table_name
。例如db_name.table_name
可以使用两个内置的替换{database}
和{table}
,它们分别展开为表名和数据库名(除非在宏部分定义了这些宏)。因此,动物园管理员路径可以指定为“/clickhouse/tables/{shard}/{database}/{table}
”。使用这些内置替换时,请小心表重命名。ClickHouse Keeper中的路径无法更改,当重命名表时,宏将展开到其他路径,表将引用ClickHouse Keeper不存在的路径,并将进入只读模式。
副本名称标识同一表的不同副本。您可以使用服务器名称,如示例所示。名称只需要在每个分片中是唯一的。
您可以显式定义参数,而不是使用替换。这可能便于测试和配置小型集群。但是,在这种情况下,您不能使用分布式DDL查询(ON CLUSTER
)。
在处理大型集群时,我们建议使用替换,因为它们可以降低出错的概率。
您可以在服务器配置文件中为副本表引擎指定默认参数。例如:
<default_replica_path>/clickhouse/tables/{shard}/{database}/{table}</default_replica_path>
<default_replica_name>{replica}</default_replica_name>
在这种情况下,可以在创建表时省略参数:
CREATE TABLE table_name (
x UInt32
) ENGINE = ReplicatedMergeTree
ORDER BY x;
或者:
CREATE TABLE table_name (
x UInt32
) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/{database}/table_name', '{replica}')
ORDER BY x;
对每个副本运行CREATE TABLE
查询。此查询创建一个新的复制表,或向现有表添加一个新副本。
如果在表已包含其他副本上的一些数据后添加新副本,则在运行查询后,数据将从其他副本复制到新副本。换句话说,新的复制品会与其他复制品同步。
要删除副本,请运行DROP TABLE
。但是,只会删除一个副本,即位于运行查询的服务器上的副本。
- 数据丢失后恢复
如果其中一台服务器的所有数据和元数据都消失了,请按照以下步骤进行恢复:
- 在服务器上安装 ClickHouse。如果使用替换,请在包含分片标识符和副本的配置文件中正确定义替换。
- 如果您有未复制的表必须在服务器上手动复制,请从副本(在目录
中/var/lib/clickhouse/data/db_name/table_name/
)复制其数据。 /var/lib/clickhouse/metadata/
从副本中复制位于的表定义。如果在表定义中明确定义了分片或副本标识符,请更正它,使其与此副本相对应。(或者,启动服务器并ATTACH TABLE
执行 中的 .sql 文件应包含的所有查询/var/lib/clickhouse/metadata/
。)- 要开始恢复,请创建具有任何内容的 ClickHouse Keeper 节点
/path_to_table/replica_name/flags/force_restore_data
,或运行命令来恢复所有复制的表:sudo -u clickhouse touch /var/lib/clickhouse/flags/force_restore_data
然后启动服务器(如果已在运行,则重新启动)。数据将从副本中下载。 - 另一种恢复选项是从 ClickHouse Keeper () 中删除有关丢失副本的信息,然后按照“创建复制表
/path_to_table/replica_name
”中所述再次创建副本。
恢复期间网络带宽不受限制。如果您要同时恢复多个副本,请注意这一点。
通过BLB访问ClickHouse集群
前提:用户已创建BMR Clickhouse集群
具体配置流程如下,参考https://cloud.baidu.com/doc/BLB/s/cjwvxnr91
- 创建BLB实例,可根据业务负载购买对应类型和规格的BLB实例
- 配置clickhouse实例
- 添加监听端口号