1 概述

​ 对于默认的分布式表的配置,每个分片只有一份,这种多分片单副本集群,挂掉一个节点的话查询分布式表会报错。为了解决这个问题的话可以使用ClickHouse高可用集群,对于每个分片具有2个或2个以上的副本,当某个节点挂掉时,该节点分片由其他节点的副本代替工作,这就避免了单点故障的问题。下面测试节点分别为:ambari01,ambari02,ambari03,ambari04

​ 说明:下面的测试都是以internal_replication=true进行的。internal_replication参数,为true代表了只写入shard内的一台,与ZooKeeper配合进行复制;为false代表了写入shard内所有的replica,与分布式表配合进行复制。使用写分布式表的缺点:①使用写分布式表进行复制,则可能出现多写一边成功一边失败的情况,数据的一致性不可控,②在一台服务器宕机一阵子以后,再恢复过来则这个时间段里面的数据不能自动恢复从另外的replica恢复过来。

2 高可用配置

2.1 单副本集群配置

​ 配置文件配置如下,由4个节点每个节点作为一个分片:

 <clickhouse_remote_servers><ck_cluster><shard><internal_replication>true</internal_replication><replica><host>ambari01</host><user>admin</user><password>admin</password><port>9000</port></replica></shard><shard><internal_replication>true</internal_replication><replica><host>ambari02</host><user>admin</user><password>admin</password><port>9000</port></replica></shard><shard><internal_replication>true</internal_replication><replica><host>ambari03</host><user>admin</user><password>admin</password><port>9000</port></replica></shard><shard><internal_replication>true</internal_replication><replica><host>ambari04</host><user>admin</user><password>admin</password><port>9000</port></replica></shard></ck_cluster></clickhouse_remote_servers>

​ (1)在每个节点创建havail库,并使用这个库

create database havail;
use havail;

​ (2)在每个节点创建一个avail表,表引擎为MergeTree ,再创建一个分布式表avail_all,表引擎为Distributed

CREATE TABLE avail (Name String,StartDate Date,Year UInt16) ENGINE = MergeTree(StartDate,(Year, StartDate),8192); CREATE TABLE avail_all (Name String,StartDate Date,Year UInt16) ENGINE= Distributed(ck_cluster, havail, avail, rand());

​ (3)在ambari01往avail_all表中插入一条数据并查询

insert into avail_all (Name,StartDate,Year)values('zs','2019-01-01',2019);
select * from avail_all;

​ (4)在每个节点上查询avail表,看写入分布表的数据存储在哪个节点的avail表上,插入分布表的数据只会存储在一个avail表上

select * from avail;

​ (5)发现数据存储在ambari02节点,手动停止ambari02的ClickHouse进程。在ambari01节点执行查询语句,报错

2.2 高可用集群

​ 配置文件配置如下,有4个节点2个shard,ambari01和ambari02为一个shard,ambari03和ambari04为2个shard:

 <clickhouse_remote_servers><ck_cluster><shard><internal_replication>true</internal_replication><replica><host>ambari01</host><user>admin</user><password>admin</password><port>9000</port></replica><replica><host>ambari02</host><user>admin</user><password>admin</password><port>9000</port></replica></shard><shard><internal_replication>true</internal_replication><replica><host>ambari03</host><user>admin</user><password>admin</password><port>9000</port></replica><replica><host>ambari04</host><user>admin</user><password>admin</password><port>9000</port></replica></shard></ck_cluster></clickhouse_remote_servers>

​ (1)同步上面配置到每个节点,并重启每个节点的ClickHouse

​ (2)使用前面建好的havail库

use havail;

​ (3)在每个节点创建一个havail表,表引擎为MergeTree ,再创建一个分布式表havail_all,表引擎为Distributed

CREATE TABLE havail (Name String,StartDate Date,Year UInt16) ENGINE = MergeTree(StartDate,(Year, StartDate),8192); CREATE TABLE havail_all (Name String,StartDate Date,Year UInt16) ENGINE= Distributed(ck_cluster, havail, havail, rand());

​ (4)在ambari01往havail_all表中插入1条数据并查询

insert into havail_all (Name,StartDate,Year)values('zs','2019-01-01',2019);
select * from havail_all;

​ (5)在每个节点上查询havail表,看写入分布表的数据存储在哪个节点的havail表上

select * from havail;


​ 可以发现虽然做了副本,但是MergeTree 引擎的表并不会自动复制数据,所有数据还是只在一个节点上

​ (6)发现数据存储在ambari01节点,手动停止ambari01的ClickHouse进程。在ambari02节点执行查询语句,发现不报错,但是没有数据。

2.3 高可用加复制表

​ 高可用加复制表是使用ReplicatedMergeTree 引擎+ Distributed引擎,作为集群结构的引擎。

