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

ClickHouse概述

什么是ClickHouse?

ClickHouse 是俄罗斯的Yandex于2016年开源的列式存储数据库(DBMS),次要用于在线剖析解决查问(OLAP),可能应用SQL查问实时生成剖析数据报告。

什么是列式存储 ?

以上面表为例

idwebsitewechat
1https://niocoder.com/java干货
2http://www.merryyou.cn/javaganhuo

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

Row1Row2
1https://niocoder.com/java干货2http://www.merryyou.cn/javaganhuo

益处是想查某条记录所有的属性时,能够通过一次磁盘查找加程序读取就能够。然而当想查所有记录wechat时,须要不停的查找,或者全表扫描才行,遍历的很多数据都是不须要的。

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

col1col2col3
12https://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.100node01关防火墙, host映射, 时钟同步JDK, Zookeeperclickhouse-server 9000 clickhouse-server 9001
192.168.10.110node02关防火墙, host映射, 时钟同步JDK, Zookeeperclickhouse-server 9000 clickhouse-server 9001
192.168.10.120node03关防火墙, host映射, 时钟同步JDK, Zookeeperclickhouse-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

export JAVA_HOME=/export/servers/jdk1.8.0_141export 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.100node011
192.168.10.110node022
192.168.10.120node033

上传zookeeper安装包到/export/softwares门路上来,并解压

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

node01批改配置文件如下

cd /export/servers/zookeeper-3.4.9/conf/cp zoo_sample.cfg zoo.cfg# 创立数据寄存节点mkdir -p /export/servers/zookeeper-3.4.9/zkdatas/

vim zoo.cfg

dataDir=/export/servers/zookeeper-3.4.9/zkdatas# 保留多少个快照autopurge.snapRetainCount=3# 日志多少小时清理一次autopurge.purgeInterval=1# 集群中服务器地址server.1=node01:2888:3888server.2=node02:2888:3888server.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/
[root@node01 softwares]# lltotal 306776-rw-r--r--. 1 root root      6384 Nov  2 22:43 clickhouse-client-20.8.3.18-1.el7.x86_64.rpm-rw-r--r--. 1 root root  69093220 Nov  2 22:48 clickhouse-common-static-20.8.3.18-1.el7.x86_64.rpm-rw-r--r--. 1 root root  36772044 Nov  2 22:51 clickhouse-server-20.8.3.18-1.el7.x86_64.rpm-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安装包
[root@node01 softwares]# rpm -ivh clickhouse-common-static-20.8.3.18-1.el7.x86_64.rpm Preparing...                          ################################# [100%]Updating / installing...   1:clickhouse-common-static-20.8.3.1################################# [100%][root@node01 softwares]# rpm -ivh clickhouse-server-common-20.8.3.18-1.el7.x86_64.rpm Preparing...                          ################################# [100%]Updating / installing...   1:clickhouse-server-common-20.8.3.1################################# [100%][root@node01 softwares]# rpm -ivh clickhouse-server-20.8.3.18-1.el7.x86_64.rpm Preparing...                          ################################# [100%]Updating / installing...   1:clickhouse-server-20.8.3.18-1.el7################################# [100%]Create user clickhouse.clickhouse with datadir /var/lib/clickhouse[root@node01 softwares]# rpm -ivh clickhouse-client-20.8.3.18-1.el7.x86_64.rpm Preparing...                          ################################# [100%]Updating / installing...   1:clickhouse-client-20.8.3.18-1.el7################################# [100%]Create user clickhouse.clickhouse with datadir /var/lib/clickhouse
rpm装置结束后,clickhouse-serverclickhouse-client配置目录如下
[root@node01 softwares]# ll /etc/clickhouse-server/total 44-rw-r--r--. 1 root root 33738 Oct  6 06:05 config.xml-rw-r--r--. 1 root root  5587 Oct  6 06:05 users.xml[root@node01 softwares]# ll /etc/clickhouse-client/total 4drwxr-xr-x. 2 clickhouse clickhouse    6 Nov 28 22:19 conf.d-rw-r--r--. 1 clickhouse clickhouse 1568 Oct  6 04:44 config.xml
/etc/clickhouse-server/config.xmlClickHouse外围配置文件,次要内容如下
<?xml version="1.0"?><yandex>   <!-- 日志 -->   <logger>       <level>trace</level>       <log>/data1/clickhouse/log/server.log</log>       <errorlog>/data1/clickhouse/log/error.log</errorlog>       <size>1000M</size>       <count>10</count>   </logger>   <!-- 端口 -->   <http_port>8123</http_port>   <tcp_port>9000</tcp_port>   <interserver_http_port>9009</interserver_http_port>   <!-- 本机域名 -->   <interserver_http_host>这里须要用域名,如果后续用到复制的话</interserver_http_host>   <!-- 监听IP -->   <listen_host>0.0.0.0</listen_host>   <!-- 最大连接数 -->   <max_connections>64</max_connections>   <!-- 没搞懂的参数 -->   <keep_alive_timeout>3</keep_alive_timeout>   <!-- 最大并发查问数 -->   <max_concurrent_queries>16</max_concurrent_queries>   <!-- 单位是B -->   <uncompressed_cache_size>8589934592</uncompressed_cache_size>   <mark_cache_size>10737418240</mark_cache_size>   <!-- 存储门路 -->   <path>/data1/clickhouse/</path>   <tmp_path>/data1/clickhouse/tmp/</tmp_path>   <!-- user配置 -->   <users_config>users.xml</users_config>   <default_profile>default</default_profile>   <log_queries>1</log_queries>   <default_database>default</default_database>   <remote_servers incl="clickhouse_remote_servers" />   <zookeeper incl="zookeeper-servers" optional="true" />   <macros incl="macros" optional="true" />   <!-- 没搞懂的参数 -->   <builtin_dictionaries_reload_interval>3600</builtin_dictionaries_reload_interval>   <!-- 管制大表的删除 -->   <max_table_size_to_drop>0</max_table_size_to_drop>   <include_from>/data1/clickhouse/metrika.xml</include_from></yandex>
启动ClickHouse
[root@node01 softwares]# service clickhouse-server startStart clickhouse-server service: Path to data directory in /etc/clickhouse-server/config.xml: /var/lib/clickhouse/DONE[root@node01 softwares]# 

