安装 PhxSQL 笔记

PhxSQL 是由微信后台团队自主研发的一款服务高可用、数据强一致的分布式数据库服务。该服务基于 Percona5.6 搭建,目标在于解决 MySQL 在容灾和数据一致性方面的不足,并大幅简化了 MySQL 容灾切换的运维操作。

本文将介绍我参考官方文档在 Ubuntu 上编译安装 PhxSQL 的过程,和记录在此过程中我遇到的问题。

准备

因为 PhxSQL 有用到 colib, glog, leveldb, phxpaxos, phxrpc, protobuf 这几个第三方库文件,所以在编译前需要准备好,文末将给出下载链接。

1
2
3
4
5
6
7
├── third_party
│   ├── colib
│   ├── glog
│   ├── leveldb
│   ├── phxpaxos
│   ├── phxrpc
│   └── protobuf

编译

编译第三方库

在 Linux 下编译第三方库,大都是执行

1
./configure && make && make install

当然,也有不需要 ./configure的时候。下面开始介绍如何编译这些第三方库。

  1. 编译 colib
    进入 colib 目录,执行 make 即可。
  2. 编译 glog
    进入 glog 目录,根据文档的提示:

    需保证第三方库glog, protobuf在configure时带上-fPIC选项(configure CXXFLAGS=-fPIC),并指定–prefix=当前目录绝对路径。 比如configure CXXFLAGS=-fPIC –prefix=/home/root/phxsql/third_party/glog.

    依次执行如下命令:

    1
    2
    ./configure CXXFLAGS=-fPIC --prefix=/home/happy/phxsql/third_party/glog
    make && make install
  3. 编译 leveldb
    进入 leveldb 目录,执行 make,会生成 out-shared 和 out-static两个文件夹。它们存放的是编译后生成的库文件,在 编译 PhxSQL 时会用到它们。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    xxx@Vm-template-100G:/home/happy/workspace/leveldb$ tree -L 1
    .
    ├── AUTHORS
    ├── build_config.mk
    ├── build_detect_platform
    ├── CONTRIBUTING.md
    ├── db
    ├── doc
    ├── helpers
    ├── include
    ├── issues
    ├── LICENSE
    ├── Makefile
    ├── NEWS
    ├── out-shared
    ├── out-static
    ├── port
    ├── README.md
    ├── table
    ├── TODO
    └── util
  4. 编译 protobuf
    进入 protobuf 目录,需要先执行

    1
    ./autogen.sh

    执行完后,生成 configure 文件(感谢@通)。然后再执行:

    1
    2
    3
    ./configure CXXFLAGS=-fPIC --prefix=/home/happy/phxsql/third_party/protobuf
    make
    make install
  5. 编译 phxpaxos
    编译 phxpaxos 也需要一些第三方库:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    xxx@Vm-template-100G:/home/happy/workspace/phxrpc/third_party$ tree -L 2
    .
    ├── glog
    │   ├── include
    │   └── lib
    ├── gmock
    ├── leveldb
    │   ├── include
    │   └── lib
    └── protobuf
    ├── bin
    ├── include
    └── lib

    准备好这些文件之后,就可以开始编译 phxpaxos 了。执行:

    1
    2
    3
    ./autoinstall.sh
    make
    make install
  6. 编译 phxrpc
    进入 phxrpc 目录,拷贝以下文件至 third_party 目录下,执行 make 。

    1
    2
    3
    4
    5
    6
    xxx@Vm-template-100G:/home/happy/workspace/phxrpc/third_party$ tree -L 2
    .
    └── protobuf
    ├── bin
    ├── include
    └── lib

编译 PhxSQL

根据文档,在编译 PhxSQL 之前,需要

下载 percona-server-5.6_5.6.31-77.0 并将源代码放到 PhxSQL 目录下,更名或链接为percona(请注意只能使用percona-server-5.6_5.6.31-77.0版本)

