MyScaleDB 集群使用模式入门
MyScaleDB 基于开源的 Clickhouse 项目二次开发,使用方式基本上与其相同,在向量索引、搜索上有功能拓展,使用的时候需要提醒注意(截止到20240524):
- Vector Search 现在只测过 MergeTree 和 ReplicatedMergeTree,其他的(Replacing/Summing/…)可能会有问题;
- 其他的引擎,存储非向量的数据仍然可以用,就跟普通 Clickhouse 是一样的;
本文基于此docker-compose进行演示。
如何使用此docker-compose
启动 docker-compose,要求本机已经安装 docker 以及 docker-compose,然后执行以下步骤:
-
复制 .env.example到同级目录
cp .env.example .env
-
修改 .env
- 根据实际情况,修改 COMPOSE_PROJECT_NAME 的值,避免重复;
-
选择启动的集群模式,设置 COMPOSE_FILE 的值,其中 docker-compose-base.yaml 是不允许移除的:
- 单分区一备份模式
COMPOSE_FILE=docker-compose-base.yaml:docker-compose-1share-2replica.yaml
- 提供一个 cluster_1s_2r 的集群,详情请查看配置文件 1share2replica_config.xml 中的
remote_servers
配置项;
- 提供一个 cluster_1s_2r 的集群,详情请查看配置文件 1share2replica_config.xml 中的
- 双分区无备份模式
COMPOSE_FILE=docker-compose-base.yaml:docker-compose-2share-1replica.yaml
- 提供一个 cluster_2s_1r 的集群,详情请查看配置文件 2share1replica_config.xml 中的
remote_servers
配置项
- 提供一个 cluster_2s_1r 的集群,详情请查看配置文件 2share1replica_config.xml 中的
- 双分区一备份模式
COMPOSE_FILE=docker-compose-base.yaml:docker-compose-2share-2replica.yaml
- 提供一个 cluster_2s_2r 的集群,详情请查看配置文件 2share2replica_config.xml 中的
remote_servers
配置项
- 提供一个 cluster_2s_2r 的集群,详情请查看配置文件 2share2replica_config.xml 中的
- 单分区一备份模式
-
检查本机的端口与配置中的端口是否有冲突,根据实际情况修改端口;
-
启动本程序前,可提前在本机 pull 运行镜像:
- myscale/myscaledb:$
- dbeaver/cloudbeaver:$
- 提供 B/S 架构的数据库客户端服务,可在浏览器中使用,并访问此 docker-compose 中的 MyScaleDB 实例;
-
启动此 docker-compose:
docker-compose up -d
-
成功启动后,本目录下默认会生成 volumes 文件夹,此文件夹保存这些容器的持久化数据,可以很方便地查看各个实例保存的文件,学习探索 MyScaleDB:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65.
├── README.md
├── configs [12 entries exceeds filelimit, not opening dir]
├── docker-compose-1share-2replica.yaml
├── docker-compose-2share-1replica.yaml
├── docker-compose-2share-2replica.yaml
├── docker-compose-base.yaml
└── volumes
├── cloudbeaver
│ └── data
│ ├── GlobalConfiguration
│ └── user-projects
│ └── cbadmin
├── keeper1
│ ├── data
│ │ ├── logs
│ │ │ └── changelog_1_100000.bin.zstd
│ │ ├── snapshots
│ │ ├── state
│ │ └── uuid
│ └── log
│ ├── clickhouse-keeper.err.log
│ └── clickhouse-keeper.log
├── keeper2
│ ├── data
│ │ ├── logs
│ │ │ └── changelog_1_100000.bin.zstd
│ │ ├── snapshots
│ │ ├── state
│ │ └── uuid
│ └── log
│ ├── clickhouse-keeper.err.log
│ └── clickhouse-keeper.log
├── keeper3
│ ├── data
│ │ ├── logs
│ │ │ └── changelog_1_100000.bin.zstd
│ │ ├── snapshots
│ │ ├── state
│ │ └── uuid
│ └── log
│ ├── clickhouse-keeper.err.log
│ └── clickhouse-keeper.log
├── myscaledb1
│ ├── data [17 entries exceeds filelimit, not opening dir]
│ └── log
│ ├── clickhouse-server.err.log
│ └── clickhouse-server.log
├── myscaledb2
│ ├── data [17 entries exceeds filelimit, not opening dir]
│ └── log
│ ├── clickhouse-server.err.log
│ └── clickhouse-server.log
├── myscaledb3
│ ├── data [17 entries exceeds filelimit, not opening dir]
│ └── log
│ ├── clickhouse-server.err.log
│ └── clickhouse-server.log
└── myscaledb4
├── data [17 entries exceeds filelimit, not opening dir]
└── log
├── clickhouse-server.err.log
└── clickhouse-server.log
35 directories, 28 files -
登录用户信息
-
默认用户 default 无密码,只允许在 myscaledb 容器内使用 clickhouse-client 登录使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15docker exec -it myscaledb1 clickhouse-client --user default --password
# 注意,执行此命令后,系统要求输入密码,请直接回车即可
ClickHouse client version 23.3.2.1.
Password for user (default):
Connecting to localhost:9000 as user default.
Connected to ClickHouse server version 23.3.2 revision 54462.
Warnings:
* Linux is not using a fast clock source. Performance can be degraded. Check /sys/devices/system/clocksource/clocksource0/current_clocksource
* Table system.session_log is enabled. It's unreliable and may contain garbage. Do not use it for any kind of security monitoring.
* Some obsolete setting is changed. Check 'select * from system.settings where changed' and read the changelog.
default@:myscaledb1 :) -
普通用户 myscaledb,密码同用户名。
-
MyScaleDB 分区与副本的使用说明
集群是副本和分片的基础,它将 ClickHouse 的服务拓扑由单个节点延伸到多个节点,并提供灵活的集群配置方式,在一个集群里配置不同的小集群,小集群中可以有不同的节点、分区以及副本数量。
MyScaleDB 的引擎
MyScaleDB 基于 ClickHouse 开发,因此基本上全盘继承了 ClickHouse 引擎。不同引擎对于分区和副本有不同的限制,因此了解各个引擎的差异,有助于我们更好地使用 MyScaleDB。以下是截止到20240523一些常见的 ClickHouse 表引擎:
- MergeTree 系列引擎:
- MergeTree: 基础引擎,支持主键索引、数据分区。
- ReplicatedMergeTree: 用于实现数据副本。
- SummingMergeTree: 用于实时聚合求和。
- AggregatingMergeTree: 用于实时聚合任意的聚合函数。
- CollapsingMergeTree: 用于处理重复数据,例如时间序列数据中的取消操作。
- VersionedCollapsingMergeTree: 带有版本控制的 CollapsingMergeTree。
- GraphiteMergeTree: 用于存储和查询 Graphite 格式的数据。
- Log 系列引擎:
- TinyLog: 简单引擎,用于快速写入小表,数据文件按列独立存储。
- Log: 支持并发读取,数据文件按列存储。
- StripeLog: 支持并发读取,所有列数据存储在同一个文件中。
- 集成外部数据源的引擎:
- HDFS: 允许直接从 HDFS 读取数据。
- MySQL: 允许从 MySQL 数据库读取数据。
- JDBC: 允许从任何支持 JDBC 的数据库读取数据。
- File: 允许读取文件系统上的数据。
- 特殊用途的引擎:
- Distributed: 用于分布式查询,不存储数据。
- Memory: 将所有数据保存在 RAM 中。
- Set: 用于存储唯一值。
- Buffer: 用于在特定条件下将数据异步写入目标表。
- MaterializedView: 物化视图,根据 SELECT 查询的结果创建。
- 其他引擎:
- Join: 用于在运行时执行 JOIN 操作。
- URL: 允许从 URL 读取数据。
- Kafka: 用于从 Kafka 读取数据。
- Redis: 用于从 Redis 读取数据。
以上这些引擎,按照对多分区、多副本的支持进行分类:
- 支持多分区的引擎:
- MergeTree: 支持数据分区。
- SummingMergeTree: 继承自 MergeTree,支持分区。
- AggregatingMergeTree: 继承自 MergeTree,支持分区。
- CollapsingMergeTree: 继承自 MergeTree,支持分区。
- VersionedCollapsingMergeTree: 继承自 CollapsingMergeTree,支持分区。
- GraphiteMergeTree: 继承自 MergeTree,支持分区。
- 支持多副本的引擎:
- ReplicatedMergeTree: 专为复制表设计,支持多副本。
- 既支持多分区,也支持多副本的引擎:
- ReplicatedMergeTree: 这是唯一一个既支持多分区也支持多副本的引擎。它结合了 MergeTree 系列引擎的分区特性和复制表引擎的多副本特性。
请注意,虽然 ReplicatedMergeTree 支持多分区和多副本,但是它通常用于特定的集群设置中,需要与 ZooKeeper/ClickHouseKeeper 一起使用以管理副本之间的一致性。
其他引擎,如 TinyLog, Log, StripeLog 等,虽然可能支持分区,但它们通常用于特定的用例,如日志存储,并不支持复制表的特性。而 Distributed, Memory, Set, Buffer 等引擎主要用于特定的查询或数据管理操作,并不直接支持多分区或多副本的特性。在选择表引擎时,需要根据具体的业务需求和集群架构来确定最适合的引擎。
在 cluster_2s_2r 集群使用 ReplicatedMergeTree 引擎示例
启动 docker-compose
按照 如何使用此docker-compose 步骤在本机启动一套 MyScaleDB 集群,启动成功后,进入 myscaledb1 实例内的 clickhouse-client:
1 | docker exec -it myscaledb1 clickhouse-client --user default --password |
查看集群信息:
1 | default@:myscaledb1 :) show clusters; |
进入 myscaledb3 实例内的 clickhouse-client,查看集群信息,获得同样的结果:
1 | default@:myscaledb3 :) show clusters; |
查看 keeper 信息,如果一切运行正常,将会看到以下信息:
1 | default@:myscaledb3 :) SELECT * FROM system.zookeeper WHERE path IN ('/', '/clickhouse'); |
创建 database + table
由于我们在此 docker-compose 中配置了 distributed-ddl.xml, 因此创建数据库、创建表支持分布式 DDL,我们在集群内某个节点执行相关操作,其他节点也会同步执行。我们选择 myscaledb4 节点,执行以下命令:
创建数据库
1 | # 创建 testdb 数据库 |
执行成功之后,四个节点的 myscaledb 实例,都已经创建了 testdb 数据库。选择 myscaledb1 节点,执行以下命令:
1 | default@:myscaledb1 :) select * from system.databases where name='testdb'; |
创建数据库的表
在 myscaledb3 上执行 SQL 创建 tablemoqi
1 | default@:myscaledb3 :) CREATE TABLE testdb.tablemoqi |
此处直接声明表的引擎为 ReplicatedMergeTree, 实际测试法相,当声明引擎为 MergeTree,程序会自动转换创建使用 ReplicatedMergeTree 引擎。
在任意其他节点,都可查看到此 tablemoqi 已经创建成功:
1 | default@:myscaledb4 :) select `database`,name,`uuid`,`engine` from system.tables where name='tablemoqi'; |
插入数据
cluster_2s_2r 集群的网络拓扑如下图:
graph TD;
A[cluster_2s_2r] --> B[Shard 1]
A --> C[Shard 2]
B --> B1[myscaledb1:9000]
B --> B2[myscaledb2:9000]
C --> C1[myscaledb3:9000]
C --> C2[myscaledb4:9000]
需要说明的是,Shard1 与 Shard2 数据是隔离的,在 myscaledb1 操作表数据,相关命令会同步到 myscaledb2,但是不会影响到 myscaledb3、myscaledb4 节点。下面我们通过实际的 SQL 指令验证此结论:
在 myscaledb1 的 clickhouse-client 中执行:
1 | default@:myscaledb1 :) INSERT INTO testdb.tablemoqi (id, column1) VALUES (1, 'abc1'); |
进入 myscaledb2 的 clickhouse-client 中执行:
1 | ####################################### |
进入 myscaledb3 的 clickhouse-client 中执行:
1 | ####################################### |
进入 myscaledb4 的 clickhouse-client 中执行:
1 | default@:myscaledb4 :) select * from testdb.tablemoqi; |
以上结果可以说明,分区 Shard1 与 Shard2 数据是隔离的。在下一个章节,会介绍如何将两个分区的数据合并查询。
创建 Distributed 分布式表引擎表
Distributed 自身不存储任何数据,而是作为数据分片的透明代理,能够自动路由数据至集群中的各个节点,所以 Distributed 表引擎需要和其他数据表引擎一起协同工作。在任意一个 myscaledb 节点执行以下命令:
1 | default@:myscaledb4 :) CREATE TABLE testdb.tablemoqi_dist |
一个名为 tablemoqi_dist 的 Distributed 分布式表引擎的表在四个节点都已经创建,此时,在任意节点查询 testdb.tablemoqi_dist,都可以将两个分区的 testdb.tablemoqi 表数据合并在一起查询:
分布式查询
在 myscaledb4 查询 tablemoqi_dist:
1 | default@:myscaledb4 :) select * from testdb.tablemoqi_dist; |
在 myscaledb2 查询 tablemoqi_dist:
1 | default@:myscaledb2 :) select * from testdb.tablemoqi_dist; |
分布式写入
在 myscaledb1 对 testdb.tablemoqi_dist 插入四条数据:
1 | default@:myscaledb1 :) INSERT INTO testdb.tablemoqi_dist (id, column1) VALUES (4, 'abc4'); |
在 cluster_2s_2r 集群的配置文件 2share2replica_config.xml 中分配配置分片的权重(weight)为 10/20,系统会根据此权重值判断数据存储的集群,实际数据分布会跟本教程有所区别。分别在 myscaledb2、myscaledb3 查看实际存储数据的表 testdb.tablemoqi 记录的数据数量:
在 myscaledb2 中:
1 | default@:myscaledb2 :) select * from testdb.tablemoqi; |
在 myscaledb3 中:
1 | default@:myscaledb3 :) select * from testdb.tablemoqi; |