clickhouse集群搭建、SpringBoot集成及应用

news2024/11/30 11:51:48

前言

在日常工作中,日志查询是我们不可避免的业务场景,当项目访问量较小时,我们可以将日志存储在MySQL或其他行式数据库中,但是如果项目访问量很大,一次查询就会给数据库带来很大压力,也许你会采用elk等成熟的方案去处理日志,但是代价相对较高。下面,介绍一种列式数据库clickhouse,它能够快速处理大批量数据的查询,对于日中存储查询场景比较方便。先贴上一个官方文档https://clickhouse.com/docs/zh/

一、集群搭建

clickhouse集群搭建依赖jdk和zookeeper集群,这两个的搭建方式在前文中,请参考jdk配置和zookeeper集群搭建。先下载安装包,可以从上述官方文档下载,这里提供一个clickhouse21.9.7.2版本,提取码:6qpu。准备工作完成后,开始集群搭建,建议直接在xshell或其他工具开启命令同步功能,解压安装包到指定目录

tar -zxvf clickhouse-common-static-21.9.7.2.tgz -C /home/ysgs/tools/clickhouse/
tar -zxvf clickhouse-common-static-dbg-21.9.7.2.tgz -C /home/ysgs/tools/clickhouse/
tar -zxvf clickhouse-server-21.9.7.2.tgz -C /home/ysgs/tools/clickhouse/
tar -zxvf clickhouse-client-21.9.7.2.tgz -C /home/ysgs/tools/clickhouse/

在这里插入图片描述
依次安装clickhouse-common-static、clickhouse-common-static-dbg和clickhouse-client,切换到对应目录下的install目录,执行doinst.sh,如下所示
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这三个安装完成,剩下最重要的clickhouse-server,先进行配置文件的修改,切换到如下目录/etc/clickhouse-server
在这里插入图片描述
编辑config.xml文件,主要修改如下几处内容,搜索标签即可

日志存储
<log>/app/data/clickhouse/log/clickhouse-server/clickhouse-server.log</log>
<errorlog>/app/data/clickhouse/log/clickhouse-server/clickhouse-server.err.log</errorlog>
开放连接
<!-- <listen_host>::</listen_host> -->
<listen_host>::</listen_host>
数据存储
<path>/app/data/clickhouse/data/</path>
<tmp_path>/app/data/clickhouse/tmp/</tmp_path>
<user_files_path>/app/data/clickhouse/user_files/</user_files_path>
<path>/app/data/clickhouse/access/</path>
<top_level_domains_path>/app/data/clickhouse/top_level_domains/</top_level_domains_path>
<format_schema_path>/app/data/clickhouse/format_schemas/</format_schema_path>

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

zookeeper集群设置
    <zookeeper>
        <node>
            <host>192.168.136.128</host>
            <port>2181</port>
        </node>
        <node>
            <host>192.168.136.128</host>
            <port>2182</port>
        </node>
        <node>
            <host>192.168.136.128</host>
            <port>2183</port>
        </node>
    </zookeeper>
分层分片设置
    <macros>
        <!--层级-->
        <layer>01</layer>
        <!--分片-->
        <shard>01</shard>
        <!--副本-->
        <replica>rep-01-01</replica>
    </macros>

在这里插入图片描述
在这里插入图片描述

<!-- <internal_replication>false</internal_replication> -->
<internal_replication>false</internal_replication>

在这里插入图片描述
修改完成后,复制出一份cp -p config.xml config-master.xml作为master节点配置,然后修改users.xml配置,主要打开一行,用于创建用户
在这里插入图片描述
然后,再复制一份cp -p config.xml config-slave.xml作为从节点配置,修改该配置,将上述config.xml修改的文件路径加上-slave,将所有端口(用于与master区分,统一修改即可)和分片配置修改
在这里插入图片描述

