亚马逊AWS官方博客

基于 Amazon EC2 快速部署高可用ClickHouse

前言

ClickHouse是一个完全的列式数据库管理系统,允许在运行时创建表和数据库,加载数据和运行查询,而无需重新配置和重新启动服务器,支持线性扩展,简单方便,高可靠性,容错。它在大数据领域没有采用Hadoop生态,而是以本地硬盘作为存储,借助MPP架构突破Hadoop框架的局限性。ClickHouse集群通过原生Shard + Replication实现线性扩展能力和可靠性保障。

应用场景

场景1替换MySQL:

当业务数据量快速增长时,通过MySQL进行统计分析的延迟已无法满足实时业务需要。通过CDC(Change Data Capture)工具获取MySQL的binlog增量数据后发送到Kafka等消息队列中。通过ClickHouse中使用Kafka引擎表和物化视图来同步数据,并运行OLAP工作负载。

场景2实时数据仓库:

随着业务的快速创新,基于T+1方式的传统数据仓库已无法满足客户实时BI分析需求。使用FlinkSQL等实时计算框架对实时消息进行分流并将MySQL中的维度数据与实时消息进行合并。最后使用ClickHouse进行UV、PV和用户行为的实时分析。

场景3 SQL机器学习

传统机器学习工作流程复杂,需要数周甚至数月才能完成。ClickHouse 可使用SQL进行快速机器学习试验,通过AITables提升100x效率,数分钟或几小时就可完成。

架构概览

Amazon CloudFormation 提供了⼀种创建和管理相关Amazon Web Services资源的简便⽅法,并通过有序 且可预测的⽅式进⾏资源配置和更新。本方案提供两种部署选项,⼀种是将ClickHouse部署到新 VPC 环境中,另⼀种是 部署到已有 VPC 环境中。按照ClickHouse的部署参数部署完成后,该方案会在用户的Amazon Web Services account下部署如下的一个架构,包含2个(默认)到最多8个Amazon EC2实例部署ClickHouse Server,3个Zookeeper Server之间形成一个基于Zab协议的高可用集群,如果其中一个Leader实例因故障无法提供服务,Zab协议会自动在另外两个server 中选择一个作为 Leader 继续提供服务从而达到高可用的效果,下图是部署完的一个架构图:

  • (*) ClickHouse 部署支持最多跨越两个可用区的公有⼦⽹和私有⼦⽹的 VPC(由西云数据运营的 Amazon Web Services(宁夏)区域为 3 个,由光环新⽹运营的 Amazon Web Services(北京)区域为 3个,可任选其中两个可用区)。
  • (*) 在公有⼦⽹中,允许私有⼦⽹中的资源(ClickHouse 实例)进⾏出站 Internet 连接的 NAT Gateway。
  • (*) 在公有⼦⽹中,Amazon Auto Scaling 组中的允许 SSH 访问的堡垒主机。默认情况下将 部署⼀台堡垒主机,此数⽬可配置,最多启动 4 台。通过堡垒主机访问私有⼦⽹中的 ClickHouse server节点和ClickHouse client节点。
  • (*) 安全组,⽤于在 VPC 内实现通信,且仅允许访问必需的协议和端⼝(如果您选 择的是启动在已有 VPC 中,您需要提前创建此安全组或者使⽤已有的安全组)。
  • 在私有⼦⽹中,⼀个配置好Shard分片的ClickHouse集群和一个ClickHouse client节点, ClickHouse 集群可以⾃定义 Amazon EBS 存储的⼤⼩,同时支持与Amazon S3集成的分级存储特性。快速把副本集启动在不同的可⽤区中。ClickHouse client节点为方便客户通过clickhouse-client工具批量导入数据和日常维护。如果需要ssh远程登录到私有子网中的节点都需要通过公有子网的堡垒主机进行跳转,保障集群的安全性。
  • 在私有⼦⽹中,Elastic Load Balancing(ELB)会将请求路由到可用区1中ClickHouse server节点,在可用区2中的ClickHouse server节点只作为可用区1节点的热备,默认不对外提供服务。
  • ClickHouse 数据库默认密码在部署时随机生成,并由Amazon Secrets Manager保存,需要访问数据库时可在CloudFormation的Outputs中点击DBPassword参数链接,根据SecretId在Amazon Secrets Manager获得。

