iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >设计 | ClickHouse 分布式表实现数据同步
  • 392
分享到

设计 | ClickHouse 分布式表实现数据同步

设计|ClickHouse分布式表实现数据同步 2021-07-11 18:07:50 392人浏览 才女
摘要

作者:吴帆 青云数据库团队成员 主要负责维护 Mysql 及 ClickHouse 产品开发,擅长故障分析,性能优化。 在多副本分布式 ClickHouse 集群中,通常需要使用 Distributed 表写入或读取数据,Distr

设计 | ClickHouse 分布式表实现数据同步

作者:吴帆 青云数据库团队成员

主要负责维护 Mysql 及 ClickHouse 产品开发,擅长故障分析,性能优化

在多副本分布式 ClickHouse 集群中,通常需要使用 Distributed 表写入或读取数据,Distributed 表引擎自身不存储任何数据,它能够作为分布式表的一层透明代理,在集群内部自动开展数据的写入、分发、查询、路由等工作。

Distributed 表实现副本数据同步有两种方案:

  1. Distributed + MergeTree
  2. Distributed + ReplicateMergeTree

| Distributed + MergeTree

在使用这种方案时 internal_replication 需要设为 false,向 Distributed 表写入数据,Distributed 表会将数据写入集群内的每个副本。Distributed 节点需要负责所有分片和副本的数据写入工作。

file

1. 集群配置


    
        false
        
            shard1-repl1
            9000
        
        
            shard1-repl2
            9000
        
    

2. 数据写入

CREATE TABLE test.t_local  on cluster logical_consistency_cluster
(
    EventDate DateTime,
    CounterID UInt32,
    UserID UInt32
) ENGINE MergeTree() PARTITION BY toYYYYMM(EventDate) ORDER BY (CounterID, EventDate) ;

CREATE TABLE test.t_logical_Distributed on cluster logical_consistency_cluster
(
    EventDate DateTime,
    CounterID UInt32,
    UserID UInt32
)
ENGINE = Distributed(logical_consistency_cluster, test, t_local, CounterID) ;

INSERT INTO test.t_logical_Distributed VALUES ("2019-01-16 00:00:00", 1, 1),("2019-02-10 00:00:00",2, 2),("2019-03-10 00:00:00",3, 3)

3. 数据查询

# shard1-repl1

SELECT *
FROM test.t_local

Query id: bd031554-b1e0-4fda-9ff8-1145ffae5b02

┌───────────EventDate──┬─CounterID─┬─UserID─┐
│ 2019-03-10 00:00:00 │         3 │      3 │
└─────────────────────┴───────────┴────────┘
┌───────────EventDate─┬─CounterID─┬─UserID─┐
│ 2019-02-10 00:00:00 │         2 │      2 │
└─────────────────────┴───────────┴────────┘
┌───────────EventDate─┬─CounterID─┬─UserID─┐
│ 2019-01-16 00:00:00 │         1 │      1 │
└─────────────────────┴───────────┴────────┘

3 rows in set. Elapsed: 0.004 sec. 

------------------------------------------

# shard1-repl2

SELECT *
FROM test.t_local

Query id: 636f7580-02e0-4279-bc9b-1f153c0473Dc

┌───────────EventDate─┬─CounterID─┬─UserID─┐
│ 2019-01-16 00:00:00 │         1 │      1 │
└─────────────────────┴───────────┴────────┘
┌───────────EventDate─┬─CounterID─┬─UserID─┐
│ 2019-03-10 00:00:00 │         3 │      3 │
└─────────────────────┴───────────┴────────┘
┌───────────EventDate─┬─CounterID─┬─UserID─┐
│ 2019-02-10 00:00:00 │         2 │      2 │
└─────────────────────┴───────────┴────────┘

3 rows in set. Elapsed: 0.005 sec. 

通过写入测试我们可以看到每个副本数据是一致的。

即使本地表不使用 ReplicatedMergeTree 表引擎,也能实现数据副本的功能。但每个副本的数据是通过 Distributed 表独立写入,文件存储格式不会完全一致,可以理解这种方式为逻辑一致性。

