k8s上的clickhouse集群部署并创建分布式表
部署总体参考:https://blog.csdn.net/tototuzuoquan/article/details/111305125
clickhouse的配置文件相关解读:https://www.cnblogs.com/zhoujinyi/archive/2004/01/13/12627780.html
流程简介:
- 制作
docker
镜像,添加一个脚本,来在每个机器上生成不同的macros.xml
,方便创建副本表。 - 创建
configmap
,data部分包含用于配置集群的remote_servers.xml
、用于连接zookeeper的zookeeper.xml
,这两个文件会被挂载在clickhouse的config.d
目录下,然后会覆盖config.xml
的相关内容;
data部分还包含users.xml
,用于设置用户的账号密码和可使用的内存,会覆盖到clickhouse的user.xml
中。 - 创建
statefulset
,docker使用yandex/clickhouse-server:19.11.3.11
,通过replicas
来设置副本数,要和remote_servers.xml
相对应,同时设置持久化卷的挂载。 - 创建
service
,在selector.app
中设置第二部的statefulset
,将spec.type
设置为ClusterIP
只在集群内使用,clusterIP
设置为None
,通过DNS解析service
名来访问。
制作docker镜像
参考:
- Linux设置值:https://www.cnblogs.com/newlangwen/p/7290541.html
- Linux中awk和substr:https://blog.csdn.net/CSNDRYL/article/details/77223144?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.control
步骤:在同一目录下创建macros.xml
、Dockerfile
、run.sh
,内容如下,目的是为了让每个机器的macros.xml
都不一样。
macros.xml:
此时都是一样的,docker启动后,使用脚本来改变值。
<yandex>
<macros replace="replace">
<shard>shard0</shard>
<replica>REPLICA_1</replica>
</macros>
</yandex>
Dockerfile:
FROM yandex/clickhouse-server:20.8
ADD ./macros.xml /etc/clickhouse-server/config.d/
ADD ./run.sh /opt
CMD ["sh","/opt/run.sh"]
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
run.sh:
- 第一句是设置一个值,在集群中可知
hostname
是clickhouse-0
、clickhouse-1
、clickhouse-2
这样的,awk
就是对前面echo
的值进行操作,substr
的第一个参数表示第一行,第二个参数表示位置,从第几个字符开始取,第三个参数表示取一个,所以就可以分别得到0 1 2
了。 - 第三句是替换文本内容,将
REPLICA_NAME
替换成replica$NODE_ID
。 - 第四句
gosu
,类似sudo
,用于启动命令
#!/bin/bash
NODE_ID=$(echo $(hostname) | awk '{print substr($0,length,1)}')
echo "NODE_ID is $NODE_ID"
sed -i "s/REPLICA_NAME/replica$NODE_ID/" /etc/clickhouse-server/config.d/macros.xml
gosu clickhouse:clickhouse /usr/bin/clickhouse-server --config=${CLICKHOUSE_CONFIG}
创建configmap
配置文件configd.yaml:
apiVersion: v1
kind: ConfigMap
metadata:
name: tt-test
namespace: te-sp-dev
labels:
app: tt-test
data:
remote_servers.xml: |-
<yandex>
<remote_servers incl="clickhouse_remote_servers">
<clicks_cluster>
<shard>
<internal_replication>true</internal_replication>
<replica>
<default_database>default</default_database>
<host>clickhouse-0.clickhouse</host>
<user>argus</user>
<password>root</password>
<port>9000</port>
</replica>
<replica>
<default_database>default</default_database>
<host>clickhouse-1.clickhouse</host>
<user>argus</user>
<password>root</password>
<port>9000</port>
</replica>
<replica>
<default_database>default</default_database>
<host>clickhouse-2.clickhouse</host>
<user>argus</user>
<password>root</password>
<port>9000</port>
</replica>
</shard>
</clicks_cluster>
</remote_servers>
<listen_host>0.0.0.0</listen_host>
<logger>
<level>error</level>
<log></log>
<errorlog></errorlog>
<console>1</console>
</logger>
<compression incl="clickhouse_compression">
<case>
<method>lz4</method>
</case>
</compression>
<distributed_ddl>
<path>/clickhouse/task_queue/ddl</path>
</distributed_ddl>
<macros replace="replace">
<shard>shard0</shard>
<replica>REPLICA_NAME</replica>
</macros>
</yandex>
zookeeper.xml: |-
<yandex>
<zookeeper incl="zookeeper-servers">
<node index="1">
<host>kafka-zk-zk-0.kafka-zk-hs.te-retail-senselink</host>
<port>2181</port>
</node>
<node index="2">
<host>kafka-zk-zk-1.kafka-zk-hs.te-retail-senselink</host>
<port>2181</port>
</node>
<node index="3">
<host>kafka-zk-zk-2.kafka-zk-hs.te-retail-senselink</host>
<port>2181</port>
</node>
</zookeeper>
</yandex>
users.xml: |-
<yandex>
<profiles>
<writer>
<max_memory_usage>1000000000</max_memory_usage>
<use_uncompressed_cache>0</use_uncompressed_cache>
<load_balancing>random</load_balancing>
</writer>
<reader>
<max_memory_usage