ClickHouse 集群通过原生 Shard + Replication 实现线性扩展能力和可靠性保障,对于读取,ClickHouse 集群可以使用另一个可用区中的 分片Shard副本来接管一个实例失败的情况。对于写入,客户端应用需要在实例失败时保存检查点,并在节点恢复时继续。客户端应用虽然可以将数据继续提交到副本实例,但这样会造成分片Shard副本间的数据不一致问题,所以建议还是等待节点恢复后继续写入原节点。

相较于ClickHouse社区版本,运行中Amazon Web Services上的ClickHouse具备如下优势:

  • 与云服务预集成: 集成了Amazon S3实现分级存储,与Amazon CloudWatch集成日志采集和资源指标仪表盘,以及提供Grafana图形化客户端。
  • 轻松一键部署: 提供一个最佳实践示例,帮助用户快速搭建ClickHouse分布式集群环境。您可以在使用Amazon CloudFormation模板一键部署该解决方案。
  • 预置样例数据集:部署时可自动导入OnTime航班样例数据集,方便客户快速体验。
  • 支持ARM架构部署: 支持部署在ARM架构Graviton2上的Amazon EC2实例上,帮助客户节省硬件投入。
  • 开源及定制化: 本方案是一个开源项目,您可以参考此方案中的源代码进行定制化功能的开发。

创建步骤

该方案ClickHouse的所有功能模块通过预定义好的CloudFormation模版实现创建启动,点击如下按键将跳转到CloudFormation控制台界面(Beijing)进行整体方案的一键部署。代码实施细节参见这里

部署到新建VPC(X86)

部署到已有VPC(X86)

部署到新建VPC(ARM)

部署到已有VPC(ARM)

若需要在亚马逊云科技海外区域进行部署,请单击以下按钮:

部署到海外新建VPC(X86)

部署到海外已有VPC(X86)

部署到海外新建VPC(ARM)

部署到海外已有VPC(ARM)

待Stack安装完毕之后,我们可跳转到EC2控制台查看所有的ClickHouse组件是否正常启动运行,如下图所示,我们可以看到所有的实例处于Running状态

在EC2控制台获取EC2 Keypair文件保存在本地,如clickhouse.pem. 运行命令修改key文件的读写权限。

chmod 400 ./clickhouse.pem

上传PEM key pair文件到堡垒机LinuxBastion,脚本示例如

scp -i "clickhouse.pem" ./clickhouse.pem ec2-user@ec2-11-11-11-11.compute-1.amazonaws.com:/home/ec2-user

登录堡垒机LinuxBastion

ssh -i "clickhouse.pem" ec2-user@ec2-11-11-11-11.compute-1.amazonaws.com

从EC2控制台获取ClickHouse Server的Private IP地址,如10.0.12.91。登录堡垒机后切换到/home/ec2-user目录下执行。

ssh -i "clickhouse.pem" ec2-user@10.0.12.91

登录到ClickHouse server之后,您就可以使用ClickHouse自带的Client命令行工具进行操作。

clickhouse-client --password YourPassword --host 10.0.12.91

YourPassword 可以在Amazon Secret Manager中名称ClickHouseSecret-sg-xxxxxxxxxxxx的实例。点击retrieve secret value按钮即可查看。

数据对接

接下来我们将对ClickHouse进行数据批量和实时导入、BI分析和SQL机器学习等流程,在此不再赘述,可参考亚马逊云科技Workshop官方网站详细介绍。

写在最后

本文首先简单介绍了ClickHouse及其特性和使用场景,然后介绍了ClickHouse集群架构的优势,并演示了如何利用Amazon Elastic Compute Cloud (Amazon EC2)结合Amazon Simple Storage Service (Amazon S3)和Amazon CloudWatch实现集群部署和冷热数据分级存储,通过CloudFormation实现服务快速部署,最终降低ClickHouse的采用门槛,IT人员,数据分析师等角色可以专注于业务本身,更加高效的完成数据分析任务。

本篇作者

乔伟

亚马逊云科技解决方案架构师,设计和构建可扩展的端到端数据分析解决方案,如分布式数据库、数据仓库、大数据、流计算和机器学习。热衷于为具有挑战性的客户设计、开发和构建云解决方案。