Distributed 需要同时负责分片和副本的数据写入工作,单点写入很有可能会成为系统性能的瓶颈,所有有接下来的第二种方案。

| Distributed + ReplicateMergeTree

在使用这种方案时 internal_replication 需要设为 true,向 Distributed 表写入数据。Distributed 表在每个分片中选择一个合适的副本并对其写入数据。

分片内多个副本之间的数据复制会由 ReplicatedMergeTree 自己处理,不再由 Distributed 负责。

file

1. 配置文件


    
        true
        
            shard1-repl1
            9000
        
        
            shard1-repl2
            9000
        
    

2. 数据写入

CREATE TABLE test.t_local on cluster  physical_consistency_cluster 
(
    EventDate DateTime,
    CounterID UInt32,
    UserID UInt32
)
ENGINE = ReplicatedMergeTree("{namespace}/test/t_local", "{replica}")
PARTITION BY toYYYYMM(EventDate)
ORDER BY (CounterID, EventDate, intHash32(UserID))
SAMPLE BY intHash32(UserID);



CREATE TABLE test.t_physical_Distributed on cluster physical_consistency_cluster
(
    EventDate DateTime,
    CounterID UInt32,
    UserID UInt32
)
ENGINE = Distributed(physical_consistency_cluster, test, t_local, CounterID);

INSERT INTO test.t_physical_Distributed VALUES ("2019-01-16 00:00:00", 1, 1),("2019-02-10 00:00:00",2, 2),("2019-03-10 00:00:00",3, 3)

3. 数据查询

# shard1-repl1

SELECT *
FROM test.t_local

Query id: d2bafd2d-d0a8-41b4-8d79-ece37e8159e5

┌───────────EventDate──┬─CounterID─┬─UserID─┐
│ 2019-03-10 00:00:00 │         3 │      3 │
└─────────────────────┴───────────┴────────┘
┌───────────EventDate─┬─CounterID─┬─UserID─┐
│ 2019-02-10 00:00:00 │         2 │      2 │
└─────────────────────┴───────────┴────────┘
┌───────────EventDate─┬─CounterID─┬─UserID─┐
│ 2019-01-16 00:00:00 │         1 │      1 │
└─────────────────────┴───────────┴────────┘

3 rows in set. Elapsed: 0.004 sec. 

------------------------------------------

# shard1-repl2

SELECT *
FROM test.t_local

Query id: b5f0dc80-f73f-427e-b04e-e5b787876462

┌───────────EventDate─┬─CounterID─┬─UserID─┐
│ 2019-01-16 00:00:00 │         1 │      1 │
└─────────────────────┴───────────┴────────┘
┌───────────EventDate─┬─CounterID─┬─UserID─┐
│ 2019-03-10 00:00:00 │         3 │      3 │
└─────────────────────┴───────────┴────────┘
┌───────────EventDate─┬─CounterID─┬─UserID─┐
│ 2019-02-10 00:00:00 │         2 │      2 │
└─────────────────────┴───────────┴────────┘

3 rows in set. Elapsed: 0.005 sec. 

ReplicatedMergeTree 需要依靠 ZooKeeper 的事件监听机制以实现各个副本之间的协同,副本协同的核心流程主要有:INSERT、MERGE、MUTATION 和 ALTER 四种。

通过写入测试我们可以看到每个副本数据也是一致的,副本之间依靠 ZooKeeper 同步元数据,保证文件存储格式完全一致,可以理解这种方式是物理一致。

ReplicatedMergeTree 也是在分布式集群中最常用的一种方案,但数据同步需要依赖 ZooKeeper,在一些 DDL 比较频繁的业务中 Zookeeper 往往会成为系统性能的瓶颈,甚至会导致服务不可用。

我们需要考虑为 ZooKeeper 减负,使用第一种方案 + 负载均衡轮询的方式可以降低单节点写入的压力。

总结

  • internal_replication = false