CREATE TABLE table_name
(EventDate DateTime,CounterID UInt32,UserID UInt32
) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{layer}-{shard}/table_name', '{replica}', EventDate, intHash32(UserID), (CounterID, EventDate, intHash32(UserID), EventTime), 8192)

​ 官网已经不推荐上述建表语句,但是重点是测试,所以还是使用如上建表语句,官网推荐的推荐如下:

CREATE TABLE table_name
(EventDate DateTime,CounterID UInt32,UserID UInt32,ver UInt16
) ENGINE = ReplicatedReplacingMergeTree('/clickhouse/tables/{layer}-{shard}/table_name', '{replica}', ver)
PARTITION BY toYYYYMM(EventDate)
ORDER BY (CounterID, EventDate, intHash32(UserID))
SAMPLE BY intHash32(UserID)

​ 配置文件配置如下,有4个节点2个shard,ambari01和ambari02为一个shard,ambari03和ambari04为2个shard:

 <clickhouse_remote_servers><ck_cluster><shard><internal_replication>true</internal_replication><replica><host>ambari01</host><user>admin</user><password>admin</password><port>9000</port></replica><replica><host>ambari02</host><user>admin</user><password>admin</password><port>9000</port></replica></shard><shard><internal_replication>true</internal_replication><replica><host>ambari03</host><user>admin</user><password>admin</password><port>9000</port></replica><replica><host>ambari04</host><user>admin</user><password>admin</password><port>9000</port></replica></shard></ck_cluster></clickhouse_remote_servers>

​ (1)同步上面配置到每个节点,并重启每个节点的ClickHouse

​ (2)使用前面建好的havail库

use havail;

​ (3)在每个节点创建一个havail表,表引擎为MergeTree ,再创建一个分布式表havail_all,表引擎为Distributed

CREATE TABLE havail_re (Name String,StartDate Date,Year UInt16) ENGINE = ReplicatedMergeTree('/clickhouse/tables/01-01/havail_re','havail_re-01-1',StartDate,(Year, StartDate),8192); #分片1的第1个副本,ambari01执行CREATE TABLE havail_re (Name String,StartDate Date,Year UInt16) ENGINE = ReplicatedMergeTree('/clickhouse/tables/01-01/havail_re','havail_re-01-2',StartDate,(Year, StartDate),8192); #分片1的第2个副本,ambari03执行CREATE TABLE havail_re (Name String,StartDate Date,Year UInt16) ENGINE = ReplicatedMergeTree('/clickhouse/tables/01-02/havail_re','havail_re-02-1',StartDate,(Year, StartDate),8192); #分片2的第1个副本,ambari03执行CREATE TABLE havail_re (Name String,StartDate Date,Year UInt16) ENGINE = ReplicatedMergeTree('/clickhouse/tables/01-02/havail_re','havail_re-02-2',StartDate,(Year, StartDate),8192); #分片2的第2个副本,ambari04执行CREATE TABLE havail_re_all (Name String,StartDate Date,Year UInt16) ENGINE= Distributed(ck_cluster, havail, havail_re, rand());

​ 注意:ReplicatedMergeTree的参数:第一个:‘zk路径,如果要相互复制,这里必须一样’, 第二哥:‘副本名称, 必须不一样’, 剩下的就是分区和主键,以及索引粒度

​ (4)在ambari01往havail_re_all分布式表中插入1条数据并查询

insert into havail_re_all (Name,StartDate,Year)values('zs','2019-01-01',2019);
select * from havail_re_all;

​ (5)在每个节点上查询havail_re表,看写入分布表的数据存储在哪个节点的havail_re表上

select * from havail_re;


​ 可以发现我们在ambari01和ambari02这两个节点的本地表havail_re都可以查到数据,说明插入数据到分布表能复制。

​ (6)在ambari03往havail_re本地表中插入1条数据并查询

insert into havail_re (Name,StartDate,Year)values('zs','2020-02-02',2020);

​ (7)查看分布式表havail_re_all可以看到前面插入的2条记录都能查询

​ (8)查看ambari03和ambari04的本地表是否相互复制了

​ 说明往本地表插入数据也会进行复制

​ (9)停掉ambari03的ClickHouse进程查看分布表havail_re_all是否能正常工作

​ 在ambari01上查看分布表havail_re_all能正常查询,并且不会丢数据

总结

​ (1)没有配置副本,非复制表,每个节点为一个shard的情况:数据只被插入到一个本地表中,但没有任何机制可以将它转移到另一个表中。当一个节点挂了之后查询分布表会报错

​ (2)配置副本,非复制表的情况:据只被插入到一个本地表中,但没有任何机制可以将它转移到另一个表中。当一个节点挂了之后查询分布表不会报错,但是挂了的节点的数据会丢失

