ClickHouse高可用及副本测试

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/473614.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里云Redis读写分离典型场景:如何轻松搭建电商秒杀系统

秒杀活动是绝大部分电商选择的低价促销&#xff0c;推广品牌的方式。不仅可以给平台带来用户量&#xff0c;还可以提高平台知名度。一个好的秒杀系统&#xff0c;可以提高平台系统的稳定性和公平性&#xff0c;获得更好的用户体验&#xff0c;提升平台的口碑&#xff0c;从而提…

LeetCode 756. 金字塔转换矩阵(回溯)

文章目录1. 题目2. 解题1. 题目 现在&#xff0c;我们用一些方块来堆砌一个金字塔。 每个方块用仅包含一个字母的字符串表示。 使用三元组表示金字塔的堆砌规则如下&#xff1a; 对于三元组(A, B, C) &#xff0c;“C”为顶层方块&#xff0c;方块“A”、“B”分别作为方块“…

Flask框架项目实例:**租房网站(一)

Flask是一款MVC框架&#xff0c;主要是从模型、视图、模板三个方面对Flask框架有一个全面的认识&#xff0c;通过完成作者-读书功能&#xff0c;先来熟悉Flask框架的完整使用步骤。 操作步骤为&#xff1a; 1.创建项目2.配置数据库3.定义模型类4.定义视图并配置URL 5.定义模板…

LeetCode 316. 去除重复字母 / 1081. 不同字符的最小子序列(单调栈)

文章目录1. 题目2. 解题1. 题目 LC 316&#xff1a; 给你一个字符串 s &#xff0c;请你去除字符串中重复的字母&#xff0c;使得每个字母只出现一次。需保证 返回结果的字典序最小&#xff08;要求不能打乱其他字符的相对位置&#xff09;。 示例 1&#xff1a; 输入&#…

LeetCode 809. 情感丰富的文字

文章目录1. 题目2. 解题1. 题目 有时候人们会用重复写一些字母来表示额外的感受&#xff0c;比如 "hello" -> "heeellooo", "hi" -> "hiii"。 我们将相邻字母都相同的一串字符定义为相同字母组&#xff0c;例如&#xff1a;&qu…

网站部署nginx--uwsgi

网站代码写完之后就是项目部署&#xff0c;主要包括两个方面&#xff1a; 1.nginx安装与配置&#xff1a; 1、Nginx 安装 系统平台&#xff1a;CentOS release 6.6 (Final) 64位。 一、安装编译工具及库文件 yum -y install make zlib zlib-devel gcc-c libtool openssl open…

天池 在线编程 滑动数独(滑动窗口)

文章目录1. 题目2. 解题1. 题目 描述 给定一个 3xn的矩阵 number&#xff0c;并且该矩阵只含有1到9的正整数。 考虑有一个大小为 3x3 滑动窗口&#xff0c;从左到右遍历该矩阵 number&#xff0c; 那么该滑动窗口在遍历整个矩阵的过程中会有n-2个。 现在你的任务是找出这些滑…

TIGK监控平台介绍

1 概述 众所周知监控平台对大数据平台是非常重要的&#xff0c;监控是故障诊断和分析的重要辅助利器&#xff0c;在发生事故之前就能预警&#xff0c;最大限度降低系统故障率。   监控系统我们可以分为业务层面&#xff0c;应用层面&#xff0c;系统层面 1.1 业务层面 业务系…

天池 在线编程 队列检查(排序)

文章目录1. 题目2. 解题1. 题目 描述 班上的学生根据他们的年级照片的身高升序排列&#xff0c;确定当前未站在正确位置的学生人数 数组长度 < 10^5示例 输入: heights [1,1,3,3,4,1]输出: 3解释: 经过排序后 heights变成了[1,1,1,3,3,4]&#xff0c;有三个学生不在应在…

celery异步执行任务在Django中的应用实例

1. 创建django项目celery_demo, 创建应用demo: django-admin startproject celery_demo python manage.py startapp demo2.在celery_demo模块中创建celery.py模块, 文件目录为: celery.py模块内容为: from celery import Celery from django.conf import settings import os#…

