这里单独说明下分布式表引擎,不用分布式表引擎,感觉ClickHouse就没必要使用了cuiyaonan2000@163.com
参考网址:
- 分布式引擎 | ClickHouse Docs
分布式表引擎的位置:
分布式引擎本身不存储数据, 但可以在多个服务器上进行分布式查询。 读是自动并行的。读取时,远程服务器表的索引(如果有的话)会被使用。---注意分布式表其实是个视图cuiyaonan2000@163.com,具体的数据还是存储在表上
当 表指向当前服务器上的一个表时,你可以采用以下语句:----即根据指定的已存在的表的表结构创建分布式表,不用在去声明字段cuiyaonan2000@163.com
分布式引擎参数
-
- 服务为配置中的集群名
-
- 远程数据库名
-
- 远程数据表名
-
- (可选) 分片key
-
- (可选) 规则名,它会被用作存储临时文件以便异步发送数据
根据实际存储数据表的表引擎,还有更详细的配置设置.cuiyaonan2000@163.com
比如:
MergeTree 系列表引擎可以将数据存储在多个块设备上。
这对某些可以潜在被划分为“冷”“热”的表来说是很有用的。
最新数据被定期的查询但只需要很小的空间。相反,详尽的历史数据很少被用到。如果有多块磁盘可用,那么“热”的数据可以放置在快速的磁盘上(比如 NVMe 固态硬盘或内存),“冷”的数据可以放在相对较慢的磁盘上(比如机械硬盘)。
数据片段是 引擎表的最小可移动单元。属于同一个数据片段的数据被存储在同一块磁盘上。数据片段会在后台自动的在磁盘间移动,也可以通过 ALTER 查询来移动。
-
insert_distributed_sync 设置
-
MergeTree 查看示例
分布式设置
-
- 对异步插入到分布式的文件数据执行。确保操作系统将所有插入的数据刷新到启动节点磁盘上的一个文件中。
-
- 对目录执行。保证操作系统在分布式表上进行异步插入相关操作(插入后,发送数据到分片等)后刷新目录元数据.
-
- 如果超过这个数量的压缩字节将等待异步INSERT,将抛出一个异常。0 - 不抛出。默认值0.
-
- 如果超过这个数量的压缩字节将等待异步INSERT,查询将被延迟。0 - 不要延迟。默认值0.
-
- 最大延迟多少秒插入数据到分布式表,如果有很多挂起字节异步发送。默认值60。
-
- 等同于 distributed_directory_monitor_batch_inserts
-
- 等同于distributed_directory_monitor_split_batch_on_failure
-
- 等同于 distributed_directory_monitor_sleep_time_ms
-
- 等同于 distributed_directory_monitor_max_sleep_time_ms
数据将从集群中的所有服务器中,从位于集群中的每个服务器上的表读取。。 数据不仅在远程服务器上读取,而且在远程服务器上进行部分处理(在可能的范围内)。 例如,对于带有 的查询,数据将在远程服务器上聚合,聚合函数的中间状态将被发送到请求者服务器。然后将进一步聚合数据。 移动计算,大数据都差不多cuiyaonan2000@163.com
您可以使用一个返回字符串的常量表达式来代替数据库名称。例如: 。
如上分布式表的配置文件如下:
这里定义了一个名为’logs’的集群,它由两个分片组成,每个分片包含两个副本。 分片是指包含数据不同部分的服务器(要读取所有数据,必须访问所有分片)。 副本是存储复制数据的服务器(要读取所有数据,访问任一副本上的数据即可)。
相关参数说明:
- – 远程服务器地址。可以域名、IPv4或IPv6。如果指定域名,则服务在启动时发起一个 DNS 请求,并且请求结果会在服务器运行期间一直被记录。如果 DNS 请求失败,则服务不会启动。如果你修改了 DNS 记录,则需要重启服务。
- – 消息传递的 TCP 端口(「tcp_port」配置通常设为 9000)。不要跟 http_port 混淆。
- – 用于连接远程服务器的用户名。默认值:default。该用户必须有权限访问该远程服务器。访问权限配置在 users.xml 文件中。更多信息,请查看«访问权限»部分。
- – 用于连接远程服务器的密码。默认值:空字符串。
- – 是否使用ssl进行连接,设为true时,通常也应该设置 = 9440。服务器也要监听 并有正确的证书。
- - 是否使用数据压缩。默认值:true。
通过分布式引擎可以像使用本地服务器一样使用集群。但是,集群不是自动扩展的:你必须编写集群配置到服务器配置文件中(最好,给所有集群的服务器写上完整配置)。---不能自动扩容,需要手动编辑配置文件config.xml
不支持用分布式表查询别的分布式表(除非该表只有一个分片)。或者说,要用分布表查查询«最终»的数据表。 分布式引擎需要将集群信息写入配置文件。配置文件中的集群信息会即时更新,无需重启服务器。如果你每次是要向不确定的一组分片和副本发送查询,则不适合创建分布式表 - 而应该使用«远程»表函数。 请参阅«表函数»部分。
ClickHouse的插入解决方案绝对不会它的特点,而是缺点cuiyaonan2000@163.com
向集群写数据的方法有两种:
一,自已指定要将哪些数据写入哪些服务器,并直接在每个分片上执行写入。换句话说,在分布式表上«查询»,在数据表上 INSERT。 这是最灵活的解决方案 – 你可以使用任何分片方案,对于复杂业务特性的需求,这可能是非常重要的。 这也是最佳解决方案,因为数据可以完全独立地写入不同的分片。---即不建议在分布式表上执行插入,而是在物理表中执行插入cuiyaonan2000@163.com,相当于我们业务代码来进行分片操作.
二,在分布式表上执行 INSERT。在这种情况下,分布式表会跨服务器分发插入数据。 为了写入分布式表,必须要配置分片键(最后一个参数)。当然,如果只有一个分片,则写操作在没有分片键的情况下也能工作,因为这种情况下分片键没有意义。
每个分片都可以在配置文件中定义权重。默认情况下,权重等于1。数据依据分片权重按比例分发到分片上。例如,如果有两个分片,第一个分片的权重是9,而第二个分片的权重是10,则发送 9 / 19 的行到第一个分片, 10 / 19 的行到第二个分片。
分片可在配置文件中定义 ‘internal_replication’ 参数。
此参数设置为«true»时,写操作只选一个正常的副本写入数据。如果分布式表的子表是复制表(*ReplicaMergeTree),请使用此方案。换句话说,这其实是把数据的复制工作交给实际需要写入数据的表本身而不是分布式表。----同步由物理表来做
若此参数设置为«false»(默认值),写操作会将数据写入所有副本。实质上,这意味着要分布式表本身来复制数据。这种方式不如使用复制表的好,因为不会检查副本的一致性,并且随着时间的推移,副本数据可能会有些不一样。----同步由分布式表来做
选择将一行数据发送到哪个分片的方法是,首先计算分片表达式,然后将这个计算结果除以所有分片的权重总和得到余数。该行会发送到那个包含该余数的从’prev_weight’到’prev_weights + weight’的半闭半开区间对应的分片上,其中 ‘prev_weights’ 是该分片前面的所有分片的权重和,‘weight’ 是该分片的权重。例如,如果有两个分片,第一个分片权重为9,而第二个分片权重为10,则余数在 [0,9) 中的行发给第一个分片,余数在 [9,19) 中的行发给第二个分片。
分片表达式可以是由常量和表列组成的任何返回整数表达式。例如,您可以使用表达式 ‘rand()’ 来随机分配数据,或者使用 ‘UserID’ 来按用户 ID 的余数分布(相同用户的数据将分配到单个分片上,这可降低带有用户信息的 IN 和 JOIN 的语句运行的复杂度)。如果该列数据分布不够均匀,可以将其包装在散列函数中:intHash64(UserID)。----分片键的计算算法设置
这种简单的用余数来选择分片的方案是有局限的,并不总适用。它适用于中型和大型数据(数十台服务器)的场景,但不适用于巨量数据(数百台或更多服务器)的场景。后一种情况下,应根据业务特性需求考虑的分片方案,而不是直接用分布式表的多分片。---------大型的场景不能用简单的分片算法.
下面的情况,你需要关注分片方案:
- 使用需要特定键连接数据( IN 或 JOIN )的查询。如果数据是用该键进行分片,则应使用本地 IN 或 JOIN 而不是 GLOBAL IN 或 GLOBAL JOIN,这样效率更高。
- 使用大量服务器(上百或更多),但有大量小查询(个别客户的查询 - 网站,广告商或合作伙伴)。为了使小查询不影响整个集群,让单个客户的数据处于单个分片上是有意义的。或者 你可以配置两级分片:将整个集群划分为«层»,一个层可以包含多个分片。单个客户的数据位于单个层上,根据需要将分片添加到层中,层中的数据随机分布。然后给每层创建分布式表,再创建一个全局的分布式表用于全局的查询。
数据是异步写入的。对于分布式表的 INSERT,数据块只写本地文件系统。之后会尽快地在后台发送到远程服务器。发送数据的周期性是由distributed_directory_monitor_sleep_time_ms和distributed_directory_monitor_max_sleep_time_ms设置。分布式引擎会分别发送每个插入数据的文件,但是你可以使用distributed_directory_monitor_batch_inserts设置启用批量发送文件。该设置通过更好地利用本地服务器和网络资源来提高集群性能。你应该检查表目录中的文件列表(等待发送的数据)来检查数据是否发送成功。执行后台任务的线程数可以通过background_distributed_schedule_pool_size设置。
如果在 INSERT 到分布式表时服务器节点丢失或重启(如,设备故障),则插入的数据可能会丢失。如果在表目录中检测到损坏的数据分片,则会将其转移到«broken»子目录,并不再使用。
当查询一个表时,查询被发送到所有的分片,不管数据是如何分布在分片上的(它们可以完全随机分布)。当您添加一个新分片时,您不必将旧数据传输到它。相反,您可以使用更重的权重向其写入新数据——数据的分布会稍微不均匀,但查询将正确有效地工作。-----卧槽 竟然不理会数据迁移,那很想扩展一定要事先想清楚cuiyaonan2000@163.com
当启用选项时,查询处理将在单个分片中的所有副本之间并行化。更多信息,请参见max_parallel_replicas。-----并行查询多个副本同时计算
要了解更多关于分布式和查询是如何处理的,请参考这里文档。
- — 表 中的 值 . 数据类型: UInt32.
!!! note "备注" 因为 remote 和 cluster 表方法内部创建了分布式表, 对他们都有效.
详见
- 虚拟列 描述
- background_distributed_schedule_pool_size 设置
- shardNum() 和 shardCount() 方法