10

ClickHouse集群搭建(一)

 3 years ago
source link: https://niocoder.com/2020/11/28/ClickHouse集群搭建1/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

zAZ3yej.jpg!mobile

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

qmaIFr.png!mobile

HWADDR 地址查看

i2URrqq.png!mobile

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

rMjM3yI.png!mobile

vim /etc/hostname

设置 hosts 域名映射

QF3aI3U.png!mobile

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

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

2qiM7zE.png!mobile

拷贝公钥到 node01 机器

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

三台机器执行命令:

ssh-copy-id node01

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

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

node01 机器上面执行以下命令

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

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

bqEN3iA.png!mobile

设置时钟同步服务

  • 为什么需要时间同步
    • 因为很多分布式系统是有状态的, 比如说存储一个数据, 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_141
export 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

安装 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 修改配置文件如下

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:3888
server.2=node02:2888:3888
server.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]# ll
total 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 4
drwxr-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 start
Start 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 -m
ClickHouse 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

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 restart
Stop clickhouse-server service: DONE
Start clickhouse-server service: Path to data directory in /etc/clickhouse-server/config.xml: /var/lib/clickhouse/
DONE
[root@node01 clickhouse-server]# clickhouse-client -m
ClickHouse 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_local
ENGINE = 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_local

Ok.

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.

下载

mA7FraV.png!mobile

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK