ClickHouse简介
Clickhouse是一个用于联机分析处理(OLAP)的列式数据库管理系统(columnar DBMS)。
ClickHouse应用场景
- 绝大多数请求都是用于读访问的
- 数据需要以大批次(大于1000行)进行更新,不是单行更新;或者根本没有更新操作
- 数据只是添加到数据库,没有必要修改
- 读取数据时,会从数据库中提取出大量的行,但只用到一小部分列
- 表很‘宽’,即表中包含大量的列
- 查询频率相对较低(通常每台服务器每秒查询数百次或更少)
- 对于简单查询,允许大约50毫秒的延迟
- 列的值是比较小的数值和短字符串(例如,每个URL只有60个字节)
- 在处理单个查询时需要高吞吐量(每台服务器每秒>高达数十亿行)
- 不需要事务
- 数据一致性要求较低
- 每次查询中只会查询一个大表。除了一个大表,其余都是小表
- 查询结果显著小于数据源。即数据有过滤或聚合。返回结果不超过单个服务器内存大小
ClickHouse的限制
- 不支持真正的删除、更新支持 不支持事务(期待后续版本支持)
- 不支持二级索引
- 有限的SQL支持,join实现与众不同
- 不支持窗口功能
- 元数据管理需要人工干预维护
环境及目标
作者采用centOS 7 进行环境搭建,首先安装一台虚拟机,下载安装ClickHouse+zookeeper之后进行虚拟机克隆,最终完成ClickHouse集群环境配置、搭建。
安装虚拟机
虚拟机网络设置-桥接
设置网络,连接外网
- 进入要修改网络相关的配置文件目录
cd /etc/sysconfig/network-scripts/
-
ls
目录找到ifcfg-eth**
文件
-
vi ifcfg-ens33
设置ONBOOT=yes
,:wq
保存并退出
service network restart` #(重启网路服务)
ClickHouse配置
安装
参考ClickHouse官方文档,RPM
安装包
添加官方存储库,需要确认选y
回车:
sudo yum install yum-utils
sudo rpm --import https://repo.clickhouse.tech/CLICKHOUSE-KEY.GPG
sudo yum-config-manager --add-repo https://repo.clickhouse.tech/rpm/stable/x86_64
运行安装命令,需要确认选y
回车:
sudo yum install clickhouse-server clickhouse-client
启动
如果没有service
,可以运行如下命令在后台启动服务:
sudo /etc/init.d/clickhouse-server start
如果提示:Init script is already running
则使用下面命令启动
systemctl start clickhouse-server.service
日志文件将输出在/var/log/clickhouse-server/
文件夹。
如果服务器没有启动,检查/etc/clickhouse-server/config.xml
中的配置。
您也可以手动从控制台启动服务器:
clickhouse-server --config-file=/etc/clickhouse-server/config.xml
在这种情况下,日志将被打印到控制台,这在开发过程中很方便。
如果配置文件在当前目录中,则不需要指定——config-file
参数。默认情况下,它的路径为./config.xml
。
ClickHouse支持访问限制设置。它们位于users.xml
文件(与config.xml
同级目录)。
默认情况下,允许default
用户从任何地方访问,不需要密码。可查看user/default/networks
。
启动服务后,您可以使用命令行客户端连接到它:
clickhouse-client
默认情况下,使用default
用户并不携带密码连接到localhost:9000
。还可以使用--host
参数连接到指定服务器。
终端必须使用UTF-8编码。
局域网内访问
开启ck外部访问配置
cd /etc/clickhouse-server/
vim config.xml # 放开<listen_host>::</listen_host>注释
systemctl restart clickhouse-server.service # 重启服务
查看防火墙所有开放的端口
firewall-cmd --zone=public --list-ports
防火墙端口操作
firewall-cmd --query-port=8123/tcp #查询指定端口是否已开 yes表示开启;no表示未开启。
firewall-cmd --zone=public --add-port=8123/tcp --permanent # 开放8123端口
firewall-cmd --zone=public --remove-port=8123/tcp --permanent #关闭8123端口
firewall-cmd --reload # 重新加载配置
netstat -anp #查询已开放的端口
关闭防火墙
如果要开放的端口太多,嫌麻烦,可以关闭防火墙,安全性自行评估
systemctl stop firewalld.service
查看防火墙状态
firewall-cmd --state
查看监听的端口
netstat -lnpt
安装zookeeper
采用wget
方式安装
-
yum
方式安装wget
yum -y install wget
- 创建/opt 文件夹:
mkdir -p /apps
- 进入到 /opt 目录中:
cd /apps
- 下载 zookeeper-3.4.9.tar.gz:
wget https://archive.apache.org/dist/zookeeper/zookeeper-3.4.9/zookeeper-3.4.9.tar.gz
- 解压缩 zookeeper-3.4.9.tar.gz:
tar -zxvf zookeeper-3.4.9.tar.gz
- 进入到 /usr/local/services/zookeeper/zookeeper-3.4.9/conf 目录中:
cd zookeeper-3.4.9/conf/
- 复制 zoo_sample.cfg 文件的并命名为为 zoo.cfg:
cp zoo_sample.cfg zoo.cfg
- 编辑zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir= /apps/zookeeper-3.4.9/data/zookeeper
dataLogDir= /apps/zookeeper-3.4.9/log/zookeeper
clientPort=2182
autopurge.purgeInterval=0
globalOutstandingLimit=200
server.1=10.10.7.143:2888:3888
server.2=10.10.7.193:2888:3888
server.3=10.10.7.152:2888:3888
- 创建相关目录
mkdir -p /apps/zookeeper-3.4.9/data/zookeeper
mkdir -p /apps/zookeeper-3.4.9/log/zookeeper
- 设置myid
vim /apps/zookeeper-3.4.9/data/zookeeper/myid # 三个节点各配置为1/2/3
- 进入zookeeper的bin目录,启动zookeeper服务,每个节点都需要启动
./zkServer.sh start
./zkServer.sh status # 查看节点状态
ClickHouse高可用集群方案
简单说一下ck表引擎,共有十几个,这里推荐3个
- MergeTree,是CK里最Advanced的引擎,性能超高,单机写入可以达到50w峰值,查询性能非常快
- ReplicatedMergeTree,基于MergeTree,同时引入ZK,做了复制
- Distributed,分布式引擎,本身不存储数据,可认为就是一张View,如果写入,会把请求丢到集群里的节点(有算法控制),如果查询,会帮你做查询转发再聚合返回
查看更改主机名
hostnamectl set-hostname XXX #更改主机名为 XXX
hostname #查看主机名
集群配置
安装成功后,在/etc/clickhouse-server/ 目录下生成配置文件config.xml及user.xml、自定义配置目录config.d及users.d,推荐在config.d及users.d下新建配置文件,然后在config.xml及user.xml中引入config.d及users.d下的配置文件。
- 编辑
config.xml
vim /etc/clickhouse-server/config.xml
<include_from>/etc/clickhouse-server/config.d/metrika.xml</include_from> <!--添加该参数-->
- 配置集群节点
简单介绍一下配置关键字,可以参考ClickHouse官网
每个服务器需要指定 host
,port
,和可选的 user
,password
,secure
,compression
的参数:
- host – 远程服务器地址。可以域名、IPv4或IPv6。如果指定域名,则服务在启动时发起一个 DNS 请求,并且请求结果会在服务器运行期间一直被记录。如果 DNS 请求失败,则服务不会启动。如果你修改了 DNS 记录,则需要重启服务。
- port – 消息传递的 TCP 端口(「tcp_port」配置通常设为 9000)。不要跟 http_port 混淆。
- user – 用于连接远程服务器的用户名。默认值:default。该用户必须有权限访问该远程服务器。访问权限配置在 users.xml 文件中。更多信息,请查看«访问权限»部分。
- password – 用于连接远程服务器的密码。默认值:空字符串。
- secure – 是否使用ssl进行连接,设为
true
时,通常也应该设置 port = 9440。服务器也要监听 <tcp_port_secure>9440</tcp_port_secure> 并有正确的证书。 - compression - 是否使用数据压缩。默认值:true。
数据分片配置:
internal_replication
-true
写操作只选一个正常的副本写入数据。如果分布式表的子表是复制表(*ReplicaMergeTree),请使用此方案。换句话说,这其实是把数据的复制工作交给实际需要写入数据的表本身而不是分布式表;false
(默认值)写操作会将数据写入所有副本。实质上,这意味着要分布式表本身来复制数据。这种方式不如使用复制表的好,因为不会检查副本的一致性,并且随着时间的推移,副本数据可能会有些不一样。分片是指包含数据不同部分的服务器(要读取所有数据,必须访问所有分片)。
副本是存储复制数据的服务器(要读取所有数据,访问任一副本上的数据即可)。
/etc/clickhouse-server/config.d
目录创建metrika.xml
/etc/clickhouse-server/config.d/metrika.xml
<yandex>
<!--ck集群节点-->
<remote_servers>
<test_ck_cluster>
<!--分片1-->
<shard>
<weight>1</weight>
<internal_replication>false</internal_replication>
<replica>
<host>10.10.7.143</host>
<port>9000</port>
<user>default</user>
<password></password>
<compression>true</compression>
</replica>
<replica>
<host>10.10.7.193</host>
<port>9000</port>
<user>default</user>
<password></password>
<compression>true</compression>
</replica>
</shard>
<!--分片2-->
<shard>
<weight>1</weight>
<internal_replication>false</internal_replication>
<replica>
<host>10.10.7.152</host>
<port>9000</port>
<user>default</user>
<password></password>
<compression>true</compression>
</replica>
<replica>
<host>10.10.7.101</host>
<port>9000</port>
<user>default</user>
<password></password>
<compression>true</compression>
</replica>
</shard>
</test_ck_cluster>
</remote_servers>
<!--zookeeper相关配置-->
<zookeeper>
<node index="1">
<host>10.10.7.143</host>
<port>2181</port>
</node>
<node index="2">
<host>10.10.7.193</host>
<port>2181</port>
</node>
<node index="3">
<host>10.10.7.152</host>
<port>2181</port>
</node>
</zookeeper>
<macros>
<replica>10.10.7.152</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> <!--压缩算法lz4压缩比zstd快, 更占磁盘-->
</case>
</clickhouse_compression>
</yandex>
上述配置中三个节点中不同的地方在于:
<macros>
<replica>10.10.7.XXX</replica>
</macros>
配置完成重启服务。
集群配置验证
select * from system.clusters;
可视化工具
官网地址,笔者使用DBeaver,大家可自行选择。
参考连接:
https://clickhouse.tech/docs/en/getting-started/tutorial/
https://clickhouse.tech/docs/en/engines/table-engines/special/distributed/
疑问点:
-
internal_replication
为true
时*ReplicaMergeTree
每个分片下面的副本数据不能复制?答:端口 9009 用于复制。防火墙需要开启9009
后续学习点:
- 分布式表分片方案目前使用rand(),后续学习了解其它分片方案。链接