使用 Distributed + MergeTree 可实现逻辑一致分布式。

数据内容完全一致,数据存储格式不完全一致,数据同步不依赖 ZooKeeper,副本的数据可能会不一致,单点写入压力较大。

  • internal_replication = true

使用 Distributed + ReplicateMergeTree 可实现物理一致分布式。

数据内容完全一致,数据存储格式完全一致。数据同步需要依赖 ZooKeeper,ZooKeeper 会成为系统瓶颈。

您可能感兴趣的文档:

--结束END--

本文标题: 设计 | ClickHouse 分布式表实现数据同步

本文链接: https://www.lsjlt.com/news/8779.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 详解Flink同步Kafka数据到ClickHouse分布式表
    目录引言什么是ClickHouse?创建复制表通过jdbc写入引言 业务需要一种OLAP引擎,可以做到实时写入存储和查询计算功能,提供高效、稳健的实时数据服务,最终决定ClickHouse 什么是ClickHouse?...
    99+
    2022-12-01
    Flink数据同步KafkaClickHouse ClickHouse分布式表
  • 利用Redis实现分布式数据同步
    利用Redis实现分布式数据同步随着互联网的快速发展和技术的日新月异,分布式系统已经成为当今大部分互联网应用的基础架构之一。在这样的系统中,数据的一致性是一个重要的问题,不同的节点需要实时同步数据以保证系统的稳定性和可靠性。而Redis作为...
    99+
    2023-11-08
    Redis分布式 同步数据
  • clickhouse实时同步MySQL数据
    两种方式         1、使用clickhouse表引擎,直接从MySQL中读取数据(针对表),如果业务需求不是很复杂,可以选择此方式,需要哪张表就配置哪张表,操作简单,数据实时同步;         2、使用clickhouse数据库...
    99+
    2023-09-02
    mysql clickhouse 数据库
  • 如何使用Redis实现分布式数据同步
    如何使用Redis实现分布式数据同步随着互联网技术的发展和应用场景的日益复杂,分布式系统的概念越来越被广泛采用。在分布式系统中,数据同步是一个重要的问题。Redis作为一个高性能的内存数据库,不仅可以用来存储数据,还可以用来实现分布式数据同...
    99+
    2023-11-07
    分布式 redis 数据同步
  • ClickHouse分布式架构是如何设计的
    ClickHouse采用了一种分布式架构来处理海量数据的存储和查询。其分布式架构主要包括以下几个关键组件: 分布式存储层:Cli...
    99+
    2024-04-02
  • MySQL 到 ClickHouse 实时数据同步实操
    摘要: 很多 DBA 同学经常会遇到要从一个数据库实时同步到另一个数据库的问题,同构数据还相对容易,遇上异构数据、表多、数据量大等情况就难以同步。我自己亲测了一种方式,可以非常方便地...
    99+
    2024-04-02
  • PHP分布式部署代码同步Git实现
    PHP 分布式部署后 代码自动同步实现 项目架构如下: 需要更新代码时我们只需要把代码传到主服务器后通过定时任务主服务器自动push 代码到Git服务端,之后其他从服务器则自动从Git云端拉取最新的...
    99+
    2023-09-04
    git php 分布式
  • Go语言如何实现高效的分布式数组同步?
    Go语言作为一种快速、高效、可靠的编程语言,它的分布式数组同步功能也同样非常强大。在本文中,我们将探讨Go语言如何实现高效的分布式数组同步。 Go语言中的分布式数组同步,通常使用一种称为“分布式哈希表”的技术。这种技术可以将一个数组分散到多...
    99+
    2023-10-09
    数组 分布式 同步
  • 实现和设计Golang的分布式系统
    Golang分布式系统的设计与实现 引言:随着互联网的迅速发展,人们对分布式系统的需求越来越高。分布式系统能够提供高可用性、伸缩性和容错性,使得系统能够应对大量请求和并发。而Golang作为一门现代化的编程语...
    99+
    2024-01-16
    设计 分布式 Golang
  • Redis数据库分布式设计方案介绍
    目录1 哈希取余分区2 一致性哈希算法分区2.1 一致性哈希环2.2 节点映射2.3 落键规则 2.4 优缺点3 哈希槽计算总结问题:1-2亿数据需要缓存,如何设计? 1 ...
    99+
    2024-04-02
  • 基于Java方式实现数据同步
    本文实例为大家分享了Java方式实现数据同步的具体代码,供大家参考,具体内容如下 使用java方式实现两个系统之间数据的同步。 业务背景 在新系统中设置定时任务需要实时把客户系统中的...
    99+
    2022-11-13
    java 数据同步
  • 如何设计一个优化的MySQL表结构来实现数据同步功能?
    如何设计一个优化的MySQL表结构来实现数据同步功能?数据同步是在分布式系统中非常常见的需求,它可以确保多个节点之间的数据一致性。在MySQL中,我们可以通过合理设计表结构来实现数据同步功能。本文将介绍如何设计一个优化的MySQL表结构,并...
    99+
    2023-10-31
  • PHP中如何处理分布式系统的数据同步?
    随着互联网技术的不断发展,越来越多的应用程序需要使用分布式系统来支持其业务需求。在分布式系统中,数据同步是一个至关重要的问题。而在PHP技术中,对于分布式系统数据同步的处理方法,也有着不同的实现方式。处理分布式系统的数据同步问题,常使用的技...
    99+
    2023-05-14
    PHP 分布式系统 数据同步
  • PHP分布式异步编程:如何在Linux系统中实现分布式计算?
    PHP是一种流行的服务器端编程语言,广泛应用于Web开发。但是,PHP也可以用于分布式计算,通过将计算任务分配给多台计算机来加速计算。本文将介绍如何在Linux系统中使用PHP进行分布式异步编程。 一、什么是分布式计算? 分布式计算是一种...
    99+
    2023-11-07
    分布式 异步编程 linux
  • Cassandra数据的分布式聚合和计算怎么实现
    Cassandra是一个分布式数据库系统,可以通过将数据分布在多个节点上来实现分布式聚合和计算。以下是实现分布式聚合和计算的一些常见...
    99+
    2024-05-11
    Cassandra
  • 分布式环境下,如何利用Go语言实现数组同步?
    随着互联网技术的飞速发展,分布式系统已经成为了一种必然的趋势。在分布式系统中,数据同步是一个非常重要的问题。在本文中,我们将介绍如何利用Go语言实现数组同步。 一、分布式数组同步的挑战 在分布式系统中,如果多个节点同时访问同一个数组,就会...
    99+
    2023-10-09
    数组 分布式 同步
  • PHP并发编程:如何使用不同的数据类型实现分布式计算?
    随着计算机技术的不断发展,分布式计算已经成为了一个重要的研究领域。在分布式计算中,不同的计算机可以同时处理多个任务,从而提高计算效率。而PHP作为一种流行的Web编程语言,也可以使用不同的数据类型来实现分布式计算。本文将介绍如何使用PHP...
    99+
    2023-11-11
    并发 数据类型 分布式
  • Go语言和Numpy如何共同实现分布式计算?
    随着互联网时代的到来,数据量的增加和计算复杂度的提高,人们对于分布式计算的需求越来越强烈。而在分布式计算中,Go语言和Numpy是两个非常重要的工具。本文将介绍如何使用Go语言和Numpy共同实现分布式计算。 一、什么是Go语言? Go语...
    99+
    2023-09-10
    分布式 numpy 实时
  • 如何实现J2EE分布式系统框架设计
    今天就跟大家聊聊有关如何实现J2EE分布式系统框架设计,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。一,导言框架设计(Framework Design)是系统设计的重要组成部分,一个...
    99+
    2023-06-03
  • 数据库分布式系统设计策略是什么
    这篇文章主要讲解了“数据库分布式系统设计策略是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“数据库分布式系统设计策略是什么”吧!一:分布式系统设计策略分布式系统本质是通过低廉的硬件攒在一...
    99+
    2023-06-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作