ClickHouse集群搭建(一)

满目山河空念远,落花风雨更伤春。

ClickHouse概述

什么是ClickHouse?

ClickHouse 是俄罗斯的Yandex于2016年开源的列式存储数据库(DBMS),主要用于在线分析处理查询(OLAP),能够使用SQL查询实时生成分析数据报告。

什么是列式存储 ?

以下面表为例

id

website

wechat

1

https://niocoder.com/

java干货

2

http://www.merryyou.cn/

javaganhuo

采用行式存储时,数据在磁盘上的组织结构为:

Row1

Row2

1

https://niocoder.com/

java干货

2

http://www.merryyou.cn/

javaganhuo

好处是想查某条记录所有的属性时,可以通过一次磁盘查找加顺序读取就可以。但是当想查所有记录wechat时,需要不停的查找,或者全表扫描才行,遍历的很多数据都是不需要的。

而采用列式存储时,数据在磁盘上的组织结构为:

col1

col2

col3

1

2

https://niocoder.com/

http://www.merryyou.cn/

java干货

javaganhuo

这时想查所有记录的wechat只需把col3那一列拿出来即可。

集群环境搭建

在 安装ClickHouse 具体开始前, 先来搭建一下环境,软件包下载见末尾。

创建虚拟机

安装虚拟机 VMWare

安装Vmware虚拟机

导入 CentOS

将下载的CentOS系统中导入到 VMWare

注意事项:windows系统确认所有的关于VmWare的服务都已经启动,

确认好VmWare生成的网关地址,另外确认VmNet8网卡已经配置好了IP地址。

更多关于VmWare网络模式参考VMware虚拟机三种网络模式详解

集群规划

IP

主机名

环境配置

安装

ClickHouse

192.168.10.100

node01

关防火墙, host映射, 时钟同步

JDK, Zookeeper

clickhouse-server 9000 clickhouse-server 9001

192.168.10.110

node02

关防火墙, host映射, 时钟同步

JDK, Zookeeper

clickhouse-server 9000 clickhouse-server 9001

192.168.10.120

node03

关防火墙, host映射, 时钟同步

JDK, Zookeeper

clickhouse-server 9000 clickhouse-server 9001

配置每台主机

更改ip地址和HWADDR地址

vim /etc/sysconfig/network-scripts/ifcfg-eth0

HWADDR地址查看

修改主机名(重启后永久生效)

vim /etc/hostname

设置hosts域名映射

vim /etc/hosts

关闭防火墙

三台机器执行以下命令

systemctl status firewalld.service #查看防火墙状态 systemctl stop firewalld.service #关闭防火墙 systemctl disable firewalld.service #永久关闭防火墙

免密登录

为了方便传输文件,三台机器之前配置免密登录.

  • 免密 SSH 登录的原理
    1. 需要先在 B节点 配置 A节点 的公钥
    2. A节点 请求 B节点 要求登录
    3. B节点 使用 A节点 的公钥, 加密一段随机文本
    4. A节点 使用私钥解密, 并发回给 B节点
    5. B节点 验证文本是否正确
三台机器生成公钥与私钥

在三台机器执行以下命令,生成公钥与私钥

ssh-keygen -t rsa

执行该命令之后,按下三个回车即可

拷贝公钥到node01机器

三台机器将拷贝公钥到node01机器

三台机器执行命令:

ssh-copy-id node01

复制node01机器的认证到其他机器

将第一台机器的公钥拷贝到其他机器上

node01机器上面执行以下命令

scp /root/.ssh/authorized_keys node02:/root/.ssh

scp /root/.ssh/authorized_keys node03:/root/.ssh

设置时钟同步服务

  • 为什么需要时间同步

    • 因为很多分布式系统是有状态的, 比如说存储一个数据, A节点 记录的时间是 1, B节点 记录的时间是 2, 就会出问题

    安装

    yum install -y ntp

    启动定时任务

    crontab -e

随后在输入界面键入

*/1 * * * * /usr/sbin/ntpdate ntp4.aliyun.com;

安装JDK

上传jdk并解压然后配置环境变量

所有软件的安装路径

mkdir -p /export/servers #node01,node02,node03机器上执行

所有软件压缩包的存放路径

