大家好,上次给大家分享LS同学根据亲身经历整理的一篇关于搭建ClickHouse集群的文章上篇(原创 | ClickHouse初体验之集群搭建指南(上))。
上篇文章主要讲述ClickHouse之3节点3分片1副本的集群搭建过程,本篇文章将介绍3节点3分片2副本的搭建过程,相当于一台机器起了两个 ClickHouse 的服务,因此在配置文件中,我们需要通过修改配置文件、修改端口和集群配置来达到这种需求。
希望对大家有帮助,特别是CK初学者。
一、准备工作
二、修改配置文件
在BD-P-GP01机器创建并修改config9001.xml
,并且修改配置文件
[root@BD-P-GP01 clickhouse-server]# cp /etc/clickhouse-server/config.xml /etc/clickhouse-server/config9001.xml [root@BD-P-GP01 clickhouse-server]# vim /etc/clickhouse-server/config9001.xml <?xml version="1.0"?> <!-- CH的config是热部署的 --> <clickhouse> <!-- 端口配置 --> <http_port>8124</http_port> <tcp_port>9001</tcp_port> <interserver_http_port>9010</interserver_http_port> <!-- 端口配置,因为涉及到一台机器起两个服务,存在端口冲突,需要注释掉 --> <!--mysql_port>9004</mysql_port--> <!--postgresql_port>9005</postgresql_port--> <!--日志存储修改--> <log>/var/log/clickhouse-server/clickhouse-server-9001.log</log> <errorlog>/var/log/clickhouse-server/clickhouse-server-9001.err.log</errorlog> <!--取消该注释,开启远程访问--> <listen_host>::</listen_host> <!-- 指定数据存储路径 --> <path>/data2/clickhouse/</path> <tmp_path>/data2/clickhouse/tmp/</tmp_path> <!-- user_files_path:包含用户文件的目录,在表函数file()中使用。--> <user_files_path> /data2/clickhouse/user_files/ </user_files_path> <!--用来存储创建的用户和角色--><access_control_path>/data2/clickhouse/access/</access_control_path><!--包含输入格式文件--><format_schema_path>/data2/clickhouse/format_schemas/<format_schema_path><!-- 远程服务器,分布式表引擎和集群表功能使用的集群的配置 --> <remote_servers incl="clickhouse_remote_servers" /> <distributed_ddl> <!-- 在ZooKeeper中与DDL查询队列的路径 --> <path>/clickhouse/task_queue/ddl</path> </distributed_ddl> <!-- zk启动 --> <zookeeper incl="zookeeper-servers" optional="true" /> <!-- 启动macros,并指定地址 --> <macros incl="macros" optional="true" /> <!--引入metrika.xml--> <include_from>/etc/clickhouse-server/config.d/metrika9001.xml</include_from></clickhouse> |
修改完成之后分发到其他2台机器,BD-P-GP02,BD-P-GP03
在BD-P-GP01机器创建并修改metrica9001.xml
,并且修改配置文件:
[root@BD-P-GP01 clickhouse-server]# cp /etc/clickhouse-server/config.d/metrica.xml /etc/clickhouse-server/config.d/metrica9001.xml [root@BD-P-GP01 clickhouse-server]# vim /etc/clickhouse-server/config.d/metrica9001.xml <?xml version="1.0"?> <clickhouse> <!--新版的clickhouse集群的首个标签必须是clickhouse,而不是yandex --> <!-- 集群配置 --> <clickhouse_remote_servers> <!-- 集群名称,确保和config.xml中的<remote_servers incl="clickhouse_remote_servers" /> 的incl的中的参数一致--> <perftest_3shards_1replicas> <shard> <!-- 建议一个台机器一个节点,避免资源争夺 --> <!-- 表示是否只将数据写入其中一个副本,默认为false,表示写入所有副本,在复制表的情况下可能会导致重复和不一致,所以这里一定要改为true。--> <internal_replication>true</internal_replication> <!-- 副本配置,ch没有主备之分 --> <replica> <host>BD-P-GP01</host> <port>9000</port> <user>default</user> <password>root</password> </replica> <replica> <host>BD-P-GP02</host> <port>9001</port> <user>default</user> <password>root</password> </replica> </shard> <shard> <internal_replication>true</internal_replication> <replica> <host>BD-P-GP02</host> <port>9000</port> <user>default</user> <password>root</password> </replica> <replica> <host>BD-P-GP03</host> <port>9001</port> <user>default</user> <password>root</password> </replica> </shard> <shard> <internal_replication>true</internal_replication> <replica> <host>BD-P-GP03</host> <port>9000</port> <user>default</user> <password>root</password> </replica> <replica> <host>BD-P-GP01</host> <port>9001</port> <user>default</user> <password>root</password> </replica> </shard> </perftest_3shards_1replicas> </clickhouse_remote_servers> <!-- 本节点副本名称replica,配置后能方便后续创建复制表时不用指定zk路径,每台机器的配置不一样,确保和每台机器的host名称一致 --> <macros> <shard>03</shard> <replica>BD-P-GP01</replica> </macros> <!-- ZK配置 --> <zookeeper-servers> <node index="1"> <host>zk1</host> <port>2181</port> </node> <node index="2"> <host>zk2</host> <port>2181</port> </node> <node index="3"> <host>zk3</host> <port>2181</port> </node> </zookeeper-servers> <!-- 数据压缩算法配置 --> <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> </clickhouse> |
修改完成之后分发到其他2台机器,BD-P-GP02,BD-P-GP03
BD-P-GP01的节点的配置:
<macros> <shard>01</shard> <replica>BD-P-GP01</replica> </macros>
|
<macros> <shard>03</shard> <replica>BD-P-GP01</replica> </macros> |
BD-P-GP02的节点的配置:
<macros> <shard>02</shard> <replica>BD-P-GP02</replica> </macros> |
<macros> <shard>01</shard> <replica>BD-P-GP01</replica> </macros> |
BD-P-GP03的节点的配置:
<macros> <shard>03</shard> <replica>BD-P-GP03</replica> </macros> |
<macros> <shard>02</shard> <replica>BD-P-GP03</replica> </macros> |
修改启动文件:
[root@BD-P-GP01 clickhouse-server]# cp /etc/rc.d/init.d/clickhouse-server /etc/rc.d/init.d/clickhouse-server-9001 [root@BD-P-GP01 clickhouse-server]# vim /etc/rc.d/init.d/clickhouse-server-9001 |
修改内容:
CLICKHOUSE_CONFIG=$CLICKHOUSE_CONFDIR/config9001.xmlCLICKHOUSE_PIDFILE="$CLICKHOUSE_PIDDIR/$PROGRAM-9001.pid" |
修改完成之后分发到其他2台机器,BD-P-GP02,BD-P-GP03
修改systemctl启动配置文件:
[root@BD-P-GP01 clickhouse-server]# cd /etc/systemd/system [root@BD-P-GP01 clickhouse-server]# cp clickhouse-server clickhouse-server-9001 [root@BD-P-GP01 clickhouse-server]# vim clickhouse-server-9001 |
修改完成之后分发到其他2台机器,BD-P-GP02,BD-P-GP03
三、验证集群
启动集群,每台机器都执行
[root@BD-P-GP01 clickhouse-server]# systemctl restart clickhouse-server [root@BD-P-GP01 clickhouse-server]# systemctl restart clickhouse-server-9001 |
查看服务状态
[root@BD-P-GP01 clickhouse-server]# systemctl status clickhouse-server [root@BD-P-GP01 clickhouse-server]# systemctl status clickhouse-server-9001 |
查看端口情况
[root@BD-P-GP01 clickhouse-server]# netstat -antup | grep clickhouse |
查看clickhouse的系统表验证集群是否成功
[root@BD-P-GP01 clickhouse-server]# clickhouse-client --port 9001 --password 'root' -m |
四、创建复制表和分布式表
创建复制表:
CREATE TABLE default.test_32r_local on perftest_3shards_2replicas ( `id` Int32, `website` String, `wechat` String, `FlightDate` Date, `Year` UInt16 ) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/test_32r_local', '{replica}', FlightDate, (Year, FlightDate), 8192) CREATE TABLE test_32r_allAS cluster32r_local ENGINE = Distributed(perftest_3shards_2replicas , default, test_32r_local, rand()); |
五、问题和解决方案
配置文件问题
clickhouse9001在启动时在config.d下的·config9001.xml,metrica9001.xml
,对于这些文件的引用问题
这个地方是挺坑的,官网上写到了对config.d
中的文件引用是include
但是对于集群和分片的配置信息这个点没有很好的描述清楚导致我们大部分的时间都在解决配置文件的问题。
日志报错信息
<Error> Application: DB::Exception: Listen [::]:9005 failed: Poco::Exception. Code: 1000, e.code() = 98, Net Exception: Address already in use: [::]:9005 (version 22.2.2.1) |
因为在一台机器启动两个实例,导致端口冲突,因为在config.xml和config9001.xml中对于mysql_ports和postgresql_ports中的引用的端口相同,这个要在config9001.xml中把改配置项改掉,此处我选择直接把这个注释掉。
报错
Code: 371. DB::Exception: DDL task query-0000000012 contains current host zk1:9001 in cluster perftest_3shards_2replicas, but there is no such cluster here. |
配置的问题导致9001的端口的服务没有真正的进入到集群中报错
在这期间遇到的最多的报错,其中通过进入到/data2/clickhouse/preprocessed_configs
然后查看config9001.xml
查看启动文件是否真正的把metrica9001.xml
中配置的关于集群的信息被引用
问题4:
SQL 错误 [1002]: ClickHouse exception, code: 1002, host: 10.2.98.131, port: 8123; Code: 159. DB::Exception: Watching task /clickhouse/task_queue/ddl/query-0000000014 is executing longer than distributed_ddl_task_timeout (=180) seconds. There are 3 unfinished hosts (0 of them are currently active), they are going to execute the query in background. (TIMEOUT_EXCEEDED) (version 22.2.2.1) |
执行ddl
会出现如上报错,可能原因是docker的hosts与宿主机hosts的问题
因为前面zk的安装和ck的安装都在同一个机器,所以在引用hostname时,我给了zk1,zk2,zk3,后面把这个改成 机器对应的原始的hostname ,这个问题解决了
在机器上执行hostname,查看机器对应的原hostname
遇到解决不了的问题,建议尽量看源码和日志去定位问题。
我们在其中启动中,服务的端口一直是启动成功的,但是就是无法获取创建复制表,然后到 9001端口的服务中,查看系统表一直没有出现集群信息perftest_3shards_2replicas
后面通过阅读源码,查看到我们在配置metrica.xml和metrica9001.xml的其中一个参数不同,9001中配置的remote_servers,但是metrica.xml中配置的是remote_servers_clickhouse,在config.xml中的include文件中的这个参数不对,导致没有加入到同一个集群。