TiDB 7.x 源码编译之 TiFlash 篇

news2024/10/4 14:09:07

本文首发于TiDB社区专栏:https://tidb.net/blog/5f3fe44d

alt

导言

TiFlash 从去年四月一日开源至今已经过去将近一年半,这段时间里 TiFlash 从 v6.0.0-DMR 升级到了 v7.3.0-DMR,并增加了若干新特性,比如支持 MPP 实现窗口函数框架,新增支持若干算子和函数下推,支持 AWS S3 算存分离等。先来回顾一下 TiFlash 资源精华帖,【重磅消息】TiFlash 终于开源啦!,和 TiFlash 时间线。

alt

前两篇文章 《TiDB 源码编译之 PD/TiDB Dashboard 篇》 和 《TiDB 源码编译之 TiUP 篇》 分别阐述了如何编译 TiUP、PD 以及 TiDB Dashboard。本文将介绍如何编译 TiFlash,只是本文使用的技术栈与前两篇文章有所不同,建议熟练掌握 Linux 知识和有一定编译经验的小伙伴继续往下浏览。

环境依赖

如若想成为 TiFlash Committer,首先要有能力编译 TiFlash 源码,并且可以在本地进行 Debug 调试,下面先来看下在本地环境编译源码需要准备哪些依赖包。

0️⃣ 编译环境

写作本文时使用的环境为 CentOS 7.9.2009,8c16g,这个硬件配置勉强够用,期间遇到过资源使用过载导致卡死的情况,如果有条件建议用更好的配置。至于操作系统,CentOS 7.9.2009 的 EOL 时间为 Jun 30th, 2024 ,其上游 RHEL 7.9 的生命周期支持延长到了 June 30, 2028,所以,现在及未来几年 CentOS 7.9.2009 依旧是企业级主流操作系统。

1️⃣ 基础工具包

安装基础工具包,用于源码编译。其中,devtoolset-10 用于临时调用 gcc 10 来编译 LLVM/Clang,而 ninja-build 用于构建源码工程。

yum install devtoolset-10 ninja-build

查看 Ninja 版本:

$ ninja --version
1.10.2

2️⃣ 安装 rust 环境

curl https://sh.rustup.rs -sSf | sh -s -- -y --profile minimal --default-toolchain nightly; source $HOME/.cargo/env

安装成功。

  nightly-x86_64-unknown-linux-gnu installed - rustc 1.73.0-nightly (28eb857b9 2023-08-12)

Rust is installed now. Great!

$ rustc --version
rustc 1.73.0-nightly (28eb857b9 2023-08-12)

3️⃣ 安装 OpenSSL

TiFlash 中,OpenSSL 的版本使用的是 1.1.1 系列,目前尚未升级大版本到 OpenSSL 3.x。 该包与安全性强相关,所以会不断升级小版本,目前应该是 TiDB 全栈升级到 1.1.1t 版本。 安装步骤如下:

wget https://github.com/openssl/openssl/archive/refs/tags/OpenSSL_1_1_1t.tar.gz
tar zxf OpenSSL_1_1_1t.tar.gz
cd openssl-OpenSSL_1_1_1t
./config --prefix=/opt/openssl --openssldir=/opt/openssl -fPIC no-shared no-afalgeng -static
make
sudo make install_sw install_ssldirs

安装完成后查看版本信息。

$ ./openssl version
OpenSSL 1.1.1t  7 Feb 2023

4️⃣ 安装 CMake3 / ccmake

CentOS 7 下默认安装 CMake 2,TiFlash 编译需要 CMake 3.21.0+ 版本,下面步骤为编译安装 CMake 3.22.1。

wget https://github.com/Kitware/CMake/releases/download/v3.22.1/cmake-3.22.1.tar.gz
tar zxf cmake-3.22.1.tar.gz
cd cmake-3.22.1
./configure
gmake
sudo make install

安装完成:

$ which cmake
/usr/local/bin/cmake
$ cmake --version
cmake version 3.22.1

CMake suite maintained and supported by Kitware (kitware.com/cmake).

$ ccmake --version
ccmake version 3.22.1

CMake suite maintained and supported by Kitware (kitware.com/cmake).

5️⃣ 安装 LLVM/Clang

在 CentOS 7 下,gcc 版本为 4.8 过于老旧,需要临时切换到 gcc 10。

$ scl enable devtoolset-10 bash

$ gcc --version
gcc (GCC) 10.2.1 20210130 (Red Hat 10.2.1-11)
Copyright (C) 2020 Free Software Foundation, Inc.
This is free software
; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

下载 LLVM 源码,并进行编译安装。

