clickhouse升级问题
最近需要将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 databasealibaba
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