使用docker搭建clickhouse

2 篇文章 0 订阅
1 篇文章 0 订阅

使用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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值