天天看點

資料源管理 | OLAP查詢引擎,ClickHouse叢集化管理一、列式庫簡介二、叢集配置三、叢集環境整合四、源代碼位址

一、列式庫簡介

ClickHouse是俄羅斯的Yandex公司于2016年開源的列式存儲資料庫(DBMS),主要用于OLAP線上分析處理查詢,能夠使用SQL查詢實時生成分析資料報告。

列式存儲

資料源管理 | OLAP查詢引擎,ClickHouse叢集化管理一、列式庫簡介二、叢集配置三、叢集環境整合四、源代碼位址

行式存儲和列式存儲,資料在磁盤上的組織結構有着根本不同,資料分析計算時,行式存儲需要周遊整表,列式存儲隻需要周遊單個列,是以列式庫更适合做大寬表,用來做資料分析計算。

絮叨一句

:注意這裡比較的場景,是資料分析計算的場景。

二、叢集配置

1、基礎環境

ClickHouse單服務預設已經安裝完畢

  • Linux下安裝ClickHouse單機服務
  • SpringBoot整合ClickHouse列式資料庫

2、取消檔案限制

vim /etc/security/limits.conf
vim /etc/security/limits.d/90-nproc.conf
檔案末尾追加
* soft nofile 65536 
* hard nofile 65536 
* soft nproc 131072 
* hard nproc 131072           

3、取消SELINUX

修改/etc/selinux/config中的SELINUX=disabled後重新開機

4、叢集配置檔案

服務分别添加叢集配置:vim /etc/metrika.xml

<yandex>
<clickhouse_remote_servers>
    <clickhouse_cluster>
        <shard>
            <internal_replication>true</internal_replication>
            <replica>
                <host>192.168.72.133</host>
                <port>9000</port>
            </replica>
        </shard>
        <shard>
            <replica>
                <internal_replication>true</internal_replication>
                <host>192.168.72.136</host>
                <port>9000</port>
            </replica>
        </shard>
        <shard>
            <internal_replication>true</internal_replication>
            <replica>
                <host>192.168.72.137</host>
                <port>9000</port>
            </replica>
        </shard>
    </clickhouse_cluster>
</clickhouse_remote_servers>

<zookeeper-servers>
  <node index="1">
    <host>192.168.72.133</host>
    <port>2181</port>
  </node>
  <node index="2">
    <host>192.168.72.136</host>
    <port>2181</port>
  </node>
  <node index="3">
    <host>192.168.72.137</host>
    <port>2181</port>
  </node>
</zookeeper-servers>

<macros>
    <replica>192.168.72.133</replica>
</macros>

<networks>
   <ip>::/0</ip>
</networks>

<clickhouse_compression>
<case>
  <min_part_size>10000000000</min_part_size>
  <min_part_size_ratio>0.01</min_part_size_ratio>
  <method>lz4</method>
</case>
</clickhouse_compression>
</yandex>           

注意這裡

<macros>
    <replica>192.168.72.133</replica>
</macros>           

配置各自服務的IP位址。

5、啟動叢集

分别啟動三台服務

service clickhouse-server start           

6、登入用戶端檢視

這裡登入任意一台服務就好

clickhouse-client
en-master :) select * from system.clusters           
資料源管理 | OLAP查詢引擎,ClickHouse叢集化管理一、列式庫簡介二、叢集配置三、叢集環境整合四、源代碼位址

這裡這裡叢集名稱:clickhouse_cluster,後續使用。

7、基本環境測試

三台服務上同時建立表結構。

CREATE TABLE ontime_local (FlightDate Date,Year UInt16) ENGINE = MergeTree(FlightDate, (Year, FlightDate), 8192);           

133環境建立分布表

CREATE TABLE ontime_all AS ontime_local ENGINE = Distributed(clickhouse_cluster, default, ontime_local, rand());           

随便寫入一台服務資料

insert into ontime_local (FlightDate,Year) values ('2020-03-12',2020);           

