02-Windows DockerDesktop部署ClickHouse,解决指定磁盘数据持久化问题与WSL2调优

如何解决Docker-Deskto上ClickHouse的数据持久化问题

问题背景

Docker-Desktop 版本:4.29.0

受实际硬件条件影响,用于部署数据服务的工作站为Windows11专业版,其中包含两块SSD:

复制代码
- c盘,操作系统、公共软件的安装,如Docker-Desktop、Navicat...
- d盘,高IO软件、服务的安装部署(磁盘空间大),如PostgreSQL、MySQL...

ClickHouse容器/服务的数据存储/var/lib/clickhouse目录下,往往应用通过Docker化部署时,针对数据部分会执行持久化配置以保证数据的安全性,例如通过宿主机的目录挂载、或者Docker卷(Volume)等形式。

在采用目录挂载的方式时,只需要在docker-compose中指定持久化映射的数据目录即可,例如

./vl-clickhouse/data:/var/lib/clickhouse(其中docker-compose编排配置在指定的目录,如d盘

但ClickHouse内部对数据组织往往是针对文件的一系列操作,因此当通过目录挂载进行数据持久化时,执行数据导入往往会出现权限问题,如:

bash 复制代码
Received exception from server (version 23.8.16): Code: 1001. DB::Exception: Received from localhost:9000. DB::Exception: std::__1::__fs::filesystem::filesystem_error: filesystem error: in rename: Permission denied ["/var/lib/clickhouse/store/732/732539d3-dd89-49d0-8fea-510019cd8315/tmp_insert_202505_67_67_0/"] ["/var/lib/clickhouse/store/732/732539d3-dd89-49d0-8fea-510019cd8315/202505_34_34_0/"]. (STD_EXCEPTION)

也就是说,无法通过简单的宿主机的目录挂载实现ClickHouse数据的持久化。

解决方案

核心思想 ClickHouse dataDocker VolumeWSL2 ext4 。Docker 用于存储数据的 docker-desktop-data(WSL2)` 整个发行版放在 D 盘。首先查看一下当前的wsl发行版实例有哪些:

bash 复制代码
C:\Users\billy>wsl -l -v
  NAME                   STATE           VERSION
* docker-desktop         Stopped         2
  docker-desktop-data    Stopped         2
  ubuntu2204_1 

docker-desktop

(1)Docker引擎本体,运行dockerdcontainerd、网络、cgroup,本质上是Docker的"操作系统"。

(2)由Docker-Desktop自动创建、管理,不要登录、修改!

docker-desktop-data

(1)Docker的"硬盘/数据盘",存放了Docker volumes、容器的writable layer、镜像层数据。

(2)是一个ext4.vhdx,当Docker-Desktop安装后,默认在C盘

具体操作过程:

  1. 停止Docker DesktopWSL2
bash 复制代码
wsl --shutdown
  1. 导出用于存储Docker数据的WSL2发行版docker-desktop-data
bash 复制代码
wsl --export docker-desktop-data D:\wsl\docker-desktop-data.tar
  1. 注销原来的发行版
bash 复制代码
wsl --unregister docker-desktop-data
  1. D盘重新导入
bash 复制代码
wsl --import docker-desktop-data D:\wsl\docker-desktop-data D:\wsl\docker-desktop-data.tar --version 2
  1. 启动Docker Desktop
  2. 使用 Docker Volume`替换原本的目录挂载
yaml 复制代码
services:
  clickhouse:
    volumes:
    # 数据目录通过volume卷映射
      - clickhouse_data:/var/lib/clickhouse

# 定义volume
volumes:
  clickhouse_data:

这样数据会存储在docker的内部Linux文件系统中(即在d盘的docker-desktop-data这个WSL2发行版中)

随着Docker-Desktop版本的升级,以4.48.0版本为例,使用wsl -l -v命令你会发现docker-deskto-data这项WSL发行版实例没有了。原因是Docker-Desktop对其进行了升级,可以通过设置项 → Resources → Advanced选择Disk Image location(磁盘镜像位置),此配置会决定数据存储位置。

点击Browse选择指定磁盘、目录后,数据会自动进行迁移,相比上面的发行版迁移更加简便。

WSL2调优,贴近生产模式

Windows上使用Docker,不论从性能、资源使用上都不是最优解(相对于Linux环境),默认安装好的WSL2,其对资源是"能吃就吃",容器则是"能用则用",因此会看到控制台中有关WSL的内存占用飙升。因此需要从WSL2Docker-Desktop容器(ClickHouse)三个层面进行配置优化,使更贴近生产环境。解决思路: 上游限死,下游按比例给 。


WSL2,设置 WSL2 全局内存 / CPU 上限,操作步骤:

  1. Windows 用户目录 新建/修改 C:\Users\billy\.wslconfig
  2. 关闭Docker、WSL2wsl --shutdown
  3. 重启生效

针对开发环境(开发机)的建议配置:

nginx 复制代码
[wsl2]
memory=4GB        # 给 WSL2 的硬上限
processors=4      # CPU 核心数(按你实际 CPU 调)
swap=8GB           # 防止 OOM
swapFile=D:\\wsl\\wsl-swap.vhdx

关键参数:

  1. memory:WSL2 可使用的最大物理内存上限
    • 不配置时(默认行为):WSL2按需增长,用多少就拿多少,使用后也不会主动还给Windows
    • 配置后:如设为16GB,WSL2最多只能用16GB,超过后会触发Linux reclaimswap,极端情况会出现OOM
    • 典型表现:比如VmmemWSL一路涨到30G+,即使ClickHouse容器空闲了,也没有释放
  2. processors:WSL2 可见的最大 CPU 核心数
    • 不配置时(默认行为):WSL2会看到全部CPU,ClickHouse会开启大量线程,merge/insert时并行拉满
    • 配置后:WSL2 里 nproc = 16,ClickHouse system.settings.max_threads 受影响,同时Windows 桌面不会被卡死
    • 典型表现:给太高,merge时会抢CPU;给合理,吞吐稳定
  3. swap:WSL2 的交换空间大小(Linux swap)
    • 不配置时(默认行为):大小不好固定、位置不可控、不好观察
    • 配置后:当内存不足时,内核会把冷数据 swap 出去;防止ClickHouse merge OOM,容器被直接 kill。
    • 典型表现:无swap,merge直接OOM;有swap,merge慢,但不会挂掉
  4. swapFile:指定 swap 文件存放位置
    • 不配置时(默认行为): 默认存在C:\Users\xxx\AppData\Local\Temp,C 盘空间会逐步被占用
相关推荐
公子小六4 小时前
基于.NET的Windows窗体编程之WinForms音频控件
windows·microsoft·c#·.net·音视频·winforms
诸神缄默不语7 小时前
如何在Win11系统中找到是哪个程序占用了指定端口
windows
FL162386312910 小时前
Halcon26.05下载安装教程
windows
ly768910 小时前
Windows 操作系统详解:从系统架构、文件管理到安全与运维
windows·安全·系统架构
2601_9623649710 小时前
踩坑提醒!带摄像头≠支持 Windows Hello 人脸解锁
windows
码农爱学习12 小时前
ClaudeCode搭配DeepSeek在Windows和Linux中的安装教程
linux·运维·windows
WA内核拾荒者1 天前
WhatsApp账号运营SOP的可视化编排与流水线监控
大数据·数据库·windows
Java小白笔记1 天前
Windows系统免软件命令激活
java·网络·人工智能·windows·ai·ai编程
IT小盘1 天前
17-AI应用防止越权访问知识库
服务器·网络·windows
rust&python1 天前
通达信量化tdxquant快速开始第一个策略
windows·量化·通达信·tdxquant