Spring自学教程-注解的使用(三)

一、java中的注解定义注解下面是一个定义注解的实例。Target(ElementType.TYPE)Retention(RetentionPolicy.RUNTIME)DocumentedInheritedpublic interface Description { String value();}其中的interface是一个关键字&#xff0c;在设计annotations的时候必须把一个类型定义为…

Django单元测试

一.前言/准备 测Django的东西仅限于在MTV模型。哪些可以测&#xff1f;哪些不可以。 1.html里的东西不能测。①Html里的HTML代码大部分都是写死的②嵌套在html中的Django模板语言也不能测&#xff0c;即使有部分逻辑。 但写测试用例时至少要调用一个类或者方法。模板语言没有出…

天池 在线编程 中位数

文章目录1. 题目2. 解题1. 题目 描述 给定一个长度为N的整数数组arr 返回一个长度为N的整数答案数组ans ans[i] 表示删除arr数组第i个数后&#xff0c;arr数组的中位数 N为偶数 2 < N < 10^5 示例 输入:[1,2,3,4,5,6] 输出:[4,4,4,3,3,3] 解释:删去1后 剩下的数组为[…

倒排索引原理和实现

关于倒排索引 搜索引擎通常检索的场景是&#xff1a;给定几个关键词&#xff0c;找出包含关键词的文档。怎么快速找到包含某个关键词的文档就成为搜索的关键。这里我们借助单词——文档矩阵模型&#xff0c;通过这个模型我们可以很方便知道某篇文档包含哪些关键词&#xff0c;某…

天池 在线编程 Character deletion

文章目录1. 题目2. 解题1. 题目 描述 Enter two strings and delete all characters in the second string from the first string 字符串长度&#xff1a;[1, 10^5] Example 1: Input: str”They are students”&#xff0c;sub”aeiou” Output: ”Thy r stdnts”来源&am…

天池 在线编程 扫雷(BFS)

文章目录1. 题目2. 解题1. 题目 描述 现在有一个简易版的扫雷游戏&#xff0c;你将得到一个n*m大小的二维数组作为游戏地图。 每个位置上有一个值&#xff08;0或1&#xff0c;1代表此处没有雷&#xff0c;0表示有雷&#xff09;。 你将获得一个起点的位置坐标&#xff08;x&a…

Flink简介

1 什么是Flink Apache Flink 是一个框架和分布式处理引擎&#xff0c;用于在无边界和有边界数据流上进行有状态的计算。Flink 能在所有常见集群环境中运行&#xff0c;并能以内存速度和任意规模进行计算。 它的主要特性包括&#xff1a;批流一体化、精密的状态管理、事件时间支…

天池 在线编程 旅行计划(暴力回溯)

文章目录1. 题目2. 解题1. 题目 描述 有n个城市&#xff0c;给出邻接矩阵arr代表任意两个城市的距离。 arr[i][j]代表从城市i到城市j的距离。Alice在周末制定了一个游玩计划&#xff0c;她从所在的0号城市开始&#xff0c;游玩其他的1 ~ n-1个城市&#xff0c;最后回到0号。 A…

初始化环境配置:CentOS 7.4x64 系统安装及基础配置

1.安装CentOS操作系统 ① 在进入系统引导后&#xff0c;会进入文字界面&#xff0c;选择install CentOS7 &#xff08;用键盘上的方向键↑、↓来选择要执行的操作&#xff0c;白色字体表示选中&#xff0c;按下回车&#xff0c;进入下一步操作&#xff09; ② 按回车执行安…

天池 在线编程 拿走瓶子(区间DP)

文章目录1. 题目2. 解题1. 题目 描述 有n个瓶子排成一列&#xff0c;用arr表示。 你每次可以选择能够形成回文连续子串的瓶子拿走&#xff0c;剩下的瓶子拼接在一起。 返回你能拿走所有的瓶子的最小次数。 n<500 arr[i]<1000示例 例1: 输入&#xff1a;[1,3,4,1,5] …