整理完成之后,PhxSQL 的文件结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
├── AUTHORS
├── autoinstall.sh
├── include
├── INSTALL
├── LICENSE
├── Makefile
├── makefile.mk
├── percona
├── phxbinlogsvr
├── phxcomm
├── phx_percona
├── phxrpc_package_config
├── phxsqlclient
├── phxsqlproxy
├── README.en.md
├── README.md
├── src_list
├── third_party
└── tools

如果在编译、安装第三方库的时候,未指定安装到 PhxSQL 下的 third_party 目录下,则还需要将下列文件拷贝至该目录。拷贝完后,third_party 的文件结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
├── colib
│   ├── coctx.cpp
│   ├── coctx.h
│   ├── coctx.o
│   ├── coctx_swap.o
│   ├── coctx_swap.S
│   ├── co_hook_sys_call.cpp
│   ├── co_hook_sys_call.o
│   ├── co.mk
│   ├── co_routine.cpp
│   ├── co_routine.h
│   ├── co_routine_inner.h
│   ├── co_routine.o
│   ├── example_echocli
│   ├── example_echocli.cpp
│   ├── example_echocli.o
│   ├── example_echosvr
│   ├── example_echosvr.cpp
│   ├── example_echosvr.o
│   ├── example_poll
│   ├── example_poll.cpp
│   ├── example_poll.o
│   ├── example_thread
│   ├── example_thread.cpp
│   ├── example_thread.o
│   ├── lib
│   ├── LICENSE.txt
│   ├── Makefile
│   ├── README.md
│   └── solib
├── glog
│   ├── include
│   └── lib
├── leveldb
│   ├── include
│   └── lib
├── phxpaxos
│   ├── include
│   ├── lib
│   └── plugin
├── phxrpc
│   └── lib
└── protobuf
├── bin
├── include
└── lib

leveldb 目录下的 lib 的由来: 新建 lib 文件夹;拷贝编译生成的 out-shared 和 out-static 两个文件夹中的库到 lib 文件夹。
然后,就可以依次执行以下命令编译、安装 PhxSQL

1
./autoinstall.sh && make && make install

整个过程有些漫长,耐心等待就行。

问题

  1. 编译时提示未找到 libphxpaxos_plugin.a
    请进入到 phxpaxos 目录的 plugin 文件中,执行

    1
    make && make install

    生成的 libphxpaxos_plugin.a 被安装在 上一级的 lib 文件夹中。编译 PhxSQL 时,需要将 lib 文件夹拷贝至 PhxSQL/third_party/phxpaxos 中。

  2. Curses library not found

    1
    2
    3
    Could NOT find Curses (missing: CURSES_LIBRARY CURSES_INCLUDE_PATH)
    CMake Error at cmake/readline.cmake:87 (MESSAGE):
    Curses library not found. Please install appropriate package,

    安装 libncurses5-dev 即可。

  3. Cannot find system readline libraries

    1
    2
    3
    4
    5
    6
    CMake Error at cmake/readline.cmake:271 (MESSAGE):
    Cannot find system readline libraries.
    Call Stack (most recent call first):
    CMakeLists.txt:429 (MYSQL_CHECK_EDITLINE)
    -- Configuring incomplete, errors occurred!
    make: *** No rule to make target `perconaserverclient'. Stop.

    安装 libreadline 即可。

编译容易出错,如果出错,请再三阅读官方文档和本文。
文中如有遗漏或错误之处,欢迎指出 :)。

下载

  1. colib 备用链接
  2. glog 备用链接
  3. leveldb 备用链接
  4. phxpaxos 备用链接
  5. phxrpc 备用链接
  6. protobuf 备用链接
  7. phxsql 备用链接

参考

  1. 微信开源PhxSQL:高可用、强一致的MySQL集群
  2. 微信自研生产级paxos类库PhxPaxos实现原理介绍
  3. Installing Percona Server with TokuDB and TokuBackup from source, in CentOS 7 minimal
  4. How to install Readline/libreadline in Ubuntu?