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 平台兼容,重点确保文件/进程/网络三大子系统的健壮性。

相关推荐
雯宝9 分钟前
mnt_init 函数
linux
UIU1141 小时前
递归算法与汉诺塔
c++·学习·算法·c#·递归
Fruit_Caller1 小时前
static
开发语言·c++
律宏阔6 小时前
WSL Docker 端口明明空闲,但就是绑不上端口
linux·windows
律宏阔6 小时前
Windows 禁用联想笔记本所有 Lenovo 后台服务
windows
律宏阔6 小时前
WSL 突然断网,无法 ping 内网或外网
linux·windows
穷人小水滴6 小时前
用容器编译 VirtualBox 虚拟机软件 (ArchLinux, podman)
linux·容器·virtualbox
乱码三千7 小时前
如何优雅地直连无公网 IP 的远程 GPU 服务器
linux·人工智能·程序员
yunwei377 小时前
使用 eBPF 跟踪 Nginx 请求
linux·后端·性能优化
yunwei377 小时前
使用 eBPF 跟踪 MySQL 查询
linux·后端·性能优化