git clone https://github.com/llvm/llvm-project --depth=1 -b llvmorg-13.0.0
cd llvm-project
mkdir build
cmake -DCMAKE_BUILD_TYPE=Release -GNinja -S llvm -B build -DLLVM_ENABLE_PROJECTS="clang;lld" -DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi" -DLLVM_TARGETS_TO_BUILD=Native
ninja
sudo ninja install

编译日志输出:

[shawnyan@centos7 build]$ ninja
[185/3417] Building CXX object utils/TableGen/CMakeFiles/llvm-tblgen.dir/CodeGenRegisters.cpp.o
In file included from /home/shawnyan/llvm-project/llvm/utils/TableGen/CodeGenRegisters.h:25,
                 from /home/shawnyan/llvm-project/llvm/utils/TableGen/CodeGenRegisters.cpp:14:
/home/shawnyan/llvm-project/llvm/include/llvm/ADT/SparseBitVector.h: In member function 'unsigned int llvm::CodeGenRegister::getWeight(const llvm::CodeGenRegBank&) const':
/home/shawnyan/llvm-project/llvm/include/llvm/ADT/SparseBitVector.h:129:15: warning: array subscript 2 is above array bounds of 'const BitWord [2]' {aka 'const long unsigned int [2]'} [-Warray-bounds]
  129 |       if (Bits[i] != 0)
      |           ~~~~^
...
-- Could not find ParallelSTL, libc++abi will not attempt to use it but the build may fail if the libc++ in use needs it to be available.
-- Configuring done
-- Generating done
CMake Warning:
  Manually-specified variables were not used by the project:

    COMPILER_RT_BUILD_BUILTINS
    LLVM_BUILD_TOOLS
    LLVM_CONFIG_PATH
    LLVM_ENABLE_PROJECTS_USED


-- Build files have been written to: /home/shawnyan/llvm-project/build/runtimes/runtimes-bins
[3414/3417] Performing build step for 'runtimes'
[516/516] Linking CXX static library /home/shawnyan/llvm-project/build/lib/x86_64-unknown-linux-gnu/libc++abi.a
[3415/3417] No install step for 'runtimes'
[3417/3417] Completed 'runtimes'

期间遇到如下报错信息,不知道官方的编译环境是否也存在类似情况,查到一个 workaround,增加参数 -DCMAKE_BUILD_WITH_INSTALL_RPATH=ON 来解决问题。

CMake Error at runtimes/runtimes-bins/libcxx/src/cmake_install.cmake:88 (file):
  file RPATH_CHANGE could not write new RPATH:


  to the file:

    /usr/local/lib/x86_64-unknown-linux-gnu/libc++.so

Call Stack (most recent call first):
  runtimes/runtimes-bins/libcxx/cmake_install.cmake:56 (include)
  runtimes/runtimes-bins/cmake_install.cmake:47 (include)

需要说明的是,在 TiFlash 新版本中,已经使用 LLVM/Clang 取代 gcc 成为默认编译器,以此来提升编译效率,README 中 gcc 相关内容也已移除。

到此,所有依赖环境准备完成,下面开始正餐,编译 TiFlash 工程。

目标仓库

TiFlash 的主要编程语言为 C++,准备编译环境用了好几天时间,没有 golang 环境那么简洁清爽,但是在传统思维里,C/Cpp 才是系统工程的正统编程语言,学习成本高些,多花点时间也是正常的。 TiFlash 的目标仓库只有一个 pingcap/tiflash,但其引入了若干模块,所有源码加起来有 3G 多,笔者第一次克隆源码时直接将根目录填满了,所以在下载源码时只需下载一层深度 (--depth=1) 即可,无需下载所有源码仓库的所有版本代码。似有小伙伴在论坛曾言:“TiFlash docker 编译,能下载到宇宙的尽头”。

克隆代码

克隆 TiFlash 源码,并下载更新 TiFlash 所依赖的子模块。

git clone https://github.com/shawn0915/tiflash.git --depth=1
cd tiflash/
# 更新子模块
git submodule update --init --recursive --depth=1

去年有个帖子提及 TiFlash 的源码仓问题,tiflash编译时依赖的三方件,当时就在 Gitee 上同步了一套 TiFlash 依赖的子模块,这次撰写文本时做同步时,发现 TiFlash 增加了一些三方依赖。

比如,引入了 magic_enum 来优化枚举类型转义字符串。 又如,引入了 GmSSL 来支持国密 SM4 算法。 再如,引入一系列 AWS SDK 仓库,来支持 TiFlash 在 AWS 上的万种可能性。

编译代码

得益于 TiFlash 研发攻城狮的优秀成果,TiFlash 工程本身的编译命令简洁明了,只需两步。最终编译 TiFlash 用了半个小时,期间编译日志省略。需要强调的是,编译 TiFlash 过程中还会去 fetch/update 其他源码库,所以可能用到梯子,或者直接可以在海外云上申请服务器进行编译工作。

cmake .. -GNinja -DCMAKE_BUILD_TYPE=RELEASE
ninja tiflash -j 6

编译成功,重要成果文件如下。

root@centos7:/data/tiflash/build$ ll -h /usr/local/lib/x86_64-unknown-linux-gnu/
total 3.9M
-rw-r--r-- 1 root root  1.9M Aug 15 10:47 libc++.a
-rw-r--r-- 1 root root    28 Aug 15 10:47 libc++.so
lrwxrwxrwx 1 root root    13 Aug 14 14:06 libc++.so.1 -> libc++.so.1.0
-rwxr-xr-x 1 root root 1016K Aug 15 10:47 libc++.so.1.0
-rw-r--r-- 1 root root  668K Aug 15 10:47 libc++abi.a
lrwxrwxrwx 1 root root    14 Aug 15 10:03 libc++abi.so -> libc++abi.so.1
lrwxrwxrwx 1 root root    16 Aug 15 10:03 libc++abi.so.1 -> libc++abi.so.1.0
-rwxr-xr-x 1 root root  358K Aug 15 10:47 libc++abi.so.1.0
-rw-r--r-- 1 root root   13K Aug 15 10:47 libc++experimental.a
root@centos7:/data/tiflash/build$ ll -h ./contrib/GmSSL/lib/libgmssl*
lrwxrwxrwx 1 root root    13 Aug 15 13:07 ./contrib/GmSSL/lib/libgmssl.so -> libgmssl.so.3
lrwxrwxrwx 1 root root    15 Aug 15 13:07 ./contrib/GmSSL/lib/libgmssl.so.3 -> libgmssl.so.3.0
-rwxr-xr-x 1 root root  822K Aug 15 13:07 ./contrib/GmSSL/lib/libgmssl.so.3.0
root@centos7:/data/tiflash/build$ ll -h ./contrib/tiflash-proxy-cmake/release/lib*.so
-rwxr-xr-x 2 root root   87M Aug 15 13:34 ./contrib/tiflash-proxy-cmake/release/libraftstore_proxy.so
-rwxr-xr-x 1 root root   87M Aug 15 13:34 ./contrib/tiflash-proxy-cmake/release/libtiflash_proxy.so
root@centos7:/data/tiflash/build$ ll -h ./dbms/src/Server/tiflash
-rwxr-xr-x 1 root root  212M Aug 15 13:35 ./dbms/src/Server/tiflash

老规矩,尝试自定义版本号,编译完成后,查看 tiflash 可执行二进制文件的版本信息。

alt

遗留问题

1. CMake 版本选择

在 README/CMakeLists.txt 中提示要求 cmake 的最小版本为 3.21,而在 bake_llvm_base_amd64/aarch64.sh 文件中使用的是 3.22.1 版本,是否考虑将 CMake 的版本升级一下?

cmake_minimum_required (VERSION 3.21)

# CMake
source $SCRIPTPATH/install_cmake.sh
install_cmake "3.22.1" "x86_64"

2. 编译脚本冗余

release-centos7-llvm/env 路径下的文件有些陈旧,看起来是 dead code,不知是否还有保留的必要。

另外,在帖子 tiflash 源码cmake依赖 中有描述到,cmake 命令可能出现找不到的情况,需要修正,不过如果 env 文件夹移除的话,这个问题就伴随解决了。

3. 子模块代码仓链接

有个细微之处,.gitmodules 文件中 aws-sdk-cpp 使用的是个人代码仓 (https://github.com/JaySon-Huang/aws-sdk-cpp.git) 应该是某位研发大佬的个人账号?既不是公司仓库也不是 AWS 原厂仓库 (https://github.com/aws/aws-sdk-cpp.git ),不知道会不会是误导入。

4. “\” 误用 (Fixed)

文件 release-centos7-llvm/dockerfiles/misc/prepare_basic.sh 第 30 行后面多了一个反斜杠,故,提了个 PR: Remove excess backslashes #7940 。

Update. 该 PR 已经 merge.

总结

本文略显“头重脚轻”,是因为准备 TiFlash 的编译环境很折腾,前前后后一周多,对机器性能、网络连通性都要求很高,真的不建议轻易尝试。 不过,好在 TiFlash 已开源并在源码工程文件里提示了近乎完整的编译步骤,据说这也是 TiFlash 产研大神们自用的脚本,Thanks♪(・ω・)ノ。

Have a nice day ~


🌻 往期精彩 ▼

  • 国产基础软件“出海”标杆炼成记
  • 几张图带你了解 TiDB 架构演进
  • Oracle 数据库全面升级为 23ai
  • 「合集」MySQL 8.x 系列文章汇总
  • MySQL 9.0 的 VECTOR 文档更新
  • 星辰资讯:TiDB v8.1.0 发版!稳!
  • 敢于公布BUG的国产数据库才是好数据库
  • 一文带你了解 GB 18030-2022 字符集
  • MySQL 9.0.0 新鲜出炉!支持向量类型
  • 即将告别PG 12,建议升级到PG 16.3版本
  • 一文带你了解 KING BASE 人大金仓数据库
  • 如何选择适合的 MySQL Connector/J 版本
  • python-oracledb 已率先支持 Oracle 23ai
  • 后 EL 7 时代,PG 16 如何在 CentOS 7 上运行
  • 一文带你了解 Oracle 23ai 新特性 Vector 的基础用法

-- / END / --

👉 这里可以找到我

  • 微信公众号: 少安事务所
  • ITPUB: 少安事务所
  • TiDB 专栏: @ShawnYan
  • PGFans: 严少安
  • 墨天轮: 严少安

如果这篇文章为你带来了灵感或启发,就请帮忙点『』or『在看』or『转发』吧,感谢!ღ( ´・ᴗ・` )~

本文由 mdnice 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2188149.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

sql-labs靶场第五关测试报告

目录 一、测试环境 1、系统环境 2、使用工具/软件 二、测试目的 三、操作过程 1、寻找注入点 2、注入数据库 ①Order by判断列数 ②寻找注入方式 ③爆库,查看数据库名称 ④爆表,查看security库的所有表 ⑤爆列,查看users表的所有…

Linux之实战命令25:xargs应用实例(五十九)

简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏: 多媒体系统工程师系列【…

深度优先搜索:解锁无向图连通分量的编号策略

深度优先搜索:解锁无向图连通分量的编号策略 步骤:伪代码:C 代码实现:说明:在无向图中,深度优先搜索(DFS)是一种有效的算法,可以用来找出图的连通分量(Connected Components)。DFS 遍历图的过程中,可以自然地将图划分为若干棵树,这些树构成深度优先森林,其中每棵…

day03 笔试练习

1.简写单词 题目链接&#xff1a;简写单词_牛客题霸_牛客网 public static void main(String[] args) {Scanner sc new Scanner(System.in);while(sc.hasNext()){ // 输入多少读入多少char ch sc.next().charAt(0); // 提取首字母if(ch > a && ch < z){System…

netty之SpringBoot+Netty+Elasticsearch收集日志信息数据存储

前言 将大量的业务以及用户行为数据存储起来用于分析处理&#xff0c;但是由于数据量较大且需要具备可分析功能所以将数据存储到文件系统更为合理。尤其是一些互联网高并发级应用&#xff0c;往往数据库都采用分库分表设计&#xff0c;那么将这些分散的数据通过binlog汇总到一个…

第L9周:无监督学习|K-means聚类算法

本文为365天深度学习训练营 中的学习记录博客原作者&#xff1a;K同学啊 任务描述&#xff1a; ●学会调用sklearn实现KMeans算法。 ●了解误差平方和与轮廓系数。 1.聚类算法是什么&#xff1f; 聚类就是将一个庞杂数据集中具有相似特征的数据自动归类到一起&#xff0c;称为…

Leetcode 1498. 满足条件的子序列数目

1.题目基本信息 1.1.题目描述 给你一个整数数组 nums 和一个整数 target 。 请你统计并返回 nums 中能满足其最小元素与最大元素的 和 小于或等于 target 的 非空 子序列的数目。 由于答案可能很大&#xff0c;请将结果对 109 7 取余后返回。 1.2.题目地址 https://leet…

【优选算法之队列+宽搜/优先级队列】No.14--- 经典队列+宽搜/优先级队列算法

文章目录 前言一、队列宽搜示例&#xff1a;1.1 N 叉树的层序遍历1.2 ⼆叉树的锯⻮形层序遍历1.3 ⼆叉树最⼤宽度1.4 在每个树⾏中找最⼤值 二、优先级队列&#xff08;堆&#xff09;示例&#xff1a;2.1 最后⼀块⽯头的重量2.2 数据流中的第 K ⼤元素2.3 前 K 个⾼频单词2.4 …

气象网格数据与卫星轨道数据如何匹配??

&#x1f3c6;本文收录于《全栈Bug调优(实战版)》专栏&#xff0c;主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&am…

IDEA里面的长截图插件

1.我的悲惨经历 兄弟们啊&#xff0c;我太惨了&#xff0c;我刚刚在准备这个继承和多态的学习&#xff0c;写博客的时候想要截图代码&#xff0c;因为这个代码比较大&#xff0c;一张图截取不下来&#xff0c;所以需要长截图&#xff0c;之前使用的qq截图突然间拉胯&#xff0…

栈和队列相互实现(Java)

本篇任务 前篇我们分别介绍了栈和队列&#xff0c;并对其进行了简单的自我实现&#xff0c;本篇我们将通过栈和队列的相互实现来进一步熟悉和运用栈和队列&#xff0c;如下是我们将要完成的题目&#xff1a; 用队列实现栈https://leetcode-cn.com/problems/implement-stack-u…

【2022工业图像异常检测文献】CFLOW-AD: 通过条件归一化流实现实时无监督定位异常检测

CFLOW-AD: Real-Time Unsupervised Anomaly Detection with Localization via Conditional Normalizing Flows 1、Background 虽然最近提出针对此类数据设置的模型在准确性指标上取得了很高的成绩&#xff0c;但它们的复杂性限制了实时处理的能力。 CFLOW-AD由一个经过判别式…

区块链+Web3学习笔记

学习资料来源于B站&#xff1a; 17小时最全Web3教程&#xff1a;ERC20&#xff0c;NFT&#xff0c;Hardhat&#xff0c;CCIP跨链_哔哩哔哩_bilibili 该课程提供的Github代码地址&#xff0c;相关资料详见README.md&#xff1a; Web3_tutorial_Chinese/README.md at main sm…

Netty系列-8 Netty处理粘包和半包问题

1.半包和粘包问题 TCP协议是基于字节流的数据通讯协议&#xff0c;数据被看做是一连串的字节流&#xff1b;不具备边界信息&#xff0c;给接收方带来半包和粘包问题。 半包&#xff1a;TCP传输时&#xff0c;将数据切割成一个个数据包进行传输。接收方一次读取操作&#xff0c…

吉他弹唱打谱软件哪个好用 吉他弹唱制谱教程

吉他这门乐器一直受到大众的欢迎&#xff0c;究其原因&#xff0c;还是因为其成本低廉、易上手的特性。但是吉他是一个入门容易精通难的乐器&#xff0c;想要成为一个资深的吉他玩家&#xff0c;那么就少不了用到一些吉他弹唱打谱软件。今天我们就来说一说吉他弹唱打谱软件哪个…

学习 CSS 新的属性 conic-gradient 实现环形进度条

我们在工作中用到环形进度条的时候&#xff0c;一般都是使用组件库提供的&#xff0c;那么你有没有想过这是怎么实现的呢&#xff1f; <divclass"progress"style"--progress: 80%; --last: 20%"data-progress"80%"></div><style …

【宽搜】2. leetcode 102 二叉树的层序遍历

题目描述 题目链接&#xff1a;二叉树的层序遍历 根据上一篇文章的模板可以直接写代码&#xff0c;需要改变的就是将N叉树的child改为二叉树的left和right。 代码 class Solution { public:vector<vector<int>> levelOrder(TreeNode* root) {vector<vector&…

k8s的学习和使用

为什么用k8s&#xff0c;不用docker&#xff1f; k8s更适合复杂的微服务架构和大规模的容器应用。 Pods(Pod) Pod是k8s最小可部署单元&#xff0c;他包含一个或多个相关容器。这些容器共享网络命名空间和存储卷&#xff0c;他们通常协同工作来构成一个应用程序。 Serv…

开启AI新篇章:探索GPT-4与大模型!订阅方案!简单支付!

开启AI新篇章&#xff1a;探索GPT-4的无限可能 随着人工智能技术的飞速发展&#xff0c;我们正处于一个前所未有的变革时代。作为人工智能领域的领导者&#xff0c;OpenAI 推出的GPT-4&#xff0c;以其卓越的自然语言处理能力和强大的计算潜力&#xff0c;引发了行业内外的广泛…

深入浅出MySQL

深入浅出MySQL 以下内容参考自 《MySQL是怎样运行的&#xff1a;从根儿上理解MySQL》一书&#xff0c;强烈推荐 存储引擎 对于不同的表可以设置不同的存储引擎 CREATE TABLE tableName (xxxx ) ENGINE 引擎名称; # 修改 ALTER TABLE tableName ENGINE xxx; 编码格式 my…