<http_port>28123</http_port>
<tcp_port>29000</tcp_port>
<mysql_port>29004</mysql_port>
<postgresql_port>29005</postgresql_port>
 <!-- <https_port>28443</https_port> -->
 <!-- <tcp_port_secure>29440</tcp_port_secure> -->
 <!-- <tcp_with_proxy_port>29011</tcp_with_proxy_port> -->
 <interserver_http_port>29009</interserver_http_port>
 <!-- <interserver_https_port>29010</interserver_https_port> -->
 <!-- <grpc_port>29100</grpc_port> -->
 分片配置
<macros>
        <!--层级-->
        <layer>01</layer>
        <!--分片-->
        <shard>03</shard>
        <!--副本-->
        <replica>rep-03-02</replica>
    </macros>

下面先介绍一些概念:

分片:对数据分开进行存储,每个分片存储一部分数据,如shard01、shard02...
副本:同一个分片中的多个clickhouse进程实例互为副本,每一个clickhouse实例都是一个副本,也就是说分片名相同,副本名称不同的实例互为副本

我这里是三台机器,三个分片,每个分片两个副本。数据写入时使用replicatedMergetree引擎,数据自动在两个副本之间进行同步备份,同一个分片的两个副本部署在不同的两台服务器上,任一服务器发生故障,集群内都会留存3个分片中的某个副本,保证数据完整性。
在这里插入图片描述
至此,配置文件修改完成,注意,分片的内容一定要对应好。然后切换到/etc/clickhouse-server/systemd/system文件夹下,复制一份服务cp -p clickhouse-server.service clickhouse-server-slave.service,然后编辑从服务,修改对应的配置文件和存储
在这里插入图片描述
切换到/lib/systemd/system下,同上操作。接下来,安装clickhouse-server。
先用config-slave.xml覆盖config.xml文件,先安装slave节点。然后用config-master.xml覆盖config.xml文件,安装master节点,切换到install目录下,执行doinst.sh命令行
在这里插入图片描述
然后,输入密码(一定记住)
在这里插入图片描述
安装成功之后,刷新服务,启动主节点和从节点

systemctl daemon-reload
systemctl status clickhouse-server.service
systemctl start clickhouse-server.service
systemctl status clickhouse-server.service

在这里插入图片描述
在这里插入图片描述

通过clickhouse-client --host 192.168.136.128 --port 9000 --database default --user default --password 'root'连接测试一下。然后,修改config.xml和confi-slave.xml配置,增加集群配置

在</test_unalivable这个标签后添加
<ck_cluster>
            <shard>
                <replica>
                    <host>192.168.136.131</host>
                    <port>9000</port>
                    <user>default</user>
                    <password>1qaz!QAZ</password>
                </replica>
                <replica>
                    <host>192.168.136.132</host>
                    <port>29000</port>
                    <user>default</user>
                    <password>1qaz!QAZ</password>
                </replica>
            </shard>
            <shard>
                <replica>
                    <host>192.168.136.132</host>
                    <port>9000</port>
                    <user>default</user>
                    <password>1qaz!QAZ</password>
                </replica>
                <replica>
                    <host>192.168.136.133</host>
                    <port>29000</port>
                    <user>default</user>
                    <password>1qaz!QAZ</password>
                </replica>
            </shard>
            <shard>
                <replica>
                    <host>192.168.136.133</host>
                    <port>9000</port>
                    <user>default</user>
                    <password>1qaz!QAZ</password>
                </replica>
                <replica>
                    <host>192.168.136.131</host>
                    <port>29000</port>
                    <user>default</user>
                    <password>1qaz!QAZ</password>
                </replica>
            </shard>
        </ck_cluster>

都配置完成后,重新安装./instal.sh加载下配置,然后重启服务。连接ck,查看集群

clickhouse-client --host 192.168.136.131 --port 9000 --database default --user default --password 'root'
select * from system.clusters;

在这里插入图片描述
至此,clickhouse集群搭建完成,由于搭建了三个节点,我们通过一个nginx配置设置转发,在nginx.conf配置文件增加如下配置