​ (3)配置副本,复制表的情况:插入到分布式表中的数据仅插入到其中一个本地表中,但通过复制机制传输到另一个节点的表中,因此两个本地表上的数据保持同步。推荐使用这种配置。

ClickHouse高可用及副本测试相关推荐

  1. clickhouse高可用-节点宕机数据一致性方案-热扩容

    clickhouse高可用-节点宕机数据一致性方案-热扩容 1. 集群节点及服务分配 说明: 1.1. 在每个节点上启动两个clickhouse服务(后面会详细介绍如何操作这一步),一个数据分片,一个 ...

  2. MongoDB高性能、高可用之副本集、读写分离、分片、操作实践

    2019独角兽企业重金招聘Python工程师标准>>> 关于MongoDb 1.MongoDB是一个开源的.基于分布式的.面向文档存储的非关系型数据库. 2.是非关系型数据库当中功能 ...

  3. n9e体验.以及部分高可用集群测试验证

    1.docker 环境 , docker-compose 参考1 参考2 参考3 下载二进制docker(离线内网安装) linux下载docker包地址 wget https://download. ...

  4. 如何保证高可用?java测试工程师测试的方法

    一面 正式批(别看了都是正式批,提前批就没让我面!)一面.面试时间 08-18,19:53 - 21:08,全程1个小时15分钟.涉及内容:项目.网络.数据库.算法题 1. 自我介绍 2. 项目中的有 ...

  5. MongoDB:高可用基础-副本集原理

    文章目录 1.副本集介绍 2.Raft核心流程 3.副本集选举 4.副本集数据复制 5.副本集故障转移 1.副本集介绍 在生产环境中,不建议使用单机版的MongoDB服务器,因为有可能出现单点问题: ...

  6. Flume-ng 高可用搭建-与测试

    前提: 1)五台虚拟机(三台也可以) 2)flume单节点测试并学会 3)hadoop集群搭建完成 Flume NG集群,架构图 Flume的存储可以支持多种,这里只列举了HDFS 角色分配 名称 H ...

  7. MongoDB 单节点升级为副本集高可用集群

    文章目录 项目背景 副本集架构 升级架构前注意事项 一.原单节点MongoDB配置信息 1.1 原配置文件 1.2 在原来配置文件增加副本集配置 二.新增节点信息 2.1 新增节点配置文件 2.2 启 ...

  8. PostgreSQL高可用集群在360的落地实战

    本文主要从以下几个方面介绍PostgreSQL高可用集群在360的落地实战 为什么选择Patroni + Etcd + PostgreSQL高可用集群方案 PostgreSQL高可用集群在360的落地 ...

  9. SpringCloud(第 051 篇)EurekaServer集群高可用注册中心以及简单的安全认证

    SpringCloud(第 051 篇)EurekaServer集群高可用注册中心以及简单的安全认证 - 一.大致介绍 1.前面章节分析了一下 Eureka 的源码,我们是不是在里面注意到了 Peer ...

最新文章

  1. px4驱动linux,px4开发指南——linux下qgroundcontrol地面站安装
  2. 博客园成立了管理团队
  3. 错误:No plugin found for prefix spring-boot in the current project and in the plugin groups
  4. 我为什么fuck GFW同时FUCK 开心网
  5. Java this关键字详解
  6. 贝壳宣布内部调查实质性完成
  7. 【采访】腾讯社交广告高校算法大赛第二周周冠军——Groot 比赛经验及心得分享
  8. oracle 事务快照_了解事务和快照复制的分布规模
  9. ubuntu 常用指令
  10. 操作系统原理-----进程同步与通信
  11. 网吧操作系统制作和优化的经验
  12. ToString格式转换大全(1)
  13. 【CSS】1088- CSS 快速实现烟花绽放
  14. 平衡小车PID,就该这么调!!!
  15. 2022南理工824专考研经验
  16. 如何利用CCleaner快速查找重复文件?
  17. 20年的嵌入式开发经验总结 !
  18. pve7 安装rhel9.0报错之Fatal glibc error: CPU does not support x86-64-v2处理及Kernel panic - not syncing
  19. linux账号安全管理,保证Linux系统安全——帐号管理
  20. 创业公司如何分配股份与期权

热门文章

  1. STM32的PA15、PB3、 PB4管脚作普通管脚的解决办法
  2. pointcut 切面表达式 切入点表达式
  3. [leetcode] 14. 最长公共前缀
  4. 十大经典算法 - 转载
  5. 【转】构建微服务架构的最佳实践2/3
  6. elasticsearch threadpool
  7. 涨疯了,历史总是如此相似
  8. sizeof你真的弄明白了吗?
  9. vim 插件cscope 使用
  10. mysql8.0.13 rpm_Centos7 安装mysql 8.0.13(rpm)的教程详解