这里对TiDB的编译过程中的几个小点进行分享。虽然理论上讲,从github上下载的源码解压后就能实现编译,但实际操作过程中,由于各种各样的原因,还是有可能出错,本文对实操过程中的几个问题及解决方案进行分享。
本文用的环境是CentOS 7.4
1. 环境准备
(1)golang编译环境
golang的编译环境,很多文章上都建议直接用yum安装,如下:
yum install golang -y
这样是可以的,但是要注意所安装golang的版本,跟所配置的yum源有关,一般情况下,不是最新版本,作者采用该方法安装的go版本是1.15.14,该版本不能正常编译当前用”git clone https://github.com/pingcap/tidb.git”下载的TiDB版本,可以用于自行在github上下载解压的早期版本,如5.0。编译用用”git clone https://github.com/pingcap/tidb.git”下载的TiDB版本,需要golang版本1.16以上,可以从golang官网上下载,本文用的1.17如下:
wget https://golang.google.cn/dl/go1.17.linux-amd64.tar.gz
然后直接解压放到待安装目录下:
tar -zxf go1.17.linux-amd64.tar.gz -C /usr/local
接着配置golang环境变量(在.bashrc或者.bash_profile中)如下:
export GOROOT=/usr/local/go
export GOBIN=$GOROOT/bin
export GOARCH=amd64
export GOOS=linux
export GOPATH=/opt/tidb
其中,GOPATH中下面准备TiDB源码下载存放与编译的位置
(2)Rust编译环境
Rust编译环境直接用网上其它文章所述即可,从中找到相应平台的nightly版本:
wget https://mirrors.ustc.edu.cn/rust-static/dist/rust-nightly-x86_64-unknown-linux-gnu.tar.gz && tar zxf rust-nightly-x86_64-unknown-linux-gnu.tar.gz
cd rust-nightly-x86_64-unknown-linux-gnu
./install.sh
然后配置Rust环境变量(在.bashrc或者.bash_profile中)如下:
export RUSTUP_DIST_SERVER=https://mirrors.ustc.edu.cn/rust-static
export RUSTUP_UPDATE_ROOT=https://mirrors.ustc.edu.cn/rust-static/rustup
然后应用环境变量
. ~/.bashrc
(3)硬盘空间
如果直接从github上clone TiDB、PD和TiKV进行编译,首先需要准备较大的磁盘空间,在编译过程中从github与google需要在线下载不少东西,最终总共需要占用约10GB以上的空间
2. 代码下载
先在上面设置的GOPATH下面,创建子目录:
Mkdir -p src/github.com/pingcap/
在此子目录下:
有两种方式
一是git clone:
git clone https://github.com/pingcap/tidb.git
git clone https://github.com/pingcap/pd.git
git clone https://github.com/pingcap/tikv.git
二是从github上选择,即自行下载适合的版本
3 .编译
(1)Tidb
简单来讲:
cd tidb
gmake
不过,有可能会遇到一些问题:
一是在main.go hang住很长时间不动,如下:
这很可能是github或者google连不通,如果可以试图设置GOPROXY来解决
export GOPROXY=https://goproxy.cn,direct
二是有时会出现:
command-line-arguments
/usr/local/go/pkg/tool/linux_amd64/link: running gcc failed: exit status 1
/usr/bin/ld: /tmp/go-link-1164296440/000014.o: unrecognized relocation (0x2a) in section `.text’
/usr/bin/ld: final link failed: Bad value
collect2: error: ld returned 1 exit status
这是因为ld的版本过低,需要升级一下,可以通过
yum install binutils
有时可能是
/usr/local/go/pkg/tool/linux_amd64/link: running gcc failed: exit status 1
…下的其它错,可以试下:
yum install glibc-static.x86_64 -y
如果同学无法连接google,则需要在go.mub后面增加replace
replace (
cloud.google.com/go => github.com/google/go-cloud v0.4.1-0.20181112030950-0b43d4400e53
go.uber.org/atomic => github.com/uber-go/atomic v1.3.3-0.20181018215023-8dc6146f7569
go.uber.org/multierr => github.com/uber-go/multierr v1.1.1-0.20180122172545-ddea229ff1df
go.uber.org/zap => github.com/uber-go/zap v1.9.2-0.20180814183419-67bc79d13d15
golang.org/x/crypto => github.com/golang/crypto v0.0.0-20181106171534-e4dc69e5b2fd
golang.org/x/lint => github.com/golang/lint v0.0.0-20181026193005-c67002cb31c3
golang.org/x/net => github.com/golang/net v0.0.0-20181108082009-03003ca0c849
golang.org/x/oauth2 => github.com/golang/oauth2 v0.0.0-20181106182150-f42d05182288
golang.org/x/sync => github.com/golang/sync v0.0.0-20181108010431-42b317875d0f
golang.org/x/sys => github.com/golang/sys v0.0.0-20181107165924-66b7b1311ac8
golang.org/x/text => github.com/golang/text v0.3.1-0.20181030141323-6f44c5a2ea40
golang.org/x/time => github.com/golang/time v0.0.0-20181108054448-85acf8d2951c
golang.org/x/tools => github.com/golang/tools v0.0.0-20181111003725-6d71ab8aade0
google.golang.org/api => github.com/google/google-api-go-client v0.0.0-20181108001712-cfbc873f6b93
google.golang.org/appengine => github.com/golang/appengine v1.3.1-0.20181031002003-4a4468ece617
google.golang.org/genproto => github.com/google/go-genproto v0.0.0-20181109154231-b5d43981345b
google.golang.org/grpc => github.com/grpc/grpc-go v1.2.1-0.20181109233107-eb55fa50e6c9
honnef.co/go/tools => github.com/dominikh/go-tools v0.0.0-20180920025451-e3ad64cb4ed3
)
如果v后面的版本显示不对,可以试着改成master
(2)Pd
cd pd
gmake
(3)Tikv
cd tikv
carge build
编译tikv的时间很长,另外,还有一个要特别注意的点:
目前编译git clone出来的新版本(2022年1月),需要GCC比较高的版本,CentOS7自带的4.8.5版本,在编译grcp(0.9.1)时会出现错误
所以需要自行升级gcc版本