upstream clickhouse_server_write{
        server 192.168.136.131:8123;
        server 192.168.136.132:8123;
        server 192.168.136.133:8123;
    }

    server {
        listen       8123;
        server_name  localhost;

        location / {
            proxy_pass http://clickhouse_server_write;
            proxy_set_header    Host            $host;
            proxy_set_header    X-Real-IP       $remote_addr;
            proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }

    upstream clickhouse_server_read{
        server 192.168.136.131:28123;
        server 192.168.136.132:28123;
        server 192.168.136.133:28123;
    }

    server {
        listen       28123;
        server_name  localhost;

        location / {
            proxy_pass http://clickhouse_server_read;
            proxy_set_header    Host            $host;
            proxy_set_header    X-Real-IP       $remote_addr;
            proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }

可以看到,配置了8123为写数据的端口,28123为读数据的端口,做了读写分离。然后,创建一个测试用的表,做一下测试。

本地表:在某个clickhouse节点(单个实例)中创建的表为本地表
CREATE TABLE IF NOT EXISTS default.test ON CLUSTER 'ck_cluster'(id Int32, name String)ENGINE = ReplicatedMergeTree('/clickhouse/database/tables/{layer}-{shard}/test ', '{replica}') ORDER BY id PARTITION BY id PRIMARY KEY id;

分布式表:分布式表本身不存储数据,但是可以在多个分片上进行分布式并行查询,查询时会根据每个分片上副本的健康程度选择其中的一个副本进行查询
CREATE TABLE IF NOT EXISTS default.test_all ON CLUSTER 'ck_cluster' AS default.test ENGINE = Distributed(ck_cluster, default, test, hiveHash(id));

数据:
insert into `default`.test values(1,'张三');
insert into `default`.test values(2,'李四');
insert into `default`.test values(3,'王五');
insert into `default`.test values(4,'赵六');
insert into `default`.test values(5,'沈七');
insert into `default`.test values(6,'王八');

在这里插入图片描述
连接之后,我们先查询test表,也就是本地表,随着多次查询发现,是随机到某个节点的数据,如下所示
在这里插入图片描述
然后再查看test_all表,也就是分布式表(实际是一个视图),多次查询,是所有的数据
在这里插入图片描述
因此,在实际应用时,写数据配置8123端口,随机写到一个节点,查数据时,配置28123端口,查询分布式表。至此,集群搭建测试完毕。PS:上述的可视化工具为DBeaver,DBeaver,提取码:vwm2。

二、SpringBoot集成

1、依赖&配置

<dependency>
        <groupId>com.alibaba</groupId>
		<artifactId>druid</artifactId>
		<version>1.0.28</version>
</dependency>
<dependency>
	<groupId>ru.yandex.clickhouse</groupId>
	<artifactId>clickhouse-jdbc</artifactId>
	<version>0.3.2</version>
</dependency>
spring.datasource.type = com.alibaba.druid.pool.DruidDataSource
spring.datasource.url = jdbc:clickhouse://192.168.136.128:8123/default?useSSL=false
spring.datasource.driver-class-name = ru.yandex.clickhouse.ClickHouseDriver
spring.datasource.username = default
spring.datasource.password = root

2、测试连接

package com.example.clickhouse.clickhouse.ctrl;

import com.example.clickhouse.clickhouse.service.TestService;
import lombok.Data;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author zy
 * @version 1.0.0
 * @ClassName TestController.java
 * @Description TODO
 * @createTime 2022/12/12
 */
@RestController
@RequestMapping("/test")
public class TestController {
    @Autowired
    private TestService testService;

    @Data
    public class Test{
        private String id;
        private String name;
    }

    @RequestMapping("/write")
    public String write(){
        Test test = new Test();
        test.setId("7");
        test.setName("詹姆斯");
        testService.insert(test);
        return "插入成功";
    }
}

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.clickhouse.clickhouse.mapper.TestMapper">
    <insert id="insert">
       insert into `default`.test values(#{id},#{name})
    </insert>
</mapper>

在这里插入图片描述

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

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

相关文章

测试框架Pytest-pytest测试用例的运行实操

一、单元测试框架 1、什么是单元测试框架 单元测试是指在软件开发当中&#xff0c;针对软件的最小单位&#xff08;函数、方法&#xff09;进行正确性的检查测试。 2、单元测试框架 java&#xff1a;junit和testing python:unittest和pytest 3、单元测试框架主要做什么&a…

基于JSON的SQL注入攻击触发需要更新Web应用程序防火墙

©网络研究院 安全研究人员开发了一种通用的 SQL 注入技术&#xff0c;可以绕过多个 Web 应用程序防火墙 (WAF)。问题的核心是 WAF 供应商未能在 SQL 语句中添加对 JSON 的支持&#xff0c;从而使潜在的攻击者可以轻松隐藏其恶意负载。 Claroty Team82 的研究人员发现的绕…

绿盟SecXOps安全智能分析技术白皮书 思路方案

安全数据资产 统一管理DataOps&#xff0c;即 Data 和 Operations 的集成&#xff0c;于 2014 年首次提出。Gartner 将 DataOps 定义为“一种协作性的数据管理 实践&#xff0c;专注于改进组织内数据管道的通信、集成和自动化”[7]。DataOps 是一种面向流程的自动化方法&#x…

【C++笔试强训】第六天

文章目录选择题编程题选择题 1.十进制变量i的值为100&#xff0c;那么八进制的变量i的值为&#xff08;&#xff09; A 146 B 148 C 144 D 142 进制之间的转化&#xff0c;这不用多说了把 2.执行下面语句后的输出为 int I1; if(I<0)printf("****\n") ; els…

大数据Kudu(四):Kudu集群搭建

文章目录 Kudu集群搭建 一、kudu 安装包 二、节点规划及安装 1、首先在每个节点上传安装包 2、在node1、node2节点上安装如下rpm安装包 3、在node3节点上安装如下rpm安装包 4、配置Master Server 5、配置Tablet Server 6、Master节点配置所有Master Server 7、Server…

对DataFrame中元素进行定位并修改的DataFrame.iat[]方法

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 根据指定的行和列的位置号 显示或修改DataFrame中相应位置的元素 DataFrame.iat[x,y] 选择题 关于以下python代码说法错误的一项是? import pandas as pd df pd.DataFrame({"A"…

手把手教你搭建自己的FTP文件服务器

大家好&#xff0c;我是小豪&#xff0c;今天我来给大家分享如何在虚拟机上搭建自己的文件服务器 文章目录Linux上安装文件服务器FTP安装VSFTP下载dnf下载VSFTP清除防火墙的iptables缓存下载FTP匿名访问模式本地用户模式Linux上安装文件服务器FTP 由于FTP、HTTP、Telnet等协议…

【阿里实践】基于深度学习的个性化推荐系统实时化改造与升级

省时查报告-专业、及时、全面的行研报告库省时查方案-专业、及时、全面的营销策划方案库【免费下载】2022年11月份热门报告盘点推荐技术在vivo互联网商业化业务中的实践.pdf推荐系统基本问题及系统优化路径.pdf大规模推荐类深度学习系统的设计实践.pdf荣耀推荐算法架构演进实践…

doom emacs如何安装新插件和自定义快捷键

doom emacs如何安装新插件和自定义快捷键 最近在学习和使用doom emacs&#xff0c;遇到了2个问题。 问题1: 虽然doom emacs已经配置了很多的三方插件&#xff0c;但是还有些个性化的插件如何按doom风格添加&#xff1f; 问题2: 有些快捷键自己已经熟悉&#xff0c;如何修改&am…

双目密集匹配及SGM算法

提示&#xff1a; 双目密集匹配及SGM算法前言一、双目密集匹配1、双目密集匹配概述2.、双目密集匹配四大步骤代价计算&#xff08;per-pixel-cost&#xff09;&#xff1a;释义&#xff1a;代价聚集&#xff08;cost-aggregation&#xff09;:释义&#xff1a;分类&#xff1a;…

以就业为目标,Python到底应该学什么?

前言 很多小伙伴知道Python火爆薪资高&#xff0c;开始自学&#xff0c;可是并不知道Python应该学哪些技术、学到什么程度才能找到工作。今天我们就来分析一下&#xff0c;Python学到什么程度才能找到工作。 相关&#xff1a;我是今年刚刚毕业的不入流大学的本科生&#xff0…

KingbaseES Create Index Concurrently 过程探究

前言&#xff1a; 我们知道Oracle 可以通过create index online 在线创建索引&#xff0c;而不影响其他会话修改数据&#xff0c;但Oracle 实际在online 创建索引的最后一步&#xff0c;实际还是需要进行锁升级&#xff0c;申请表级的S锁&#xff0c;因此&#xff0c;最后还是有…

STM32CUBEMX开发GD32F303(17)----内部Flash读写

概述 本章STM32CUBEMX配置STM32F103&#xff0c;并且在GD32F303中进行开发&#xff0c;同时通过开发板内进行验证。 本例程主要讲解如何对芯片自带Flash进行读写&#xff0c;用芯片内部Flash可以对一些需要断电保存的数据进行保存&#xff0c;无需加外部得存储芯片&#xff0c…

广告公司到底干什么的?欣奥诚分享

广告公司到底干什么的&#xff1f; 这篇文章从产业的角度拆分广告业&#xff0c;还原一个真实的广告业出来。 01. 它们是谁&#xff1f; 早年广告业有4类公司&#xff1a;品牌咨询类公司&#xff1b;设计创意类公司&#xff1b;媒介投放类公司&#xff1b;活动执行类公司。 …

[附源码]Python计算机毕业设计电子病历系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

前端大全之JavaScript(简称JS)

目录 一、概念 1.总体概要 2.来源说明 3.JavaScript和java的关系 4.JS的特点 5.浏览器执行JS的简介 6.JS的组成 二、引入方式 1.内部脚本例子 2. 外部脚本例子 三、使用规则 1.书写语法 2.报错的查看方式 3.输出语句 &#xff08;1&#xff09;写入警告框 &am…

SecXOps 中的数据集存储方式

安全数据资产 统一管理DataOps&#xff0c;即 Data 和 Operations 的集成&#xff0c;于 2014 年首次提出。Gartner 将 DataOps 定义为“一种协作性的数据管理 实践&#xff0c;专注于改进组织内数据管道的通信、集成和自动化”[7]。DataOps 是一种面向流程的自动化方法&#x…

基于Java开发的(控制台)模拟的多用户多级目录的文件系统【100010035】

多级文件系统 1 设计目的 为了加深对文件系统内部功能和实现过程的理解&#xff0c;设计一个模拟的多用户多级目录的文件系统&#xff0c;并实现具体的文件物理结构、目录结构以及较为完善的文件操作命令集。 2 设计内容 2.1系统操作 操作命令风格&#xff1a;本文件系统的…

110115-07-6,Ac-LLM-CHOCalpain 抑制剂

Ac-LLM-CHO (ALLM) is a potent competitive inhibitor of cathepsin L (Ki0.6 nM) and cathepsin B (Ki100 nM). Ac-LLM-CHO (ALLM)是组织蛋白酶L (Ki0.6 nM)和组织蛋白酶B (Ki100 nM)的有效竞争性抑制剂。 编号: 124055中文名称: Calpain 抑制剂 II&#xff1a; Ac-Leu-Leu-M…

[附源码]Node.js计算机毕业设计点餐系统设计Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…