滿目山河空念遠,落花風雨更傷春。
ClickHouse
概述ClickHouse
?ClickHouse
是俄羅斯的Yandex
於2016年開源的列式存儲數據庫(DBMS)
,主要用於在線分析處理查詢(OLAP)
,可以使用SQL
查詢實時生成分析數據報告。java
如下面表爲例node
id |
website |
wechat |
---|---|---|
1 | https://niocoder.com/ |
java乾貨 |
2 | http://www.merryyou.cn/ |
javaganhuo |
採用行式存儲時,數據在磁盤上的組織結構爲:linux
Row1 |
Row2 |
||||
---|---|---|---|---|---|
1 | https://niocoder.com/ |
java乾貨 |
2 | http://www.merryyou.cn/ |
javaganhuo |
好處是想查某條記錄全部的屬性時,能夠經過一次磁盤查找加順序讀取就能夠。可是當想查全部記錄wechat
時,須要不停的查找,或者全表掃描才行,遍歷的不少數據都是不須要的。web
而採用列式存儲時,數據在磁盤上的組織結構爲:sql
col1 |
col2 |
col3 |
|||
---|---|---|---|---|---|
1 | 2 | https://niocoder.com/ |
http://www.merryyou.cn/ |
java乾貨 |
javaganhuo |
這時想查全部記錄的wechat
只需把col3
那一列拿出來便可。shell
在 安裝ClickHouse
具體開始前, 先來搭建一下環境,軟件包下載見末尾。數據庫
VMWare
安裝Vmware虛擬機
vim
CentOS
將下載的CentOS
系統中導入到 VMWare
中windows
注意事項: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 登陸的原理
在三臺機器執行如下命令,生成公鑰與私鑰
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
爲何須要時間同步
## 安裝 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 # 建立文件夾
安裝rz
和sz
命令
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
安裝包分發到node02
和node03
節點上
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
修改配置文件以下
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指令集
`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
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
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-server
和clickhouse-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.xml
爲ClickHouse
核心配置文件,主要內容以下<?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 :)
node02
,node03
上面執行以前的全部的操做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.
關注微信公衆號java乾貨回覆 【clickhouse】