【ScyllaDB】ScyllaDB本地部署
实验环境:主机Windows10(内存16G),虚拟机Ubuntu2204(内存12G),在虚拟上部署Docker,在Docker容器Fedora中构建ScyllaDB源代码。主机通过Vscode连接Docker容器。
原因:官方提供了工具链scylla/tools/toolchain/dbuild
,该工具链中可以构建ScyllaDB代码的运行环境,如需使用该工具链,需要采用docker容器的方式进行部署。
采用docker,部署ScyllaDB
【官方】部署方法
启动Ubuntu虚拟机,在虚拟机中完成下列操作
-
获取 ScyllaDB 源代码
# 克隆 ScyllaDB 的 GitHub 仓库到本地,然后初始化并更新 git 子模块 git clone https://github.com/scylladb/scylla cd scylla git submodule update --init --force --recursive
-
下载Docker
- 官方文档:https://docs.docker.com/engine/install/ubuntu/
- 此处为在虚拟机Ubuntu中安装Docker引擎
- 测试是否完成安装
-
配置构建环境:
-
使用
configure.py
脚本来配置构建系统。您可以指定构建模式:dev
(开发),release
(发布)或debug
(调试):./tools/toolchain/dbuild ./configure.py --mode=dev
-
./configure.py
文件执行完毕后,会自动下载scylladb/scylla-toolchain:fedora-38-20240212
docker镜像
-
scylladb/scylla-toolchain:fedora-38-20240212
镜像中包含scyllaDB所需的各种运行环境,无需再额外配置;这将为指定的构建模式生成构建配置。
-
-
构建 ScyllaDB:使用
ninja
构建 ScyllaDB -
输出文件地址为
scylla/build/dev/scylla
-
注意:可能会由于内存不足而停止,详见后文【问题一】
./tools/toolchain/dbuild ninja ./build/dev/scylla
-
尝试运行scyllaDB,
./tools/toolchain/dbuild ./build/release/scylla --developer-mode 1
【问题1】内存问题导致的构建停止
执行./tools/toolchain/dbuild ninja ./build/dev/scylla
后,ninja构建项目未完成即自动停止
内存设置为8G,执行完[105/575]
后,进入build/release/seastar
目录后,该文件夹下的所有文件链接后,即自动停止;推测可能是由于内存的限制而导致的
解决方案1:设置虚拟机内存为12G,即可顺利执行
同时也正常生成了Scylla
文件
其他解决方案【未尝试】
如果您遇到的是由于资源限制,尤其是内存限制导致的问题,而又无法提升本机的物理内存大小,您可以尝试以下几种方法来减轻或解决这个问题:
- 增加虚拟内存(Swap)
如果物理内存不足,增加虚拟内存(交换空间或 swap)可以提供额外的缓冲。虽然使用虚拟内存会降低性能,但它可以避免因内存耗尽而导致的构建失败。
- Linux:
- 您可以通过
sudo fallocate -l 8G /swapfile
创建一个 8 GB 的 swap 文件(大小根据需要调整)。 - 使用
sudo mkswap /swapfile
初始化为 swap 文件。 - 激活 swap 文件:
sudo swapon /swapfile
。 - 要使更改永久生效,编辑
/etc/fstab
并添加/swapfile swap swap defaults 0 0
。
- 您可以通过
- Windows:
- 打开“系统属性”>“高级”>“性能”设置>“高级”>“虚拟内存”,调整页面文件的大小。
- 优化构建配置
- 减少并行构建进程:并行构建可以显著加快构建速度,但也会增加内存使用。您可以通过设置
ninja -jN
(其中 N 是您希望使用的并行作业数)来限制并行作业的数量,例如,使用ninja -j2
来限制只有两个并行任务。对于make
,使用make -jN
。 - 优化构建选项:对于某些项目,您可以通过调整构建选项来减少内存使用,例如优化调试符号的生成或关闭某些特性。
-
使用云服务或远程构建
如果本地资源严重限制,考虑使用云服务(如 AWS EC2、Google Cloud Compute Engine)租用具有足够资源的虚拟机进行构建,或者使用支持远程构建的服务,如 GitHub Actions 或 GitLab CI/CD。 -
使用物理内存更大的机器
如果可能,临时使用另一台物理内存更大的机器进行构建,然后将构建结果(如二进制文件、库等)转移到您的主机上。 -
分阶段构建
如果项目允许,尝试分阶段构建。首先构建项目的一部分,然后清理不再需要的中间文件,最后构建剩余部分。这需要对项目的依赖关系有很好的理解。 -
关闭其他应用程序
在构建期间关闭不需要的应用程序和服务,尽可能为构建过程释放资源。 -
使用 Docker 资源限制
如果您是在 Docker 容器中构建项目,可以利用 Docker 的资源限制功能,例如使用--memory
参数来限制容器可用的最大内存。
通过上述方法,即使在物理内存不能增加的情况下,也有可能解决资源限制导致的构建问题。
【问题2】使用 ./tools/toolchain/dbuild ninja
命令构建 ScyllaDB 项目时,构建中断
- 检查错误消息
- 仔细阅读错误输出:构建过程中断时,
dbuild
或ninja
通常会提供错误消息。这些信息是诊断问题的关键。 - 定位问题源:错误可能与依赖项安装、配置问题、源代码错误等有关。具体错误消息会指向问题的原因。
- 检查环境配置
- 确保 Docker 或 Podman 正确安装并运行。
- 确保您的系统满足 ScyllaDB 的所有 构建依赖项。
- 如果是资源限制导致的问题(如内存不足),考虑增加可用资源。
- 清理并重新构建
- 有时,构建问题可以通过清理之前的构建产物解决。在 ScyllaDB 根目录下运行:
./tools/toolchain/dbuild ninja clean
- 然后再次尝试构建:
./tools/toolchain/dbuild ninja
- 如果想要构建特定目标(例如 release 版本的 Scylla),确保您指定了正确的构建目标。
- 查看构建日志
- 如果可能,检查构建过程中生成的 日志文件。日志文件可能包含导致构建失败的详细信息。
- 使用交互式模式
- 如果错误与环境配置有关,尝试使用
dbuild
的 交互式模式 进行故障排除:
./tools/toolchain/dbuild -i
- 这将允许您在构建环境内部手动运行命令,可能有助于识别问题。
- 检查 ScyllaDB GitHub Issues
- 查看 ScyllaDB 的 GitHub 仓库 中是否有相关的 Issues。其他用户可能遇到了类似的问题,而且可能已经有了解决方案。
- 请求帮助
- 如果问题仍然无法解决,考虑在 ScyllaDB 的 GitHub 仓库 或 社区论坛 发布求助信息。提供尽可能多的信息,包括您的操作系统、Docker 版本、错误消息和您已经尝试的解决步骤。
解决构建问题通常需要根据具体的错误消息和项目文档进行针对性的操作。始终保持构建工具和环境的最新状态,可以帮助减少构建过程中的问题。
如何使用主机的VsCode远程连接虚拟机中的Fedora开发环境?
- 启动Ubuntu虚拟机,安装ssh,参考:如何在 Ubuntu 20.04 上安装启用 SSH,使其能够进行远程连接
- 在Ubuntu虚拟机中启动Fedora开发环境,并将Ubuntu中的ScyllaDB代码挂载到Fedora环境中
# 启动Fedora的docker容器方法
docker run -it --network host --name scylladb_test -v ./scylla:/scylla scylladb/scylla-toolchain:fedora-38-20240212
# -it 前台方式启动
# --network host 网络模式直接映射到主机
# --name scylladb_test 启动的容器名称为scylladb_test
# -v ./scylla:/scylla 将主机的./scylla挂载到docker容器中的/scylla
# scylladb/scylla-toolchain:fedora-38-20240212 镜像名称
# 查看Fedora容器实例是否启动
docker ps
- 主机VsCode尝试连接启动的Docker容器
- 连接成功,即可在Fedora环境下进行代码调试
在VsCode中配置C++代码的运行环境
即在根目录下新建.vscode
文件夹,依次编写以下三个文件
{
"version": "0.2.0",
"configurations": [
{
"name": "Debug",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/build/release/scylla", // 根据实际情况编写
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
// "preLaunchTask": "Build with Ninja",
"miDebuggerPath": "/usr/bin/gdb"
}
]
}
{
"version": "2.0.0",
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: clang++ 生成活动文件",
"command": "/usr/lib64/ccache/clang++",
"args": [
"-fcolor-diagnostics",
"-fansi-escape-codes",
"-g",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": "build",
"detail": "编译器: /usr/lib64/ccache/clang++"
}
]
}
{
"configurations": [
{
"name": "Linux",
"includePath": [
"/scylla/seastar/include/**",
"/scylla/**"
],
"defines": [],
"cStandard": "c23",
"cppStandard": "c++23",
"intelliSenseMode": "linux-clang-x64",
"compilerPath": "/usr/lib64/ccache/clang++"
}
],
"version": 4
}
【问题3】代码报错:未定义标识符"co_await"、 "co_return"
查阅资料,如何编写 C++ 20 协程(Coroutines),发现co_await等是C++20中协程使用的一些术语,因而在使用IntelliSense进行检查时,需要将C++标准调整为C++20及以上
【问题4】运行官方预定义脚本时,提示未安装npm
报错:
此处采用Vscode连接的Ubuntu虚拟机中的Docker容器,所以该系统类型为Fedora-38-20240212,故需要在Fedora上安装npm,sudo dnf install nodejs
另:给当前用户赋予运行Docker的root权限
Docker 创建docker用户组,应用用户加入docker组
- 创建docker用户组
sudo groupadd docker
- 将用户加入docker用户组
sudo usermod -aG docker ${USER}
- 重启docker服务
sudo systemctl restart docker
- 切换用户
su root
以及su ${USER}
- 如果
su root
出现su:Authentication failure
,则重设root用户密码即可 sudo passwd root
- 如果
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能