美文网首页clickhouse
clickhouse升级问题

clickhouse升级问题

作者: 定金喜 | 来源:发表于2023-01-17 14:31 被阅读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

    相关文章

      网友评论

        本文标题:clickhouse升级问题

        本文链接:https://www.haomeiwen.com/subject/wvgthdtx.html