应用client链接server

[root@node01 softwares]# clickhouse-client -mClickHouse client version 20.8.3.18.Connecting to localhost:9000 as user default.Connected to ClickHouse server version 20.8.3 revision 54438.node01 :) show databases;SHOW DATABASES┌─name───────────────────────────┐│ _temporary_and_external_tables ││ default                        ││ system                         │└────────────────────────────────┘3 rows in set. Elapsed: 0.007 sec. node01 :) select 1;SELECT 1┌─1─┐│ 1 │└───┘1 rows in set. Elapsed: 0.005 sec. node01 :) 

分布式集群装置

node02node03下面执行之前的所有的操作
node01机器批改配置文件config.xml
[root@node01 softwares]# vim /etc/clickhouse-server/config.xml<!-- 关上这个 --> <listen_host>::</listen_host>    <!-- Same for hosts with disabled ipv6: -->    <!-- <listen_host>0.0.0.0</listen_host> -->    <!-- 新增内部配置文件metrika.xml  --><include_from>/etc/clickhouse-server/metrika.xml</include_from>

将批改后的配置散发到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文件
<yandex><!-- 集群配置 --><clickhouse_remote_servers>    <!-- 3分片1备份 -->    <cluster_3shards_1replicas>        <!-- 数据分片1  -->        <shard>            <replica>                <host>node01</host>                <port>9000</port>            </replica>        </shard>        <!-- 数据分片2  -->        <shard>            <replica>                <host>node02</host>                <port> 9000</port>            </replica>        </shard>        <!-- 数据分片3  -->        <shard>            <replica>                <host>node03</host>                <port>9000</port>            </replica>        </shard>    </cluster_3shards_1replicas></clickhouse_remote_servers></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查看集群
[root@node01 clickhouse-server]# service clickhouse-server restartStop clickhouse-server service: DONEStart clickhouse-server service: Path to data directory in /etc/clickhouse-server/config.xml: /var/lib/clickhouse/DONE[root@node01 clickhouse-server]# clickhouse-client -mClickHouse client version 20.8.3.18.Connecting to localhost:9000 as user default.Connected to ClickHouse server version 20.8.3 revision 54438.node01 :) select * from system.clusters;SELECT *FROM system.clusters┌─cluster───────────────────────────┬─shard_num─┬─shard_weight─┬─replica_num─┬─host_name─┬─host_address───┬─port─┬─is_local─┬─user────┬─default_database─┬─errors_count─┬─estimated_recovery_time─┐│ cluster_3shards_1replicas         │         1 │            1 │           1 │ node01    │ 192.168.10.100 │ 9000 │        1 │ default │                  │            0 │                       0 ││ cluster_3shards_1replicas         │         2 │            1 │           1 │ node02    │ 192.168.10.110 │ 9000 │        0 │ default │                  │            0 │                       0 ││ cluster_3shards_1replicas         │         3 │            1 │           1 │ node03    │ 192.168.10.120 │ 9000 │        0 │ default │                  │            0 │                       0 ││ test_cluster_two_shards           │         1 │            1 │           1 │ 127.0.0.1 │ 127.0.0.1      │ 9000 │        1 │ default │                  │            0 │                       0 ││ test_cluster_two_shards           │         2 │            1 │           1 │ 127.0.0.2 │ 127.0.0.2      │ 9000 │        0 │ default │                  │            0 │                       0 ││ test_cluster_two_shards_localhost │         1 │            1 │           1 │ localhost │ ::1            │ 9000 │        1 │ default │                  │            0 │                       0 ││ test_cluster_two_shards_localhost │         2 │            1 │           1 │ localhost │ ::1            │ 9000 │        1 │ default │                  │            0 │                       0 ││ test_shard_localhost              │         1 │            1 │           1 │ localhost │ ::1            │ 9000 │        1 │ default │                  │            0 │                       0 ││ test_shard_localhost_secure       │         1 │            1 │           1 │ localhost │ ::1            │ 9440 │        0 │ default │                  │            0 │                       0 ││ test_unavailable_shard            │         1 │            1 │           1 │ localhost │ ::1            │ 9000 │        1 │ default │                  │            0 │                       0 ││ test_unavailable_shard            │         2 │            1 │           1 │ localhost │ ::1            │    1 │        0 │ default │                  │            0 │                       0 │└───────────────────────────────────┴───────────┴──────────────┴─────────────┴───────────┴────────────────┴──────┴──────────┴─────────┴──────────────────┴──────────────┴─────────────────────────┘11 rows in set. Elapsed: 0.008 sec.                │            0 │                      

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