mkdir -p /export/softwares # 创建文件夹

安装rzsz命令

yum -y install lrzsz # 安装rz sz 命令

上传jdk安装包到/export/softwares路径下去,并解压

tar -zxvf jdk-8u141-linux-x64.tar.gz -C ../servers/

配置环境变量

vim /etc/profile

1export JAVA_HOME=/export/servers/jdk1.8.0_141 2export PATH=:$JAVA_HOME/bin:$PATH

执行以下命令将jdk安装包分发到node02node03节点上

scp -r /export/servers/jdk1.8.0_141/ node02:/export/servers/ scp -r /export/servers/jdk1.8.0_141/ node03:/export/servers/ scp /etc/profile node02:/etc/profile scp /etc/profile node03:/etc/profile

刷新环境变量

source /etc/profile

安装Zookeeper

服务器IP

主机名

myid的值

192.168.10.100

node01

1

192.168.10.110

node02

2

192.168.10.120

node03

3

上传zookeeper安装包到/export/softwares路径下去,并解压

tar -zxvf zookeeper-3.4.9.tar.gz -C ../servers/

node01修改配置文件如下

1cd /export/servers/zookeeper-3.4.9/conf/ 2 3cp zoo_sample.cfg zoo.cfg 4# 创建数据存放节点 5mkdir -p /export/servers/zookeeper-3.4.9/zkdatas/

vim zoo.cfg

1dataDir=/export/servers/zookeeper-3.4.9/zkdatas 2# 保留多少个快照 3autopurge.snapRetainCount=3 4# 日志多少小时清理一次 5autopurge.purgeInterval=1 6# 集群中服务器地址 7server.1=node01:2888:3888 8server.2=node02:2888:3888 9server.3=node03:2888:3888

node01机器上

/export/servers/zookeeper-3.4.9/zkdatas/这个路径下创建一个文件,文件名为myid ,文件内容为1

echo 1 > /export/servers/zookeeper-3.4.9/zkdatas/myid

安装包分发到其他机器

node01机器上面执行以下两个命令

scp -r /export/servers/zookeeper-3.4.9/ node02:/export/servers/

scp -r /export/servers/zookeeper-3.4.9/ node03:/export/servers/

node02机器上修改myid的值为2

echo 2 > /export/servers/zookeeper-3.4.9/zkdatas/myid

node03机器上修改myid的值为3

echo 3 > /export/servers/zookeeper-3.4.9/zkdatas/myid

启动zookeeper服务

node01,node02,node03机器都要执行

/export/servers/zookeeper-3.4.9/bin/zkServer.sh start

查看启动状态

/export/servers/zookeeper-3.4.9/bin/zkServer.sh status

安装前准备

CPU是否支持SSE4.2

查看CPU是否支持SSE4.2指令集

grep -q sse4_2 /proc/cpuinfo && echo "SSE 4.2 supported" || echo "SSE 4.2 not supported"

安装必要依赖

yum install -y unixODBC libicudata

yum install -y libxml2-devel expat-devel libicu-devel

安装ClickHouse

单机模式