查詢總表

select * from ontime_all;           

寫入總表,資料會分布到各個單表中

insert into ontime_all (FlightDate,Year)values('2001-10-12',2001);
insert into ontime_all (FlightDate,Year)values('2002-10-12',2002);
insert into ontime_all (FlightDate,Year)values('2003-10-12',2003);           

任意關閉一台服務,叢集查詢直接挂掉

三、叢集環境整合

1、基礎配置

url:配置全部的服務清單,主要用來管理表結構,批量處理;

cluster:叢集連接配接服務,可以基于Nginx代理服務配置;

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    click:
      driverClassName: ru.yandex.clickhouse.ClickHouseDriver
      url: jdbc:clickhouse://127.0.0.1:8123/default,jdbc:clickhouse://127.0.0.1:8123/default,jdbc:clickhouse://127.0.0.1:8123/default
      cluster: jdbc:clickhouse://127.0.0.1:8123/default
      initialSize: 10
      maxActive: 100
      minIdle: 10
      maxWait: 6000           

2、管理接口

分别向每個單節點服務建立表和寫入資料:

data_shard(單節點資料)

data_all(分布資料)

@RestController
public class DataShardWeb {

    @Resource
    private JdbcFactory jdbcFactory ;

    /**
     * 基礎表結建構立
     */
    @GetMapping("/createTable")
    public String createTable (){
        List<JdbcTemplate> jdbcTemplateList = jdbcFactory.getJdbcList();
        for (JdbcTemplate jdbcTemplate:jdbcTemplateList){
            jdbcTemplate.execute("CREATE TABLE data_shard (FlightDate Date,Year UInt16) ENGINE = MergeTree(FlightDate, (Year, FlightDate), 8192)");
            jdbcTemplate.execute("CREATE TABLE data_all AS data_shard ENGINE = Distributed(clickhouse_cluster, default, data_shard, rand())");
        }
        return "success" ;
    }

    /**
     * 節點表寫入資料
     */
    @GetMapping("/insertData")
    public String insertData (){
        List<JdbcTemplate> jdbcTemplateList = jdbcFactory.getJdbcList();
        for (JdbcTemplate jdbcTemplate:jdbcTemplateList){
            jdbcTemplate.execute("insert into data_shard (FlightDate,Year) values ('2020-04-12',2020)");
        }
        return "success" ;
    }
}           

3、叢集查詢

上述步驟執行完成後,可以連接配接叢集服務查詢分布總表和單表的資料。

基于Druid連接配接

@Configuration
public class DruidConfig {

    @Resource
    private JdbcParamConfig jdbcParamConfig ;

    @Bean
    public DataSource dataSource() {
        DruidDataSource datasource = new DruidDataSource();
        datasource.setUrl(jdbcParamConfig.getCluster());
        datasource.setDriverClassName(jdbcParamConfig.getDriverClassName());
        datasource.setInitialSize(jdbcParamConfig.getInitialSize());
        datasource.setMinIdle(jdbcParamConfig.getMinIdle());
        datasource.setMaxActive(jdbcParamConfig.getMaxActive());
        datasource.setMaxWait(jdbcParamConfig.getMaxWait());
        return datasource;
    }
}           

基于mapper查詢

<mapper namespace="com.ckhouse.cluster.mapper.DataAllMapper">

    <resultMap id="BaseResultMap" type="com.ckhouse.cluster.entity.DataAllEntity">
        <result column="FlightDate" jdbcType="VARCHAR" property="flightDate" />
        <result column="Year" jdbcType="INTEGER" property="year" />
    </resultMap>

    <select id="getList" resultMap="BaseResultMap" >
        select * from data_all where Year=2020
    </select>
</mapper>           

四、源代碼位址

GitHub·位址
https://github.com/cicadasmile/data-manage-parent
GitEE·位址
https://gitee.com/cicadasmile/data-manage-parent