clickhouse

clickhouse升级问题

2023-01-17  本文已影响0人  定金喜

最近需要将clickhouse服务器从20.4.5.36版本升级到22.10.2.11版本,在升级的过程中遇到一些问题,特意写篇文章和大家交流下

1.升级步骤

1.停止clickhouse容器
先将使用的clickhouse所有容器停止,因为容器在运行会不停造数据,没法做到无损迁移
docker stop clickhouse-server
2.备份原来数据
如果原来挂载的数据目录是/home/admin/data/clickhouse,可以新建目录/home/admin/data/clickhouse2022,将clickhouse所有数据拷贝到clickhouse2022。
cp -r /home/admin/data/clickhouse/* /home/admin/data/clickhouse2022
原因:升级有风险,所以数据备份是必要的,因为升级是不可逆的,没法进行降级,分成两个目录,当升级失败时,至少老数据是不受影响的。
3.先升级到中间版本
直接升级到新版本会出现报错,启动不了,按照官方的建议是升级到一个中间版本(中间版本和最终版本相差不要超过1年),经过调研,21.11.2.2版本比较合适,所以先升级到此版本

docker run --restart=always \
           --name clickhouse-server-2021 \
           -v /home/admin/data/clickhouse2022:/var/lib/clickhouse \
           -d \
           --ulimit nofile=262144:262144  \
           -p 8123:8123  \
           clickhouse/clickhouse-server:21.11.2.2

升级成功后,等待初始化完成后(怎么判断是否初始化完成见注意事项),停止和删除容器

docker stop clickhouse-server-2021
docker rm clickhouse-server-2021

4.升级到新版本

docker run --restart=always \
           --name clickhouse-server-2022 \
           -v /home/admin/data/clickhouse2022:/var/lib/clickhouse \
           -d \
           --ulimit nofile=262144:262144  \
           -p 8123:8123  \
          clickhouse/clickhouse-server:22.10.2.11

注意:初始化过程中千万不要对容器进行停止,重启等操作,会破坏初始化流程,导致数据被破坏。
5.配置文件修改
进入clickhouse容器,根据具体业务修改config.xml和users.xml的配置值,也可以把其挂载出来修改,修改后重启容器

6.清理老数据(慎重,可以等一段时间观察再决定是否清理)
如果升级成功,数据无问题,可以将老的clickhouse删除,对应的/home/admin/data/clickhouse可以删除
docker rm clickhouse-server
rm -rf /home/admin/data/clickhouse

2.升级注意事项

1.数据备份前确认下磁盘空间是否足够

先确认原始数据大小和磁盘剩余空间大小,如果不够,需要扩容

2.升级到每个版本时,必须等初始化完成后才能进行stop等别的操作

一般升级到某个版本后,需要等3-5分钟才能初始化完成(可能与数据量有关系,数据量小可能比较短),确认是否初始化完成,可以进入容器目录/var/log/clickhouse-server,tail -f clickhouse-server.log

image

如果每隔1-2秒打印这样的数据,说明初始化已经完成,才可以停止容器进行接下来的升级。

3.数据回退方案

1.如果升级失败,需要回退到老版本,则停止掉新容器,重启老容器即可;

2.如果升级了一段时间后,发现重大问题需要回退,则需要将增量数据(或者全量数据覆盖)从LTS版本迁移到老版本,然后使用老的ck;还可以采用双写策略,新库和老库都同时写入,如果新库遇到问题,随时切换到老库,不需要做数据迁移,但是数据需要写两份,线上部署两个clickhouse服务,当业务不复杂代码改动不太大时可以考虑此方案

3.升级中的报错

1.system目录有问题


当直接从老版本通过挂载目录的方式直接升级到新版本时,会偶现该问题(当ck数据量较大时会出现),说明system库没有初始化成功,当通过中间版本过度升级,不会遇到该问题

2.url校验报错导致启动失败

2023.01.09 09:23:11.175168 [ 1 ] {} <Error> Application: Caught exception while loading metadata: Code: 36. DB::Exception: Bad hdfs url: s3a://alibaba-store/alibaba-store/table_cache/demo/h3f35eaaa4d004d348772bf9/part-00000-5b7579c2-9e54-448c-aaac-62857e64ace5-c000.snappy.parquet. It should have structure 'hdfs://<host_name>:<port>/<path>': Cannot attach table alibaba.h3f35eaaa4d004d348772bf9_0 from metadata file /var/lib/clickhouse/metadata/alibaba/h3f35eaaa4d004d348772bf9_0.sql from query ATTACH TABLE alibaba.h3f35eaaa4d004d348772bf9_0 (Order_Id Nullable(String), Member_Id Nullable(Int64), Itemnum Nullable(Int64), Createtime Nullable(DateTime), Cost_Item Nullable(Float64), Total_Amount Nullable(Float64), Pmt_Amount Nullable(Float64), Shipping_Area Nullable(String)) ENGINE = HDFS('s3a://alibaba-store/alibaba-store/table_cache/demo/h3f35eaaa4d004d348772bf9/part-00000-5b7579c2-9e54-448c-aaac-62857e64ace5-c000.snappy.parquet', 'Parquet'): while loading database alibaba from path /var/lib/clickhouse/metadata/alibaba. (BAD_ARGUMENTS), Stack trace (when copying this message, always include the lines below):

这个是因为创建表结构时设置的url错误,打开这个sql文件

ATTACH TABLE h3f35eaaa4d004d348772bf9_0
(
    `Order_Id` Nullable(String), 
    `Member_Id` Nullable(Int64), 
    `Itemnum` Nullable(Int64), 
    `Createtime` Nullable(DateTime), 
    `Cost_Item` Nullable(Float64), 
    `Total_Amount` Nullable(Float64), 
    `Pmt_Amount` Nullable(Float64), 
    `Shipping_Area` Nullable(String)
)
ENGINE = HDFS('s3a://alibaba-store/alibaba-store/table_cache/demo/h3f35eaaa4d004d348772bf9/part-00000-5b7579c2-9e54-448c-aaac-62857e64ace5-c000.snappy.parquet', 'Parquet');

将这个ENGINE配置的url修改为:
HDFS('hdfs://alibaba-store/alibaba-store/table_cache/demo/h3f35eaaa4d004d348772bf9/part-00000-5b7579c2-9e54-448c-aaac-62857e64ace5-c000.snappy.parquet', 'Parquet');
或者
S3('s3a://alibaba-store/alibaba-store/table_cache/demo/h3f35eaaa4d004d348772bf9/part-00000-5b7579c2-9e54-448c-aaac-62857e64ace5-c000.snappy.parquet', 'Parquet');

将报错的sql修改成后重启容器

原因:新版本增加了url格式校验,老版本是没有这个校验的,所以对于错误的url,校验失败后会阻塞启动

参考文章:
1.升级参考
https://clickhouse.com/docs/en/operations/update/
2.报错参考
https://github.com/ClickHouse/ClickHouse/issues/45090

上一篇下一篇

猜你喜欢

热点阅读