上传4个文件到node01机器/opt/software/
1[root@node01 softwares]# ll 2total 306776 3-rw-r--r--. 1 root root 6384 Nov 2 22:43 clickhouse-client-20.8.3.18-1.el7.x86_64.rpm 4-rw-r--r--. 1 root root 69093220 Nov 2 22:48 clickhouse-common-static-20.8.3.18-1.el7.x86_64.rpm 5-rw-r--r--. 1 root root 36772044 Nov 2 22:51 clickhouse-server-20.8.3.18-1.el7.x86_64.rpm 6-rw-r--r--. 1 root root 14472 Nov 2 22:43 clickhouse-server-common-20.8.3.18-1.el7.x86_64.rpm
分别安装这4个rpm安装包
1[root@node01 softwares]# rpm -ivh clickhouse-common-static-20.8.3.18-1.el7.x86_64.rpm 2Preparing... ################################# [100%] 3Updating / installing... 4 1:clickhouse-common-static-20.8.3.1################################# [100%] 5[root@node01 softwares]# rpm -ivh clickhouse-server-common-20.8.3.18-1.el7.x86_64.rpm 6Preparing... ################################# [100%] 7Updating / installing... 8 1:clickhouse-server-common-20.8.3.1################################# [100%] 9[root@node01 softwares]# rpm -ivh clickhouse-server-20.8.3.18-1.el7.x86_64.rpm 10Preparing... ################################# [100%] 11Updating / installing... 12 1:clickhouse-server-20.8.3.18-1.el7################################# [100%] 13Create user clickhouse.clickhouse with datadir /var/lib/clickhouse 14[root@node01 softwares]# rpm -ivh clickhouse-client-20.8.3.18-1.el7.x86_64.rpm 15Preparing... ################################# [100%] 16Updating / installing... 17 1:clickhouse-client-20.8.3.18-1.el7################################# [100%] 18Create user clickhouse.clickhouse with datadir /var/lib/clickhouse
rpm安装完毕后,clickhouse-serverclickhouse-client配置目录如下
1[root@node01 softwares]# ll /etc/clickhouse-server/ 2total 44 3-rw-r--r--. 1 root root 33738 Oct 6 06:05 config.xml 4-rw-r--r--. 1 root root 5587 Oct 6 06:05 users.xml 5[root@node01 softwares]# ll /etc/clickhouse-client/ 6total 4 7drwxr-xr-x. 2 clickhouse clickhouse 6 Nov 28 22:19 conf.d 8-rw-r--r--. 1 clickhouse clickhouse 1568 Oct 6 04:44 config.xml 9
/etc/clickhouse-server/config.xmlClickHouse核心配置文件,主要内容如下
1<?xml version="1.0"?> 2<yandex> 3 <!-- 日志 --> 4 <logger> 5 <level>trace</level> 6 <log>/data1/clickhouse/log/server.log</log> 7 <errorlog>/data1/clickhouse/log/error.log</errorlog> 8 <size>1000M</size> 9 <count>10</count> 10 </logger> 11 12 <!-- 端口 --> 13 <http_port>8123</http_port> 14 <tcp_port>9000</tcp_port> 15 <interserver_http_port>9009</interserver_http_port> 16 17 <!-- 本机域名 --> 18 <interserver_http_host>这里需要用域名,如果后续用到复制的话</interserver_http_host> 19 20 <!-- 监听IP --> 21 <listen_host>0.0.0.0</listen_host> 22 <!-- 最大连接数 --> 23 <max_connections>64</max_connections> 24 25 <!-- 没搞懂的参数 --> 26 <keep_alive_timeout>3</keep_alive_timeout> 27 28 <!-- 最大并发查询数 --> 29 <max_concurrent_queries>16</max_concurrent_queries> 30 31 <!-- 单位是B --> 32 <uncompressed_cache_size>8589934592</uncompressed_cache_size> 33 <mark_cache_size>10737418240</mark_cache_size> 34 35 <!-- 存储路径 --> 36 <path>/data1/clickhouse/</path> 37 <tmp_path>/data1/clickhouse/tmp/</tmp_path> 38 39 <!-- user配置 --> 40 <users_config>users.xml</users_config> 41 <default_profile>default</default_profile> 42 43 <log_queries>1</log_queries> 44 45 <default_database>default</default_database> 46 47 <remote_servers incl="clickhouse_remote_servers" /> 48 <zookeeper incl="zookeeper-servers" optional="true" /> 49 <macros incl="macros" optional="true" /> 50 51 <!-- 没搞懂的参数 --> 52 <builtin_dictionaries_reload_interval>3600</builtin_dictionaries_reload_interval> 53 54 <!-- 控制大表的删除 --> 55 <max_table_size_to_drop>0</max_table_size_to_drop> 56 57 <include_from>/data1/clickhouse/metrika.xml</include_from> 58</yandex>
启动ClickHouse
1[root@node01 softwares]# service clickhouse-server start 2Start clickhouse-server service: Path to data directory in /etc/clickhouse-server/config.xml: /var/lib/clickhouse/ 3DONE 4[root@node01 softwares]#

使用client链接server

