从0开始搭建ClickHouse高可用集群

ClickHouse简介

Clickhouse是一个用于联机分析处理(OLAP)的列式数据库管理系统(columnar DBMS)。

ClickHouse应用场景

  1. 绝大多数请求都是用于读访问的
  2. 数据需要以大批次(大于1000行)进行更新,不是单行更新;或者根本没有更新操作
  3. 数据只是添加到数据库,没有必要修改
  4. 读取数据时,会从数据库中提取出大量的行,但只用到一小部分列
  5. 表很‘宽’,即表中包含大量的列
  6. 查询频率相对较低(通常每台服务器每秒查询数百次或更少)
  7. 对于简单查询,允许大约50毫秒的延迟
  8. 列的值是比较小的数值和短字符串(例如,每个URL只有60个字节)
  9. 在处理单个查询时需要高吞吐量(每台服务器每秒>高达数十亿行)
  10. 不需要事务
  11. 数据一致性要求较低
  12. 每次查询中只会查询一个大表。除了一个大表,其余都是小表
  13. 查询结果显著小于数据源。即数据有过滤或聚合。返回结果不超过单个服务器内存大小

ClickHouse的限制

  1. 不支持真正的删除、更新支持 不支持事务(期待后续版本支持)
  2. 不支持二级索引
  3. 有限的SQL支持,join实现与众不同
  4. 不支持窗口功能
  5. 元数据管理需要人工干预维护

环境及目标

作者采用centOS 7 进行环境搭建,首先安装一台虚拟机,下载安装ClickHouse+zookeeper之后进行虚拟机克隆,最终完成ClickHouse集群环境配置、搭建。

安装虚拟机

虚拟机网络设置-桥接

虚拟机网络设置

设置网络,连接外网

  1. 进入要修改网络相关的配置文件目录
cd /etc/sysconfig/network-scripts/
  1. ls目录找到ifcfg-eth**文件
网络设置目录
  1. vi ifcfg-ens33设置ONBOOT=yes:wq保存并退出
ONBOOT=yes
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方式安装

  1. yum方式安装wget
yum -y install wget
  1. 创建/opt 文件夹:
mkdir -p /apps
  1. 进入到 /opt 目录中:
cd /apps
  1. 下载 zookeeper-3.4.9.tar.gz:
wget https://archive.apache.org/dist/zookeeper/zookeeper-3.4.9/zookeeper-3.4.9.tar.gz
  1. 解压缩 zookeeper-3.4.9.tar.gz:
tar -zxvf zookeeper-3.4.9.tar.gz
  1. 进入到 /usr/local/services/zookeeper/zookeeper-3.4.9/conf 目录中:
cd zookeeper-3.4.9/conf/
  1. 复制 zoo_sample.cfg 文件的并命名为为 zoo.cfg:
cp zoo_sample.cfg zoo.cfg
  1. 编辑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
  1. 创建相关目录
mkdir -p /apps/zookeeper-3.4.9/data/zookeeper
mkdir -p /apps/zookeeper-3.4.9/log/zookeeper
  1. 设置myid
vim /apps/zookeeper-3.4.9/data/zookeeper/myid # 三个节点各配置为1/2/3
  1. 进入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下的配置文件。

  1. 编辑config.xml
vim /etc/clickhouse-server/config.xml

<include_from>/etc/clickhouse-server/config.d/metrika.xml</include_from> <!--添加该参数-->
  1. 配置集群节点

简单介绍一下配置关键字,可以参考ClickHouse官网

每个服务器需要指定 hostport,和可选的 userpasswordsecurecompression 的参数:

  • 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/

疑问点:

  1. internal_replicationtrue*ReplicaMergeTree每个分片下面的副本数据不能复制?

    答:端口 9009 用于复制。防火墙需要开启9009

    端口复制

后续学习点:

  1. 分布式表分片方案目前使用rand(),后续学习了解其它分片方案。链接
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容