TiDB 源码编译之 TiFlash 篇

作者: ShawnYan 原文来源: https://tidb.net/blog/5f3fe44d

20230724-7a955b59-c8fe-46fb-a046-4b4122df91b7.png

导言

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

20230815-7667aa84-e6e4-4213-8ea5-5dccd9a8a4cf.png

前两篇文章 《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.1CMake suite maintained and supported by Kitware (kitware.com/cmake).$ ccmake --version
ccmake version 3.22.1CMake 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_BUILTINSLLVM_BUILD_TOOLSLLVM_CONFIG_PATHLLVM_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++.soCall 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 可执行二进制文件的版本信息。

20230815-d3618dc3-f9c0-4f28-bc01-367fb171cb2d.png

遗留问题

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♪(・ω・)ノ。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

韦东山老师 RTOS 入门课程(一)RTOS 介绍,熟悉裸机的汇编逻辑

韦东山老师 RTOS 入门课程 课程链接:韦东山直播公开课:RTOS实战项目之实现多任务系统 第1节:裸机程序框架和缺陷_哔哩哔哩_bilibili RTOS 介绍 裸机:固定顺序执行。 中断:可以一直专心做循环里的事情,直…

webSocket 开发

1 认识webSocket WebSocket_ohana!的博客-CSDN博客 一,什么是websocket WebSocket是HTML5下一种新的协议(websocket协议本质上是一个基于tcp的协议)它实现了浏览器与服务器全双工通信,能更好的节省服务器资源和带宽…

数据可视化-canvas-svg-Echarts

数据可视化 技术栈 canvas <canvas width"300" height"300"></canvas>当没有设置宽度和高度的时候&#xff0c;canvas 会初始化宽度为 300 像素和高度为 150 像素。切记不能通过样式去设置画布的宽度与高度宽高必须通过属性设置&#xff0c;…

四、内存管理

1、为什么需要自己实现内存管理 (1)RTOS涉及的内核对象&#xff1a;task、queue、semaphores和event group等。为了让FreeRTOS更容 易使用&#xff0c;这些内核对象一般都是动态分配&#xff1a;用到时分配&#xff0c;不使用时释放。使用内存的动态管理功能&#xff0c;简化了…

ATF(TF-A)安全通告 TFV-5 (CVE-2017-15031)

安全之安全(security)博客目录导读 ATF(TF-A)安全通告汇总 目录 一、ATF(TF-A)安全通告 TFV-5 (CVE-2017-15031) 二、CVE-2017-15031 一、ATF(TF-A)安全通告 TFV-5 (CVE-2017-15031) Title 未初始化或保存/恢复PMCR_EL0可能会泄露安全世界的时间信息 CVE ID CVE-2017-1503…

亿级短视频,如何架构?

说在前面 在尼恩的&#xff08;50&#xff09;读者社群中&#xff0c;经常指导大家面试架构&#xff0c;拿高端offer。 前几天&#xff0c;指导一个年薪100W小伙伴&#xff0c;拿到字节面试邀请。 遇到一个 非常、非常高频的一个面试题&#xff0c;但是很不好回答&#xff0…

从外部访问K8s中Pod的五种方式

hostNetwork、 hostPort、 NodePort、 LoadBalancer、 Ingress 暴露Pod与Service一样&#xff0c;因为Pod就是Service的backend 1、hostNetwork&#xff1a;true 这是一种直接定义 Pod 网络的方式。 如果在 Pod 中使用 hostNetwork:true 配置&#xff0c; pod 中运行的应用程序…

SpringBoot项目集成ElasticSearch服务

本文已收录于专栏 《中间件合集》 目录 版本介绍背景介绍优势说明集成过程1.引入依赖2.添加配置文件3.初始化 示例说明代码结果 总结提升 版本介绍 Spring boot的版本是&#xff1a; 2.3.12   ElasticSearch的版本是&#xff1a;7.6.2 背景介绍 在我们的项目中经常会遇到对于…

java面试基础 -- ArrayList 和 LinkedList有什么区别, ArrayList和Vector呢?

目录 基本介绍 有什么不同?? ArrayList的扩容机制 ArrayLIst的基本使用 ArrayList和Vector 基本介绍 还记得我们的java集合框架吗, 我们来复习一下, 如图: 可以看出来 ArrayList和LinkedList 都是具体类, 他们都是接口List的实现类. 但是他们底层的逻辑是不同的, 相信…

2023-8-18 区间和

题目链接&#xff1a;区间和 #include <iostream> #include <vector> #include <algorithm>using namespace std;typedef pair<int, int> PII;const int N 300010;int n, m; int a[N], s[N]; vector<int> alls; vector<PII> add, query…

移植PeerTalk开源库IOS的USB通信监听服务到QT生成的FFmpeg工程

1.添加生成的PeerTalk库 下图选中部分为FFmpeg依赖库 将USB通信服务的m与h文件添加到工程 因为OC文件使用了弱指针,所以要启用弱指针支持 因为FFmpeg拉流动用到本地网络,所以要在plist文件中启动本地网络使用 设置PeerTalk为嵌入模式 设置Runpath Search Paths为@executable_p…

【欧拉计划】3或5的倍数

题目链接&#xff1a;3或5的倍数 解法一&#xff1a;暴力枚举 C语言代码 #include<stdio.h> int main (){int sum 0;for(int i 0;i<1000;i){if(i%30 || i%50)sum i;}printf("%d\n",sum);return 0; } //运行结果&#xff1a;233168上面这个解法的时间复杂…

Linux 虚拟机Ubuntu22.04版本通过远程连接连接不上,输入ifconfig只能看到127.0.0.1的解决办法

之前给虚拟机配置静态IP之后&#xff0c;可以直接通过主机Vscode远程连接。但是前一段时间把主机的TCP/IPV4静态IP设置了一下之后&#xff0c;再连接虚拟机就连不上了&#xff0c;于是参考解决虚拟机不能上网ifconfig只显示127.0.0.1的问题&#xff0c;又可以连接上了&#xff…

Swing程序设计(1)概述及常用组件

文章目录 前言一、什么是GUI?二、Swing概述 1.Swing包2.Swing常用组件总结 前言 该文介绍了Java中Swing组件的概述&#xff0c;以及常用组件的介绍。Swing程序是关于开发软件界面的一种轻量级Java组件。那什么是Swing组件&#xff1f;弹出对话框&#xff0c;窗体&#xff0c;设…

ClickHouse AST is too big 报错问题处理记录

ClickHouse AST is too big 报错问题处理记录 问题描述问题分析解决方案1、修改系统配置2、修改业务逻辑 问题描述 项目中统计报表的查询出现 AST is too big 问题&#xff0c;报错信息如下&#xff1a; 问题分析 报错信息显示 AST is too big。 AST 表示查询语法树中的最大…

pycharm调整最大堆发挥最大

python程序运行时&#xff0c;怎么提高效率&#xff0c;设置pycharm最大堆过程如下&#xff1b; 一、进入设置pycharm最大堆&#xff1b; 二、进入设置pycharm最大堆&#xff1b; 如果8g设置为6g左右&#xff0c;占75%左右最佳

自动驾驶港口车辆故障及事故处理机制

1、传感器故障&#xff1a; &#xff08;1&#xff09;单一传感器数据异常处理。自动驾驶电动平板传感方案为冗余设置&#xff0c;有其他传感器能够覆盖故障传感器观测区域&#xff0c;感知/定位模块将数据异常情况发给到规划决策模块&#xff0c;由“大脑”向中控平台上报故障…

mac m1上系统内录内部声音的方法/无需安装Blackhole

总所周知&#xff0c;m1的mac不能录制桌面音频&#xff0c;obsstudio都不行。 最快的解决方法就是下载飞书&#xff1a; 登陆后新建直播/视频会议&#xff1a; 共享的时候选择下面的两个钩上去就好了

野火i.mx 6ull上手

目录 屏幕驱动打印信息 实现触摸屏校验 开发板连接WIFI 连接操作 申请路由器动态IP和ping网络通断 WiFi信息保存位置 常用wifi操作&#xff08;wpa_cli工具&#xff09; NFS网络文件系统共享 虚拟机安装NFS服务器 开发板安装NFS客户端 控制开发板 找出硬件设备所对…

n5173b是德科技keysight N5173B信号发生器

产品概述 是德科技/安捷伦N5173B EXG模拟信号发生器 当您需要平衡预算和性能时&#xff0c;是德科技N5173B EXG微波模拟信号发生器是经济高效的选择。它提供解决宽带滤波器、放大器、接收机等参数测试的基本信号。执行基本LO上变频或CW阻塞&#xff0c;低成本覆盖13、20、31.…