1[root@node01 softwares]# clickhouse-client -m 2ClickHouse client version 20.8.3.18. 3Connecting to localhost:9000 as user default. 4Connected to ClickHouse server version 20.8.3 revision 54438. 5 6node01 :) show databases; 7 8SHOW DATABASES 9 10┌─name───────────────────────────┐ 11│ _temporary_and_external_tables │ 12default13│ system │ 14└────────────────────────────────┘ 15 163 rows in set. Elapsed: 0.007 sec. 17 18node01 :) select 1; 19 20SELECT 1 21 22┌─1─┐ 23124└───┘ 25 261 rows in set. Elapsed: 0.005 sec. 27 28node01 :)

分布式集群安装

node02node03上面执行之前的所有的操作
node01机器修改配置文件config.xml
1[root@node01 softwares]# vim /etc/clickhouse-server/config.xml 2<!-- 打开这个 --> 3 <listen_host>::</listen_host> 4 <!-- Same for hosts with disabled ipv6: --> 5 <!-- <listen_host>0.0.0.0</listen_host> --> 6 <!-- 新增外部配置文件metrika.xml --> 7<include_from>/etc/clickhouse-server/metrika.xml</include_from> 8

将修改后的配置分发到node02,node03机器上

scp config.xml node02:/etc/clickhouse-server/config.xml

scp config.xml node03:/etc/clickhouse-server/config.xml

node01机器/etc/clickhouse-server/目录下创建metrika.xml文件
1<yandex> 2<!-- 集群配置 --> 3<clickhouse_remote_servers> 4 <!-- 3分片1备份 --> 5 <cluster_3shards_1replicas> 6 <!-- 数据分片1 --> 7 <shard> 8 <replica> 9 <host>node01</host> 10 <port>9000</port> 11 </replica> 12 </shard> 13 <!-- 数据分片2 --> 14 <shard> 15 <replica> 16 <host>node02</host> 17 <port> 9000</port> 18 </replica> 19 </shard> 20 <!-- 数据分片3 --> 21 <shard> 22 <replica> 23 <host>node03</host> 24 <port>9000</port> 25 </replica> 26 </shard> 27 </cluster_3shards_1replicas> 28</clickhouse_remote_servers> 29</yandex>

配置说明

  • cluster_3shards_1replicas 集群名称,可随意定义
  • 共设置3个分片,每个分片只有1个副本;

metrika.xml配置文件分发到node02,node03机器上

scp metrika.xml node02:/etc/clickhouse-server/metrika.xml

scp metrika.xml node03:/etc/clickhouse-server/metrika.xml

重启ClickHouse-server 打开client查看集群
1[root@node01 clickhouse-server]# service clickhouse-server restart 2Stop clickhouse-server service: DONE 3Start clickhouse-server service: Path to data directory in /etc/clickhouse-server/config.xml: /var/lib/clickhouse/ 4DONE 5[root@node01 clickhouse-server]# clickhouse-client -m 6ClickHouse client version 20.8.3.18. 7Connecting to localhost:9000 as user default. 8Connected to ClickHouse server version 20.8.3 revision 54438. 9 10node01 :) select * from system.clusters; 11 12SELECT * 13FROM system.clusters 14 15┌─cluster───────────────────────────┬─shard_num─┬─shard_weight─┬─replica_num─┬─host_name─┬─host_address───┬─port─┬─is_local─┬─user────┬─default_database─┬─errors_count─┬─estimated_recovery_time─┐ 16│ cluster_3shards_1replicas │ 111 │ node01 │ 192.168.10.10090001default │ │ 0017│ cluster_3shards_1replicas │ 211 │ node02 │ 192.168.10.11090000default │ │ 0018│ cluster_3shards_1replicas │ 311 │ node03 │ 192.168.10.12090000default │ │ 0019│ test_cluster_two_shards │ 111127.0.0.1127.0.0.190001default │ │ 0020│ test_cluster_two_shards │ 211127.0.0.2127.0.0.290000default │ │ 0021│ test_cluster_two_shards_localhost │ 111 │ localhost │ ::190001default │ │ 0022│ test_cluster_two_shards_localhost │ 211 │ localhost │ ::190001default │ │ 0023│ test_shard_localhost │ 111 │ localhost │ ::190001default │ │ 0024│ test_shard_localhost_secure │ 111 │ localhost │ ::194400default │ │ 0025│ test_unavailable_shard │ 111 │ localhost │ ::190001default │ │ 0026│ test_unavailable_shard │ 211 │ localhost │ ::110default │ │ 0027└───────────────────────────────────┴───────────┴──────────────┴─────────────┴───────────┴────────────────┴──────┴──────────┴─────────┴──────────────────┴──────────────┴─────────────────────────┘ 28 2911 rows in set. Elapsed: 0.008 sec. 0

