ClickHouse Windows迁移方案与测试

我想将开源软件Clickhouse的主程序和附属程序迁移到Windows平台,目前它只能在Linux上运行,让它可以在Windows 11和Windows Server 2025上运行,这需要考虑Linux操作系统和Windows操作系统的差异,请列举出将Clickhouse在Linux系统上运行的GCC的C++代码修改为在Windows系统上运行的GCC的C++代码需要修改的功能点和所在的模块以及具体函数的实现,并列举出这些修改代码对应的单元测试、集成测试、系统测试和验收测试的测试用例以及测试步骤和测试策略。

将 ClickHouse 从 Linux 迁移到 Windows 需要解决多个核心差异点。以下是关键修改点、对应模块/函数及测试方案:


一、核心功能修改点

1. 文件系统路径处理
  • 模块 :src/Common/FileSystem.*, src/IO/ReadWriteBuffer.*

  • 修改内容 :

    • 替换所有硬编码的 / 为 std::filesystem::path::preferred_separator
    • 处理盘符(如 C:\)和 UNC 路径(\\server\share)
    cpp 复制代码
    // 修改前
    std::string path = "/data/clickhouse";
    // 修改后
    fs::path path = fs::path("C:") / "clickhouse" / "data";
2. 进程/线程管理
  • 模块 :src/Common/ThreadPool.*, src/Server/Server.*

  • 修改内容 :

    • 替换 fork() 为 Windows 进程 API(CreateProcess)
    • 线程局部存储改用 __declspec(thread) 代替 __thread
    cpp 复制代码
    // Windows 进程创建示例
    STARTUPINFO si = { sizeof(si) };
    PROCESS_INFORMATION pi;
    CreateProcess(NULL, "clickhouse-server.exe", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
3. 信号处理
  • 模块 :src/Common/SignalHandler.*

  • 修改内容 :

    • 替换 sigaction() 为 Windows 的 SetConsoleCtrlHandler()
    cpp 复制代码
    BOOL WINAPI CtrlHandler(DWORD fdwCtrlType) {
      if (fdwCtrlType == CTRL_C_EVENT) Shutdown(); // 自定义关闭逻辑
      return TRUE;
    }
    SetConsoleCtrlHandler(CtrlHandler, TRUE);
4. 内存映射文件
  • 模块 :src/IO/MMappedFile.*

  • 修改内容 :

    • 重写 mmap()/munmap() 为 CreateFileMapping()/MapViewOfFile()
    cpp 复制代码
    HANDLE hMap = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, size, NULL);
    void* addr = MapViewOfFile(hMap, FILE_MAP_WRITE, 0, 0, size);
5. 网络套接字
  • 模块 :src/Common/NetUtils.*
  • 修改内容 :
    • Winsock 初始化:WSAStartup(MAKEWORD(2,2), &wsaData)
    • 错误码转换:errno → WSAGetLastError()
    • 关闭套接字:closesocket() 替代 close()
6. 用户权限
  • 模块 :src/Common/User.*

  • 修改内容 :

    • 替换 Linux UID/GID 为 Windows SID 检查
    cpp 复制代码
    BOOL isAdmin = FALSE;
    CheckTokenMembership(NULL, DOMAIN_ALIAS_RID_ADMINS, &isAdmin);
7. 符号链接
  • 模块 :src/Filesystem/FileData.*
  • 修改内容 :
    • 用 CreateSymbolicLinkA() 替代 symlink()
    • 检查 Windows 开发者模式权限

二、测试方案

单元测试 (GoogleTest)
  1. 路径转换测试

    • 用例 :验证 Linux 路径 /var/lib → Windows 路径 C:\clickhouse\data
    • 步骤 :调用路径处理函数,检查输出是否符合 std::filesystem 规范
    • 策略:覆盖绝对路径、相对路径、UNC 路径
  2. 进程启动测试

    • 用例 :验证 CreateProcess 启动子进程
    • 步骤 :启动计算器进程 (calc.exe),检查进程状态码
    • 策略:验证参数传递、错误句柄处理
集成测试
  1. 网络通信测试

    • 用例:客户端-服务端 TCP 通信
    • 步骤 :
      1. 启动 ClickHouse 服务端
      2. 使用 clickhouse-client.exe 发送查询
      3. 验证返回数据的完整性
    • 策略:模拟高并发连接(>1000 连接)
  2. 文件系统操作测试

    • 用例:跨盘符数据写入/读取
    • 步骤 :
      1. 创建表数据存储到 D:\data
      2. 重启服务后从 D:\data 加载数据
      3. 比较内存与磁盘数据一致性
    • 策略:NTFS/ReFS 文件系统覆盖测试
系统测试
  1. Windows 服务化部署

    • 用例:以 Windows Service 方式运行
    • 步骤 :
      1. 注册服务:sc create ClickHouse binPath= "C:\clickhouse\server.exe"
      2. 启停服务并验证自动恢复
    • 监控指标:内存泄漏(PerfMon)、崩溃转储(WER)
  2. 性能压测

    • 工具 :clickhouse-benchmark.exe
    • 场景:对比 Linux 与 Windows 的 QPS
    • 关键指标:查询延迟、内存占用(Working Set)、IO 吞吐量
验收测试
  1. Windows Server 2025 兼容性

    • 用例:Hyper-V 虚拟化支持
    • 步骤:在 Hyper-V 虚拟机内运行 ClickHouse,验证 vTPM 和虚拟化 I/O 加速
  2. 生产场景验证

    • 用例:从 SQL Server 实时同步数据
    • 步骤 :
      1. 通过 ODBC 连接 SQL Server
      2. 使用 MaterializedMySQL 引擎同步数据
      3. 验证 10TB 级数据一致性

三、关键工具链

  1. 编译环境 :
    • Windows 版 GCC (MinGW-w64) 或 MSVC + Clang-cl
  2. 依赖项处理 :
    • Vcpkg 管理 Boost、Poco、zstd 等依赖
  3. 调试工具 :
    • WinDbg 分析崩溃 Dump
    • Wireshark 抓取网络包

四、风险控制

  1. 符号链接权限:Windows 默认需管理员权限
  2. 内存对齐差异 :#pragma pack(16) 确保跨平台一致性
  3. 行结束符处理 :文本输入/输出统一使用 \n 避免 \r\n 问题

通过分阶段修改和分层测试,可逐步实现 Windows 平台兼容,重点确保文件/进程/网络三大子系统的健壮性。

相关推荐
高晶30 分钟前
ARM 嵌入式 Linux 文件系统从入门到实战:目录结构、权限管理、选型与挂载排查全攻略
linux·程序员
运维全世界1 小时前
Slurm集群搭建实战踩坑:存储节点无RAID、跨节点GPU无法读取数据彻底解决
linux
帷幕落秋1 小时前
进程服务与文件描述符
linux·运维·面试
用户209583592301 小时前
谛听(Diting)开发W7:检出率从 27% 到 100%,规则包从 19 条扩到 27 条
linux
钱栈up1 小时前
耳机音效不对,我顺手查了系统更新,结果挖出个崩溃了整天的服务
windows·shell
帷幕落秋1 小时前
信号、Ctrl 组合键与进程状态
linux·运维·面试
代钦塔拉1 小时前
【C++/Qt 进阶】设计模式系列(2):工厂模式——从游戏角色到披萨店
c++·算法·设计模式
xiao77mwq1 小时前
Wireshark 在 Windows 上没法按进程抓包,我补了一条路
windows
大能嘚吧嘚1 小时前
Debian13系统安装
linux
qetfw1 小时前
grep 文本筛选:匹配、反选与退出状态验证
linux·shell