使用docker搭建clickhouse
前言
本文使用 docker
快捷搭建 clickhouse
,参考资料来自于 dockerhub clickhouse-server,关于 clickhouse 配置文件的说明见官方文档。
集群
搭建
clickhouse
集群会用到zookeeper
,关于搭建zookeeper
可移步 使用docker搭建zookeeper集群
虚拟机
准备 4 台虚拟机,操作系统为 Ubuntu 18.04
,其中前三台已经安装 zookeeper
。
192.168.0.10
192.168.0.11
192.168.0.12
192.168.0.13
搭建
在三台服务器上分别拉取镜像
docker pull yandex/clickhouse-server
在三台服务器上分别创建挂载目录
mkdir -p /home/`whoami`/data/clickhouse
在 192.168.0.10
上执行,此步用于初次获取对应 clickhouse-server
的配置
mkdir /tmp/clickhouse
docker run -d --name clickhouse-test --ulimit nofile=262144:262144 --volume=/tmp/clickhouse:/var/lib/clickhouse yandex/clickhouse-server
# 将配置拷贝出来
sudo docker cp clickhouse-test:/etc/clickhouse-server/ /etc/clickhouse-server/
docker stop clickhouse-test
docker rm clickhouse-test
rm -rf /tmp/clickhouse
用户配置
延续上一步,修改 /etc/clickhouse-server/users.xml
文件,在 </default>
后添加如下内容,更多配置请参考 官方文档
<users>
<!-- 省略 -->
...
</default>
<!-- clickhouse自带default用户,但是该用户拥有所有权限且没有设置登陆密码和开启RBAC -->
<!-- 下方是要添加的内容 -->
<root>
<password>123456</password>
<access_management>1</access_management>
<networks incl="networks" replace="replace">
<ip>::/0</ip>
</networks>
<profile>default</profile>
<quota>default</quota>
</root>
<!-- 上方是要添加的内容 -->
</users>
如您不需要搭建集群,请直接跳转至 启动容器
集群模式配置
延续上一步,修改 /etc/clickhouse-server/config.xml
文件,搜索remote_servers
,此节点添加 incl="clickhouse_remote_servers"
属性,并在 <remote_servers>
前添加 <include_from>/etc/clickhouse-server/metrika.xml</include_from>
<!-- 新增一行 -->
<include_from>/etc/clickhouse-server/metrika.xml</include_from>
<!-- 新增 incl="clickhouse_remote_servers" 属性 -->
<remote_servers incl="clickhouse_remote_servers" >
...
</remote_servers>
<!-- 新增两行 -->
<zookeeper incl="zookeeper-servers" optional="true" />
<macros incl="macros" />
延续上一步,新建 /etc/clickhouse-server/metrika.xml
文件,添加如下内容
<yandex>
<!-- 集群配置 -->
<clickhouse_remote_servers>
<!-- 集群名称,自定义 -->
<cluster_2shards_2replicas>
<!-- 数据分片1 -->
<shard>
<internal_replication>false</internal_replication>
<replica>
<host>ch-server1</host>
<port>9000</port>
</replica>
<replica>
<host>ch-server2</host>
<port>9000</port>
</replica>
</shard>
<!-- 数据分片2 -->
<shard>
<internal_replication>false</internal_replication>
<replica>
<host>ch-server3</host>
<port>9000</port>
</replica>
<replica>
<host>ch-server4</host>
<port>9000</port>
</replica>
</shard>
<!-- 集群名称,自定义 -->
</cluster_2shards_2replicas>
</clickhouse_remote_servers>
<!-- zookeeper servers 配置 -->
<zookeeper-servers>
<node index="1">
<host>zoo-server1</host>
<port>2181</port>
</node>
<node index="2">
<host>zoo-server2</host>
<port>2181</port>
</node>
<node index="3">
<host>zoo-server3</host>
<port>2181</port>
</node>
</zookeeper-servers>
<!-- 每个实例此处不一致
官方: https://clickhouse.tech/docs/zh/engines/table-engines/mergetree-family/replication/
推荐: https://www.cnblogs.com/freeweb/p/9352947.html
-->
<macros>
<layer>01</layer>
<!-- partition of ClickHouse -->
<!-- 相同的 shard 配置相同的值 -->
<!-- 即 ch-server1 和 ch-server2 配置相同的值 -->
<!-- 即 ch-server3 和 ch-server4 配置相同的值 -->
<shard>01</shard>
<!-- 每个 server 都需要是唯一的值,规则可自行修改 -->
<replica>cluster01-01-1</replica>
<!-- 另外三个 server 值的示例
<replica>cluster01-01-2</replica>
<replica>cluster01-02-3</replica>
<replica>cluster01-02-4</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>
</case>
</clickhouse_compression>
</yandex>
延续上一步,分发修改完成的配置
scp -r /etc/clickhouse-server root@192.168.0.11:/etc/clickhouse-server
scp -r /etc/clickhouse-server root@192.168.0.12:/etc/clickhouse-server
scp -r /etc/clickhouse-server root@192.168.0.13:/etc/clickhouse-server
启动容器
分别在三台服务器,执行脚本
其中
hostname
的值需要根据实际情况修改
# ch-server1
docker run -d \
--name clickhouse-server \
--ulimit nofile=262144:262144 \
--volume=/home/`whoami`/data/clickhouse:/var/lib/clickhouse \
--volume=/etc/clickhouse-server/:/etc/clickhouse-server/ \
--add-host ch-server1:192.168.0.10 \
--add-host ch-server2:192.168.0.11 \
--add-host ch-server3:192.168.0.12 \
--add-host ch-server4:192.168.0.13 \
--add-host zoo-server1:192.168.0.10 \
--add-host zoo-server2:192.168.0.11 \
--add-host zoo-server3:192.168.0.12 \
--hostname ch-server1 \
-p 9000:9000 \
-p 8123:8123 \
-p 9009:9009 \
yandex/clickhouse-server
# ch-server2
docker run -d \
--name clickhouse-server \
--ulimit nofile=262144:262144 \
--volume=/home/`whoami`/data/clickhouse:/var/lib/clickhouse \
--volume=/etc/clickhouse-server/:/etc/clickhouse-server/ \
--add-host ch-server1:192.168.0.10 \
--add-host ch-server2:192.168.0.11 \
--add-host ch-server3:192.168.0.12 \
--add-host ch-server4:192.168.0.13 \
--add-host zoo-server1:192.168.0.10 \
--add-host zoo-server2:192.168.0.11 \
--add-host zoo-server3:192.168.0.12 \
--hostname ch-server2 \
-p 9000:9000 \
-p 8123:8123 \
-p 9009:9009 \
yandex/clickhouse-server
# ch-server3
docker run -d \
--name clickhouse-server \
--ulimit nofile=262144:262144 \
--volume=/home/`whoami`/data/clickhouse:/var/lib/clickhouse \
--volume=/etc/clickhouse-server/:/etc/clickhouse-server/ \
--add-host ch-server1:192.168.0.10 \
--add-host ch-server2:192.168.0.11 \
--add-host ch-server3:192.168.0.12 \
--add-host ch-server4:192.168.0.13 \
--add-host zoo-server1:192.168.0.10 \
--add-host zoo-server2:192.168.0.11 \
--add-host zoo-server3:192.168.0.12 \
--hostname ch-server3 \
-p 9000:9000 \
-p 8123:8123 \
-p 9009:9009 \
yandex/clickhouse-server
# ch-server4
docker run -d \
--name clickhouse-server \
--ulimit nofile=262144:262144 \
--volume=/home/`whoami`/data/clickhouse:/var/lib/clickhouse \
--volume=/etc/clickhouse-server/:/etc/clickhouse-server/ \
--add-host ch-server1:192.168.0.10 \
--add-host ch-server2:192.168.0.11 \
--add-host ch-server3:192.168.0.12 \
--add-host ch-server4:192.168.0.13 \
--add-host zoo-server1:192.168.0.10 \
--add-host zoo-server2:192.168.0.11 \
--add-host zoo-server3:192.168.0.12 \
--hostname ch-server4 \
-p 9000:9000 \
-p 8123:8123 \
-p 9009:9009 \
yandex/clickhouse-server
使用 docker logs -f clickhouse-server
查看容器日志,发现报错,详情如下,此错误由容器内 /etc/clickhouse-server
目录下文件权限问题引起
Processing configuration file '/etc/clickhouse-server/config.xml'.
std::exception. Code: 1001, type: std::__1::__fs::filesystem::filesystem_error, e.what() = filesystem error: in posix_stat: failed to determine attributes for the specified path: Permission denied [/etc/clickhouse-server/config.xml], Stack trace (when copying this message, always include the lines below):
0. std::__1::system_error::system_error(std::__1::error_code, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) @ 0x138e88e3 in ?
1. ? @ 0x13882f84 in ?
2. ? @ 0x13882c16 in ?
3. ? @ 0x1388da75 in ?
4. std::__1::__fs::filesystem::__status(std::__1::__fs::filesystem::path const&, std::__1::error_code*) @ 0x1388a45a in ?
5. DB::ConfigProcessor::processConfig(bool*, zkutil::ZooKeeperNodeCache*, std::__1::shared_ptr<Poco::Event> const&) @ 0xfb386f7 in /usr/bin/clickhouse
6. DB::ConfigProcessor::loadConfig(bool) @ 0xfb3ace4 in /usr/bin/clickhouse
7. BaseDaemon::reloadConfiguration() @ 0x87ae611 in /usr/bin/clickhouse
8. BaseDaemon::initialize(Poco::Util::Application&) @ 0x87b0212 in /usr/bin/clickhouse
9. DB::Server::initialize(Poco::Util::Application&) @ 0x86681d0 in /usr/bin/clickhouse
10. Poco::Util::Application::run() @ 0x11debb66 in /usr/bin/clickhouse
11. DB::Server::run() @ 0x866801d in /usr/bin/clickhouse
12. mainEntryClickHouseServer(int, char**) @ 0x8666e43 in /usr/bin/clickhouse
13. main @ 0x8603dcd in /usr/bin/clickhouse
14. __libc_start_main @ 0x270b3 in /usr/lib/x86_64-linux-gnu/libc-2.31.so
15. _start @ 0x85ce36e in /usr/bin/clickhouse
(version 21.1.2.15 (official build))
解决报错,需要在每台 server 节点执行
docker run -it \
--name clickhouse-test \
--ulimit nofile=262144:262144 \
--volume=/home/`whoami`/data/clickhouse:/var/lib/clickhouse \
--volume=/etc/clickhouse-server/:/etc/clickhouse-server/ \
--add-host ch-server1:192.168.0.10 \
--add-host ch-server2:192.168.0.11 \
--add-host ch-server3:192.168.0.12 \
--add-host ch-server4:192.168.0.13 \
--add-host zoo-server1:192.168.0.10 \
--add-host zoo-server2:192.168.0.11 \
--add-host zoo-server3:192.168.0.12 \
-p 9000:9000 \
-p 8123:8123 \
-p 9009:9009 \
yandex/clickhouse-server /bin/bash
# 进入 bash 命令行后执行
chown -R clickhouse:clickhouse /etc/clickhouse-server/
# 退出后,删除临时容器
docker rm clickhouse-test
启动 clickhouse-server
容器
docker restart clickhouse-server
验证
docker exec -it clickhouse-server bash
clickhouse-client -u root --password 123456
select * from system.clusters;
# 可以看到输出的列表中有 cluster_2shards_2replicas