可以看到cluster_3shards_1replicas就是我们定义的集群名称,一共有三个分片,每个分片有一份数据。剩下的为配置文件默认自带的集群配置.

测试分布式集群

node01,node02,node03上分别创建本地表cluster3s1r_local

1CREATE TABLE default.cluster3s1r_local 2( 3 `id` Int32, 4 `website` String, 5 `wechat` String, 6 `FlightDate` Date, 7 Year UInt16 8) 9ENGINE = MergeTree(FlightDate, (Year, FlightDate), 8192);

node01节点上创建分布式表

1CREATE TABLE default.cluster3s1r_all AS cluster3s1r_local 2ENGINE = Distributed(cluster_3shards_1replicas, default, cluster3s1r_local, rand());

往分布式表cluster3s1r_all插入数据,cluster3s1r_all 会随机插入到三个节点的cluster3s1r_local

插入数据

1INSERT INTO default.cluster3s1r_all (id,website,wechat,FlightDate,Year)values(1,'https://niocoder.com/','java干货','2020-11-28',2020); 2INSERT INTO default.cluster3s1r_all (id,website,wechat,FlightDate,Year)values(2,'http://www.merryyou.cn/','javaganhuo','2020-11-28',2020); 3INSERT INTO default.cluster3s1r_all (id,website,wechat,FlightDate,Year)values(3,'http://www.xxxxx.cn/','xxxxx','2020-11-28',2020);

查询分布式表和本地表

1node01 :) select * from cluster3s1r_all; # 查询总量查分布式表 2 3SELECT * 4FROM cluster3s1r_all 5 6┌─id─┬─website─────────────────┬─wechat─────┬─FlightDate─┬─Year─┐ 72 │ http://www.merryyou.cn/ │ javaganhuo │ 2020-11-2820208└────┴─────────────────────────┴────────────┴────────────┴──────┘ 9┌─id─┬─website──────────────┬─wechat─┬─FlightDate─┬─Year─┐ 103 │ http://www.xxxxx.cn/ │ xxxxx │ 2020-11-28202011└────┴──────────────────────┴────────┴────────────┴──────┘ 12┌─id─┬─website───────────────┬─wechat───┬─FlightDate─┬─Year─┐ 131 │ https://niocoder.com/ │ java干货 │ 2020-11-28202014└────┴───────────────────────┴──────────┴────────────┴──────┘ 15 163 rows in set. Elapsed: 0.036 sec. 17 18node01 :) select * from cluster3s1r_local; # node01本地表 19 20SELECT * 21FROM cluster3s1r_local 22 23┌─id─┬─website─────────────────┬─wechat─────┬─FlightDate─┬─Year─┐ 242 │ http://www.merryyou.cn/ │ javaganhuo │ 2020-11-28202025└────┴─────────────────────────┴────────────┴────────────┴──────┘ 26 271 rows in set. Elapsed: 0.012 sec. 28 29node02 :) select * from cluster3s1r_local; # node02本地表 30 31SELECT * 32FROM cluster3s1r_local 33 34Ok. 35 360 rows in set. Elapsed: 0.016 sec. 37 38node03 :) select * from cluster3s1r_local; ## node03 本地表 39 40SELECT * 41FROM cluster3s1r_local 42 43┌─id─┬─website──────────────┬─wechat─┬─FlightDate─┬─Year─┐ 443 │ http://www.xxxxx.cn/ │ xxxxx │ 2020-11-28202045└────┴──────────────────────┴────────┴────────────┴──────┘ 46┌─id─┬─website───────────────┬─wechat───┬─FlightDate─┬─Year─┐ 471 │ https://niocoder.com/ │ java干货 │ 2020-11-28202048└────┴───────────────────────┴──────────┴────────────┴──────┘ 49 502 rows in set. Elapsed: 0.006 sec. 51

下载

关注微信公众号java干货回复 【clickhouse】

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )