以下流程从一个新的虚拟机开始


安装环境:CentOS-7-x86_64-Minimal

网络配置:安装net-tools,能用ifconfig命令和ssh连接即可。

以下步骤具体的操作原因,详见:《phxpaxos编译 完整流程》


1. 安装依赖

yum -y install curl-devel expat-devel gettext-devel openssl-devel zlib-devel asciidoc
yum -y install cmake wget git gcc gcc-c++ perl-ExtUtils-MakeMaker libtool libsysfs-dev 

下载和编译两个软件:

wget http://ftp.gnu.org/gnu/automake/automake-1.14.tar.gz
wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz

tar xvzf autoconf-2.69.tar.gz
cd autoconf-2.69
./configure
make && make install
cd ..
tar xvzf automake-1.14.tar.gz
cd automake-1.14
./configure
make && make install
// 验证:
automake --version
>>> automake (GNU automake) 1.14

2. 下载phxpaxos项目

git clone --recursive https://github.com/tencent-wechat/phxpaxos.git

3. 编译leveldb

cd phxpaxos/third_party
rm -rf leveldb
wget https://github.com/google/leveldb/archive/v1.18.tar.gz
tar xvzf v1.18.tar.gz
mv leveldb-1.18 leveldb
cd leveldb
make
mkdir lib 
cd lib 
ln -s ../libleveldb.a libleveldb.a

至此,leveldb编译完成,在lib目录下建立了一个软链,PhxPaxos通过lib这个目录来寻址静态库。


4. 编译protobuf

cd ../..  // 到phxpaxos/third_party/目录下
mv gmock protobuf/
cd protobuf
libtoolize --copy --force
./autogen.sh
pwd
./configure CXXFLAGS=-fPIC --prefix=[当前目录绝对路径pwd]
make && make install

至此,protobuf编译完成,检查是否在当前目录成功生成bin,include,lib三个子目录。


5. 编译PhxPaxos静态库

cd ../..  // 到PhxPaxos/目录下
./autoinstall.sh
make && make install //默认使用-O2编译优化参数,如需编译debug版本,则命令为make debug=y

至此,PhxPaxos静态库编译完成,检查是否在当前目录成功生成lib子目录,在lib目录是否成功生成静态库libphxpaxos.a.


6. 编译glog

cd third_party/glog/
pwd
./configure CXXFLAGS=-fPIC -prefix=[当前目录绝对路径pwd]
automake --add-missing
make && make install

至此,glog编译完成,检查是否在当前目录成功生成lib子目录,并检查在lib目录是否成功生成静态库libglog.a.


7. 编译PhxPaxos Plugin静态库

cd ../../plugin/  // 到PhxPaxos/plugin/目录下
make && make install

至此,PhxPaxos Plugin静态库编译成功,检查上层lib目录下是否成功生成静态库libphxpaxos_plugin.a.


8. 编译gflags

cd ../third_party/gflags/ // 到phxpaxos/third_party/gflags目录下
cmake .
make -j 24
make install

至此,gflags静态库编译成功,检查是否在当前目录成功生成lib子目录,并检查在lib目录是否成功生成静态库libgflags.a


9. 编译sample

9.1 phxecho

cd ../../sample/phxecho/  // 到phxpaxos/sample/phxecho目录下
make
mkdir log

运行:

// 启动三个进程:
./phxecho 127.0.0.1:11111 127.0.0.1:11111,127.0.0.1:11112,127.0.0.1:11113
./phxecho 127.0.0.1:11112 127.0.0.1:11111,127.0.0.1:11112,127.0.0.1:11113
./phxecho 127.0.0.1:11113 127.0.0.1:11111,127.0.0.1:11112,127.0.0.1:11113

每个进程都保持如下的阻塞状态:

run paxos ok
echo server start, ip 127.0.0.1 port 11113

please input: <echo req value>

随意选择其中某个进程,在其终端输入”hello, chao”,结果如下:

hello, chao
[SM Execute] ok, smid 1 instanceid 0 value hello, chao
echo resp value hello, chao

其他两个进程会显示如下:

[SM Execute] ok, smid 1 instanceid 0 value hello, chao

9.2 phxelection

cd ../phxelection/
make

运行:

// 启动三个进程:
./phxelection 127.0.0.1:11111 127.0.0.1:11111,127.0.0.1:11112,127.0.0.1:11113
./phxelection 127.0.0.1:11112 127.0.0.1:11111,127.0.0.1:11112,127.0.0.1:11113
./phxelection 127.0.0.1:11113 127.0.0.1:11111,127.0.0.1:11112,127.0.0.1:11113

进程为如下的状态:

// 启动进程1时,进程1:
run paxos ok
master: nodeid 0 version 18446744073709551615 ip 0.0.0.0 port 0
...

// 启动进程2时,进程2:
run paxos ok
master change!!! groupidx 0 newmaster ip 127.0.0.1 port 11112 version 0
master: nodeid 72058139498785640 version 0 ip 127.0.0.1 port 11112
...

// 启动进程2时,进程1:
master change!!! groupidx 0 newmaster ip 127.0.0.1 port 11112 version 0
master: nodeid 72058139498785640 version 0 ip 127.0.0.1 port 11112
...

// 启动进程3时,进程3:
run paxos ok
master: nodeid 0 version 18446744073709551615 ip 0.0.0.0 port 0
master: nodeid 0 version 18446744073709551615 ip 0.0.0.0 port 0
master: nodeid 0 version 18446744073709551615 ip 0.0.0.0 port 0
master change!!! groupidx 0 newmaster ip 127.0.0.1 port 11112 version 0
master: nodeid 72058139498785640 version 47 ip 127.0.0.1 port 11112
...

// 启动进程3时,进程1和进程2状态不变:
master: nodeid 72058139498785640 version 47 ip 127.0.0.1 port 11112
...

依次终止进程:

// 终止进程2时,进程1:
master: nodeid 0 version 149 ip 0.0.0.0 port 0
master change!!! groupidx 0 newmaster ip 127.0.0.1 port 11111 version 150
master: nodeid 72058139498785639 version 151 ip 127.0.0.1 port 11111
...

// 终止进程2时,进程3:
master change!!! groupidx 0 newmaster ip 127.0.0.1 port 11111 version 150
master: nodeid 72058139498785639 version 150 ip 127.0.0.1 port 11111
...

// 终止进程1时,进程3(只有单进程存活时,都是这个状态):
master: nodeid 0 version 218 ip 0.0.0.0 port 0
...

9.3 phxkv

要编译grpc:失败待续。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