测试分布式集群

node01,node02,node03上别离创立本地表cluster3s1r_local

CREATE TABLE default.cluster3s1r_local(    `id` Int32,    `website` String,    `wechat` String,    `FlightDate` Date,    Year UInt16)ENGINE = MergeTree(FlightDate, (Year, FlightDate), 8192);

node01节点上创立分布式表

CREATE TABLE default.cluster3s1r_all AS cluster3s1r_localENGINE = Distributed(cluster_3shards_1replicas, default, cluster3s1r_local, rand());

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

插入数据

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

查问分布式表和本地表

node01 :) select * from cluster3s1r_all; # 查问总量查分布式表SELECT *FROM cluster3s1r_all┌─id─┬─website─────────────────┬─wechat─────┬─FlightDate─┬─Year─┐│  2 │ http://www.merryyou.cn/ │ javaganhuo │ 2020-11-28 │ 2020 │└────┴─────────────────────────┴────────────┴────────────┴──────┘┌─id─┬─website──────────────┬─wechat─┬─FlightDate─┬─Year─┐│  3 │ http://www.xxxxx.cn/ │ xxxxx  │ 2020-11-28 │ 2020 │└────┴──────────────────────┴────────┴────────────┴──────┘┌─id─┬─website───────────────┬─wechat───┬─FlightDate─┬─Year─┐│  1 │ https://niocoder.com/ │ java干货 │ 2020-11-28 │ 2020 │└────┴───────────────────────┴──────────┴────────────┴──────┘3 rows in set. Elapsed: 0.036 sec. node01 :) select * from cluster3s1r_local; # node01本地表SELECT *FROM cluster3s1r_local┌─id─┬─website─────────────────┬─wechat─────┬─FlightDate─┬─Year─┐│  2 │ http://www.merryyou.cn/ │ javaganhuo │ 2020-11-28 │ 2020 │└────┴─────────────────────────┴────────────┴────────────┴──────┘1 rows in set. Elapsed: 0.012 sec.node02 :) select * from cluster3s1r_local; # node02本地表SELECT *FROM cluster3s1r_localOk.0 rows in set. Elapsed: 0.016 sec. node03 :) select * from cluster3s1r_local; ## node03 本地表SELECT *FROM cluster3s1r_local┌─id─┬─website──────────────┬─wechat─┬─FlightDate─┬─Year─┐│  3 │ http://www.xxxxx.cn/ │ xxxxx  │ 2020-11-28 │ 2020 │└────┴──────────────────────┴────────┴────────────┴──────┘┌─id─┬─website───────────────┬─wechat───┬─FlightDate─┬─Year─┐│  1 │ https://niocoder.com/ │ java干货 │ 2020-11-28 │ 2020 │└────┴───────────────────────┴──────────┴────────────┴──────┘2 rows in set. Elapsed: 0.006 sec. 

下载

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