Clickhouse 单节点部署多个实例
Posted 福州-司马懿
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Clickhouse 单节点部署多个实例相关的知识,希望对你有一定的参考价值。
背景
有时候是因为测试需要,亦或是设备限制,我们需要在单节点上部署多个 clickhouse 实例
单节点单实例
首先回顾一下单节点单实例的部署方式
- 首先,在默认位置
/etc/metrika.xml
亦或是其它任意位置创建 metrika.xml - 然后编辑
/etc/clickhouse-server/config.xml
,配置 metrika.xml 的路径 - 使用
systemctl start clickhouse.service
命令启动 clickhouse 服务
单节点多实例
systemctl
命令的默认路径为 /etc/systemd/system
,可以看到这里有个 clickhouse-server.service
vim /etc/systemd/system/clickhouse-server.service
,可以看到,实际执行的命令是 /usr/bin/clickhouse-server --config=/etc/clickhouse-server/config.xml --pid-file=/run/clickhouse-server/clickhouse-server.pid
(pid文件是运行时动态生成的,用来记录进程id)
如果要在同一台机部署多个实例,只需要将 clickhouse-server.service
文件复制一份,然后修改它的配置文件路径即可。
我这里复制了2份,用作不同场景
- 单机单实例
clickhouse-server.service
- 1分片1副本
clickhouse-server-1z1s1r.service
- 2分片0副本
clickhouse-server-1z2s0r.service
cp /etc/systemd/system/clickhouse-server.service /etc/systemd/system/clickhouse-server-1z1s1r.service
cp /etc/systemd/system/clickhouse-server.service /etc/systemd/system/clickhouse-server-1z2s0r.service
然后,编辑文件,将其中的 config.xml
和 pid
也改为对应名称
vim /etc/systemd/system/clickhouse-server-1z1s1r.service
# 修改这一行
ExecStart=/usr/bin/clickhouse-server --config=/etc/clickhouse-server/config_1z1s1r.xml --pid-file=/run/clickhouse-server/clickhouse-server-1z1s1r.pid
vim /etc/systemd/system/clickhouse-server-1z2s0r.service
# 修改这一行
ExecStart=/usr/bin/clickhouse-server --config=/etc/clickhouse-server/config_1z2s0r.xml --pid-file=/run/clickhouse-server/clickhouse-server-1z2s0r.pid
然后,复制并修改出相应的 metrika.xml
然后,在 /etc/clickhouse-server
目录下,复制出相应的 config
文件,并对里面的 include_from
标签的值,作相应的修改
vim /etc/clickhouse-server/config_1z1s1r.xml
# 修改这一行
<include_from>/etc/clickhouse-server/metrika/metrika_1z1s1r.xml</include_from>
vim /etc/clickhouse-server/config_1z2s0r.xml
# 修改这一行
<include_from>/etc/clickhouse-server/metrika/metrika_1z2s0r.xml</include_from>
如果不同时启动,这样修改后就可以了。但如果要同时启动,还需修改以下3个地方
- 端口号(DBeaver 等数据库查询工具,连接 clickhouse 用的就是 http_port 端口。HTTP接口用于Perl、Python和Go。HTTP接口比原生接口受到更多的限制,但它具有更好的兼容性)
<http_port>8123</http_port>
<tcp_port>9000</tcp_port>
<mysql_port>9004</mysql_port>
<postgresql_port>9005</postgresql_port>
<interserver_http_port>9009</interserver_http_port>
2. 数据目录
<path>/var/lib/clickhouse/</path>
<tmp_path>/var/lib/clickhouse/tmp</tmp_path>
<user_files_path>/var/lib/clickhouse/user_files</user_files_path>
3. 日志目录
<log>/var/log/clickhouse-server/clickhouse-server.log</log>
<errorlog>/var/log/clickhouse-server/clickhouse-server.err.log</errorlog>
- 集群配置信息
<users_config>users.xml</users_config>
<include_from>/etc/metrika8201.xml</include_from>
故障排查
可能会遇到启动失败,232/ADDRESS_FAMILIES
● clickhouse-server.service - ClickHouse Server (analytic DBMS for big data)
Loaded: loaded (/etc/systemd/system/clickhouse-server.service; enabled; vendor preset: disabled)
Active: activating (auto-restart) (Result: exit-code) since Sat 2021-11-27 07:07:11 EST; 25s ago
Process: 1895 ExecStart=/usr/bin/clickhouse-server --config=/etc/clickhouse-server/config.xml --pid-file=/run/clickhouse-server/clickhouse-server.pid (code=exited, status=232/ADDRESS_FAMILIES)
Main PID: 1895 (code=exited, status=232/ADDRESS_FAMILIES)
journalctl
可以查看所有的系统日志文件,如果不带参数,将显示所有日志。-u
表示仅查看某个服务的日志。因此这里使用journalctl -u clickhouse-server
查看日志。
注意:有人会说也可以查看 config.xml 里面配置的这个日志 /var/log/clickhouse-server/clickhouse-server.err.log
。我把它删了,然后多次重启发现,启动失败时,该文件并不会被创建。我又试了手动创建该文件,依旧无数据被记录。然后还将 own 和 group 都设置成原本的 clickhouse,依旧没数据。因此,启动失败的原因不会被记录到该日志中
从上面的错误日志中,可以看出是访问被拒绝了。使用 ls -l /etc/clickhouse-server
查看文件,发现由于当前为 root 用户,因此复制后的文件,所有者和用户组都为当前root用户,而其它用户没有访问权限,因此上面提示 FileAccessDeniedException
使用如下命令,将创建用户和用户组都改为clickhouse。然后查看clickhouse-server状态,可以发现已经启动成功了
cd /etc/clickhouse-server
chown clickhouse *
chgrp clickhouse *
ls -l
systemctl status clickhouse-server.service
另外,如果有集群,禁用掉其它无用机器上,clickhouse 的开机启动 systemctl disable clickhouse
,也可帮助避免干扰,帮助更好的排查问题
以上是关于Clickhouse 单节点部署多个实例的主要内容,如果未能解决你的问题,请参考以下文章
clickhouseclickhouse 副本与分片 副本详解
在Ubuntu20.04安装单节点ClickHouse22.8.4并解决DB::NetException: Connection refused NETWORK_ERROR导致无法远程访问的问题
在Ubuntu20.04安装单节点ClickHouse22.8.4并解决DB::NetException: Connection refused NETWORK_ERROR导致无法远程访问的问题