apple/foundationdb

GitHub: apple/foundationdb

FoundationDB 是一个支持跨数据中心的高性能分布式 ACID 键值存储。

Stars: 16254 | Forks: 1484

FoundationDB logo ![Build Status](https://codebuild.us-west-2.amazonaws.com/badges?uuid=eyJlbmNyeXB0ZWREYXRhIjoiVjVzb1RQNUZTaGxGNm9iUnk4OUZ1d09GdTMzZnVOT1YzaUU1RU1xR2o2TENRWFZjb3ZrTHJEcngrZVdnNE40bXJJVDErOGVwendIL3lFWFY3Y3oxQmdjPSIsIml2UGFyYW1ldGVyU3BlYyI6IlJUbWhnaUlJVXRORUNJTjQiLCJtYXRlcmlhbFNldFNlcmlhbCI6MX0%3D&branch=main) FoundationDB 是一个分布式数据库,旨在处理跨商品服务器集群的大量结构化数据。它将数据组织为有序的键值存储,并为所有操作采用 ACID 事务。它特别适合读/写工作负载,同时在写入密集型工作负载中也具有出色的性能。用户使用 API 语言绑定与数据库交互。 要了解更多关于 FoundationDB 的信息,请访问 [foundationdb.org](https://www.foundationdb.org/) ## 文档 文档可以在网上找到 。文档涵盖了 API 使用的详细信息、设计理念的背景信息以及广泛的使用示例。文档从 [本仓库中的源码](documentation/sphinx/source) 构建。 ## 论坛 [FoundationDB 论坛](https://forums.foundationdb.org/) 是大多数关于 FoundationDB 项目的讨论和交流的家园。欢迎您的参与!我们希望 FoundationDB 成为一个值得参与的优秀项目,并为此建立了 [行为准则](CODE_OF_CONDUCT.md) 来定义允许的互动方式。 ## 贡献 对 FoundationDB 的贡献可以是对代码库的贡献、在论坛上分享您的经验和见解,或者是对使用 FoundationDB 的项目做出贡献。请参阅 [贡献指南](CONTRIBUTING.md) 获取更多细节。 ## 入门 ### 最新稳定版本 最新的稳定版本是(曾是)推荐用于生产环境的版本,这些版本已经过模拟和真实集群测试的广泛验证,并在我们的生产环境中使用。 | 分支 | 最新生产发布 | 备注 | |:--------:|:-------------:|------:| | 7.3 | [7.3.69](https://github.com/apple/foundationdb/releases/tag/7.3.69) | 支持 | | 7.2 | | 实验性 | | 7.1 | [7.1.57](https://github.com/apple/foundationdb/releases/tag/7.1.57) | 修复错误 | | 7.0 | | 实验性 | | 6.3 | [6.3.25](https://github.com/apple/foundationdb/releases/tag/6.3.25) | 不支持 | - `支持` 的分支是我们积极维护并会发布新补丁版本的。 - `修复错误` 的分支是我们仍然接受错误修复,但可能不会发布新的补丁版本。社区可以在需要时构建最新的发布二进制文件,并鼓励升级到 `支持` 的分支。 - `实验性` 的分支是用于内部功能测试的。不建议在生产环境中使用。 - `不支持` 的分支将不再接收任何更新。 如果您正在运行旧的生产版本,我们建议始终升级到下一个主要版本的最新版本,然后继续升级到下一个主要版本,例如 6.2.X -> 6.3.25 -> 7.1.57 -> 7.3.69。这些升级路径已在生产中经过充分测试(跳过未标记为 `实验性` 的主版本升级仅在模拟中测试)。 ### 二进制下载 有兴趣使用 FoundationDB 的开发者可以通过下载并安装二进制包开始。请参阅 [下载页面](https://github.com/apple/foundationdb/releases) 获取可用软件包列表。 ### 从源码编译 在没有二进制包的平台上,或者希望开始对代码进行黑客攻击的开发者,可以通过从源码编译开始。 注意:FoundationDB 有很多依赖项。下面的 Docker 容器 列出了这些依赖项,并且是我们内部使用的构建方法,也是推荐的构建 FDB 的方法。 #### 使用官方 Docker 镜像构建 用于构建的官方 Docker 镜像为 [`foundationdb/build`](https://hub.docker.com/r/foundationdb/build),其中包含所有必要的依赖项。FoundationDB 团队使用的 Docker 镜像定义可以在 [专用仓库](https://github.com/FoundationDB/fdb-build-support) 中找到。 要使用 Clang 工具链构建 FoundationDB, ``` mkdir /some/build_output_dir cd /some/build_output_dir CC=clang CXX=clang++ LD=lld cmake -D USE_LD=LLD -D USE_LIBCXX=1 -G Ninja /some/fdb/source_dir ninja ``` 要使用 GCC,需要使用非默认版本。以下内容会修改环境 变量($PATH, $LD_LIBRARY_PATH 等)以选择正确的 GCC 版本: ``` source /opt/rh/gcc-toolset-13/enable gcc --version # should say 13 mkdir /some/build_output_dir cd /some/build_output_dir cmake -G Ninja /some/fdb/source_dir ninja ``` 稍微复杂一点的编译命令可以在容器镜像的 `/root/.bashrc` 中定义的 shell 别名找到。 #### 本地构建 要在官方 Docker 镜像之外进行构建,您至少需要以下依赖项: 1. [CMake](https://cmake.org/) 版本 3.24.2 或更高 2. [Mono](https://www.mono-project.com/download/stable/) 3. [ninja](https://ninja-build.org/) 这个列表可能不完整。请参考上述链接中的 `fdb-build-support` 仓库中的 `rockylinux9` Dockerfile,以获取可能需要的特定软件包和版本信息。 如果在本地开发时编译,请在 CMake 中设置 `-DUSE_WERROR=ON`。我们的 CI 编译时开启 `-Werror`,这样您可以更早地发现导致构建失败的编译器警告。 一旦依赖项准备就绪,可以运行 `cmake` 然后构建: 1. 检出此仓库。 2. 创建一个构建目录(可以放在任何您喜欢的位置)。 3. `cd ` 4. `cmake -G Ninja ` 5. `ninja` 构建 FoundationDB 至少需要 8GB 内存。并行构建需要更多内存。如果计算机冻结或崩溃,请考虑使用 `ninja -j1` 禁用并行构建。 #### FreeBSD 1. 在服务器上检出此仓库。 2. 从 ports 安装编译时依赖项。 3. (可选)使用 tmpfs & ccache 显著加快重复构建。 4. (可选)安装 [JDK](https://www.freshports.org/java/openjdk8/) 以构建 Java 绑定。FoundationDB 目前使用 Java 8 构建。 5. 导航到检出 FoundationDB 仓库的目录。 6. 从源码构建。 sudo pkg install -r FreeBSD \ shells/bash devel/cmake devel/ninja devel/ccache \ lang/mono lang/python3 \ devel/boost-libs devel/libeio \ security/openssl mkdir .build && cd .build cmake -G Ninja \ -DUSE_CCACHE=on \ -DUSE_DTRACE=off \ .. ninja -j 10 # 运行快速测试 ctest -L fast # 运行所有测试 ctest --output-on-failure -v ### macOS 在 macOS 上的构建方式与在 Linux 上相同。可以使用 [Homebrew](https://brew.sh/) 安装 `boost` 库和 `ninja` 构建工具。请注意,当前主分支使用 boost 1.86,请安装此版本或让 cmake 自动下载。另外,如果不关心 Swift 绑定,请使用 `-DBUILD_SWIFT_BINDING=OFF`。另外,toml11project 可能会阻塞构建过程,请手动将 `toml11Project-prefix/src/toml11Project/CMakeLists.txt` 中的 `cmake_minimum_required(VERSION 3.1)` 修改为 `cmake_minimum_required(VERSION 4.2)` 并再次运行。 ``` cmake -G Ninja -B cd ninja ``` 要生成可安装的软件包, ``` /packaging/osx/buildpkg.sh ``` ### Windows 在 Windows 下,仅支持 Visual Studio 搭配 ClangCl。 1. 安装 Visual Studio 2019(IDE 或构建工具),并启用 LLVM 支持 2. 安装 [CMake 3.24.2](https://cmake.org/download/) 或更高 3. 下载 [Boost 1.86.0](https://archives.boost.io/release/1.86.0/source/boost_1_86_0.tar.bz2) 4. 将 Boost 解压到 C:\boost,或使用 `-DBOOST_ROOT=` 配置 `cmake`(如果解压到其他位置) 5. 如果尚未安装,请安装 [Python](https://www.python.org/downloads/) 6. (可选)安装 [OpenJDK 11](documentation/sphinx/source) 以构建 Java 绑定 7. (可选)安装 [OpenSSL 3.x](https://slproweb.com/products/Win32OpenSSL.html) 以构建 TLS 支持 8. (可选)安装 [WIX Toolset](https://wixtoolset.org/) 以构建 Windows 安装程序 9. `mkdir build && cd build` 10. `cmake -G "Visual Studio 16 2019" -A x64 -T ClangCl ` 11. `msbuild /p:Configuration=Release foundationdb.sln` 12. 要提高构建性能,请使用 `/p:UseMultiToolTask=true` 和 `/p:CL_MPCount=` ### 语言绑定 CMake 支持的语言绑定将在 `bindings/lang` 目录中对应的每种语言下有一个相应的 `README.md` 文件。 通常,CMake 会构建所有能找到所需依赖项的语言绑定。每次成功的 CMake 运行后,CMake 会告知将要构建哪些语言绑定。 ### 生成 `compile_commands.json` CMake 可以为您构建编译数据库。然而,默认生成的文件在操作生成的文件时用处不大。当运行 `ninja` 时,构建系统会在源目录中创建另一个 `compile_commands.json` 文件。这可以用于 [CCLS](https://github.com/MaskRay/ccls) 和 [CQuery](https://github.com/cquery-project/cquery) 等工具,以及其他工具。这样,您就可以获得代码补全和代码导航功能。它目前还不完美(会显示一些错误),但我们正在不断改进开发体验。 CMake 默认不会生成 `compile_commands.json`;您必须传递 `-DCMAKE_EXPORT_COMPILE_COMMANDS=ON`。这也会启用目标 `processed_compile_commands`,该目标会重写 `compile_commands.json` 以描述 Actor 编译器源文件,而不是处理后的输出文件,并将输出文件放在源目录中。然后,此文件应能自动被任何工具使用。 请注意,如果在 `foundationdb/build` Docker 镜像中完成构建,生成的路径仍将不正确,需要手动修复。应该重新运行 `cmake` 并加上 `-DCMAKE_EXPORT_COMPILE_COMMANDS=OFF` 以防止撤销手动更改。 ### 代码格式化和静态分析 `clang-format` 和 `clang-tidy` 会在每次拉取请求时作为 CI 的一部分运行。请参阅 [clang-format](https://apple.github.io/foundationdb/clang-format.html) 和 [clang-tidy](https://apple.github.io/foundationdb/clang-tidy.html) 指南,了解如何在推送前本地运行它们。 ### 使用 IDE CMake 为多个流行 IDE 提供内置支持。然而,FoundationDB 的大多数文件都是用 `flow` 语言编写的,这是 C++ 编程语言的扩展,用于协程支持(注意:在 FoundationDB 开发时,C++20 尚未可用)。`flow` 语言将通过 `actorcompiler` 转换为 C++ 代码,同时阻止大多数 IDE 识别 `flow` 特定语法。 可以为使用支持 IDE 编辑 `flow` 的项目生成项目文件。有一个名为 `OPEN_FOR_IDE` 的 CMake 选项,它会创建一个可以在 IDE 中打开以进行编辑的项目。此项目无法构建,但您可以编辑文件并利用 IDE 支持的大多数编辑和导航功能。 例如,如果您想使用 Xcode 对 FoundationDB 进行修改,可以使用以下命令创建 Xcode 项目: ``` cmake -G Xcode -DOPEN_FOR_IDE=ON ``` 可以创建一个带有 `OPEN_FOR_IDE` 标志关闭的第二个构建目录,用于构建和调试。
标签:ACID事务, API绑定, Bash脚本, FoundationDB, JS文件枚举, 事务数据库, 企业级数据库, 写入优化, 写密集型, 分布式数据库, 开源数据库, 数据库引擎, 数据库性能, 有序键值, 请求拦截, 读取优化, 逆向工具, 键值存储, 集群部署, 高并发读写