赞
踩
目前在ClikHouse的官网上二级索引的功能在v20.1.2.4之前是被标注为实验性,在这个版本之后默认是开启的。
1、老版本使用二级索引前需要增加设置
是否允许使用实验性的二级索引(v20.1.2.4开始,这个参数已被删除,默认开启)
set allow_experimental_data_skipping_indices=1;
2、创建测试表
- -- 建表,增加二级索引 a
- create table t_order_mt2(
- id UInt32,
- sku_id String,
- total_amount Decimal(16,2),
- create_time Datetime,
- -- 这里的GRANULARITY是设定二级索引对于一级索引粒度的粒度
- INDEX a total_amount TYPE minmax GRANULARITY 5
- ) engine = MergeTree
- partition by toYYYYMMDD(create_time)
- primary key(id)
- order by(id,sku_id);
-
- -- 写入数据
- insert into t_order_mt2 values
- (101,'sku_001',1000.00,'2020-06-01 12:00:00'),
- (102,'sku_002',2000.00,'2020-06-01 11:00:00'),
- (102,'sku_004',2500.00,'2020-06-01 12:00:00'),
- (102,'sku_002',2000.00,'2020-06-01 13:00:00'),
- (102,'sku_002',12000.00,'2020-06-01 13:00:00'),
- (102,'sku_002',600.00,'2020-06-02 12:00:00');
3、执行以下命令:
clickhouse-client -port 9977 --send_logs_level=trace<<<'select * rom t_order_mt2 where total_amount>toDecimal32(900.,2)';
主要是针对数据量大,有大量重复,稀疏索引不明显,加二级索引才有效果。并且可以看到
下面的跳疏索引。
Input and Output Formats | ClickHouse Documentation
副本只能同步数据,不能同步表结构,所以我们需要在每台服务器上自己手动建表。建表语句如下:
- CREATE TABLE mydb.test_replicated(
- `id` UInt32,
- `EventTime` Date
- )ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/table_name', '{replica}')
- PARTITION BY EventTime ORDER BY id
第一个参数shard:当前本地复制表实例所属的分片服务名称。
第二个参数replica:当前这张表所属的副本名称,一般用replica1、replica2表示。如果第一个参数相同,当前第二个参数需要不同。用以区分当前副本与其他副本。
在hadoop1和hadoop2上面分别执行下面的建表语句:
- -- 在hadoop1上执行
- create table t_order_rep(
- id UInt32,
- sku_id String,
- total_amount Decimal(16,2),
- create_time Datetime
- )engine = ReplicatedMergeTree('/clickhouse/table/01/t_order_rep','rep1')
- partition by toYYYYMMDD(create_time)
- primary key(id)
- order by(id,sku_id);
-
- -- 在hadoop2上执行
- create table t_order_rep(
- id UInt32,
- sku_id String,
- total_amount Decimal(16,2),
- create_time Datetime
- )engine = ReplicatedMergeTree('/clickhouse/table/01/t_order_rep','rep2')
- partition by toYYYYMMDD(create_time)
- primary key(id)
- order by(id,sku_id);
当建完表之后,可以在zookpper上查看到以下信息,在zookeeper上显示有2个副本。
执行插入语句:
- insert into t_order_rep values
- (101,'sku_001',1000.00,'2020-06-01 12:00:00'),
- (102,'sku_002',2000.00,'2020-06-01 12:00:00'),
- (103,'sku_004',2500.00,'2020-06-01 12:00:00'),
- (104,'sku_002',2000.00,'2020-06-01 12:00:00'),
- (105,'sku_003',600.00,'2020-06-02 12:00:00');
当在一台服务器上插入语句时候,会在另外一台服务上查询到。即互为副本。
副本虽然能够提高数据的可用性,降低丢失风险,但是每台服务器实际上必须容纳全量的数据,对数据的横向扩展没有解决。
要解决数据水平切分的问题,需要引入分片的概念。通过分片把一份完整的数据进行切分,不同的分片分不到不同的几点上,再通过Distributed表引擎把数据拼接起来一同使用。
Distributed表引擎本身不存储数据,优点类似MyCat至于MySql,成为一种中间件,通过分布式逻辑表来写入、分发、路由来操作多态节点不同分片的分布式数据。
注意:ClickHouse的集群是表级别的,实际企业中,大部分做了高可用,但是没有用分片,避免降低查询性能以及操作集群的复杂性。
两种颜色的虚线标记为是否把副本同步打开。生产上主要使用internal_replication=true
1、建本地表语句,由于前面有指定以下配置:
- <macros>
- <shard>01</shard> <!-- 不用机器放的分片数不一样 -->
- <replica>rep_1_1</replica> <!-- 不同机器放的副本数不一样,这里表示分片一的第一个副本 -->
- </macros>
可直接在建表语句中使用:
- create table st_order_mt on cluster pertest_3shards_2replicas(
- id UInt32,
- sku_id String,
- total_amount Decimal(16,2),
- create_time Datetime
- )engine = ReplicatedMergeTree('/clickhouse/tables/{shard}/st_order_mt','{replica}')
- partition by toYYYYMMDD(create_time)
- primary key(id)
- order by(id,sku_id);
2、建分布式表:
- create table st_order_mt_all2 on cluster pertest_3shards_2replicas(
- id UInt32,
- sku_id String,
- total_amount Decimal(16,2),
- create_time Datetime
- )engine = Distributed(pertest_3shards_2replicas,default,st_order_mt,hiveHash(sku_id));
参数含义:
Distributed(集群名称,库名,本地表名,分片键)
分片键必须是整型数字,所以用hiveHash函数转换,也可以rand()
官网:https://clickhouse.tech/docs/en/operations/backup/
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。