mcrouterを用いてmemcached構成を再検討(pod,servie…):の前にインストールを。。。

はじめに

インフラ関連の業務に従事するm.koです。
担当するシステムでは、memcachedを一時的なデータリポジトリとして利用しています。一時的ですので、ある程度の揮発性は許容されますが、やはりシステムが成長するにつれ保持期間と重要性が増してきます。また容量問題も当然のことながら浮上してきますね。
これらをクラスタ化する事で解決できないものかと、mcrouterを用いた再構成を検討しました。

ですが、動作検証をする前に、インストールという部分で大きなハードルがあり、今回記事として残す事にしました。

mcrouterについて

mcrouterはFacebook社がGithub上に公開したmemcached向けのソフトウェアです。
詳細な機能・特徴・利点は、本家の資料を参照頂ければと思います。

導入に向けて

動作検証には、まず導入を。
という事で、まず思いつくのはコンテナイメージですね。さっそくDocker Hubで、公式のイメージを検索しましたが、見つけ出す事ができませんでした。
次の策はLinuxディストリビューション向けのパッケージファイルを探します。社内で利用が許可されている各種リポジトリを検索しましたが、こちらも見つけ出す事ができませんでした。

最後に、という事でGithub上にソースコードが公開されいますので、手持ちのCentOS 7へSourceから導入を進める事としました。
この決定が大きなハードルに出くわすきっかけでした。少し前のバージョンのコンテナイメージを利用して検証を進めていれば、時間をかけることなく動作検証に入れていました。。。。

依存パッケージ

※以降の手順にステップやパッケージ・ライブラリ内容はgithub-mcrouter上で公開されていますインストールシェルを参考にしております。

Sourceからのインストールを前に必要な各種パッケージを入れていきます。
いずれもyumからの適用です。
– epel-release
– scl-utils
– centos-release-scl
devtoolset-4-gcc, devtoolset-4-gcc-c++, devtoolset-6-make, devtoolset-7-gcc, devtoolset-7-gcc-c++, rh-python36
※後述のLibraryの一部で、gcc 5.1以上が求められるため、devtoolset-4で提供されているパッケージを導入します。
      (EOLのため、現在取得しずらいかもしれません)

※11/25修正:ubuntu18.04環境に合わせ、gcc 7.3系を導入します。
– binutils-devel
– automake-1.15-4.fc23.noarch
      (archives.fedoraproject.orgから取得)
– bzip2-devel, lz4-devel, snappy-devel, xz-devel, double-conversion-devel, jemalloc-devel, libevent-devel, ragel, colm, libzstd-devel, libsodium-devel, libaio-devel, libdwarf-devel, libunwind-devel, rh-python36-python-six, rh-python36-python-devel

コンパイル環境の整備

mcrouterはC++で実装された多くのLibraryを必要とします。
これらもまたRPMなどのパッケージファイルとして見つける事ができませんでしたため、Sourceからインストールします。
まずは、Cコンパイラから。前項でインストールしたdevtoolset関連をパス無しで利用できる状態に。

$ scl enable devtoolset-7 devtoolset-6 rh-python36 bash
$ which gcc c++ python
/opt/rh/devtoolset-7/root/usr/bin/gcc
/opt/rh/devtoolset-7/root/usr/bin/c++
/opt/rh/rh-python36/root/usr/bin/python
$ sudo pip install Cython


続いて、 後続のboostライブラリ1.58 1.61に対応するためCMakeをインストールします。
選択したバージョンは、こちらも後続のfbthriftで3.12+が必要とされているためです。

$ wget https://cmake.org/files/v3.12/cmake-3.12.4.tar.gz
$ tar zxf cmake-3.12.4.tar.gz
$ cd cmake-3.12.4
$ ./configure --prefix=/opt/cmake
$ gmake && sudo make install
$ export PATH="/opt/cmake/bin:$PATH"

Libraryのインストール

前項でC, C++のコンパイル環境整備ができました。
ここから、各種Libraryをインストールしていきます。
boost, gflags, glog, fmtはいずれもパッケージファイルの提供があるLibraryですが、後述のfolly/fizzインストール時のエラーを克服できなかったため、今回はSourceからのインストールを選択しました。各バージョンはubuntu16.04 18.04のパッケージに合わせています。

1. Boost 1.65.1
$ wget https://dl.bintray.com/boostorg/release/1.65.1/source/boost_1_65_1.tar.gz
$ tar zxf boost_1_65_1.tar.gz && cd boost_1_65_1
$ ./bootstrap.sh && sudo ./b2 install -j2 --prefix=/usr/local
※boostインストール時、「...failed updating 56 targets...」というエラーが出力され、リターンコードが「1」となりますが、主要ライブラリはインストールされますので、ここではこのまま先に進みます。

2. gflags, glog
$ wget https://github.com/gflags/gflags/archive/v2.2.1.tar.gz -O gflags-2.2.1.tar.gz
$ tar zxf gflags-2.2.1.tar.gz && mkdir gflags-2.2.1/_build && cd gflags-2.2.1/_build
$ cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local -DBUILD_SHARED_LIBS=ON
$ make && sudo make install

$ wget https://github.com/google/glog/archive/v0.3.5.tar.gz -O glog-0.3.5.tar.gz
$ tar zxf glog-0.3.5.tar.gz && cd glog-0.3.5
$ ./configure --with-gflags=/usr/local --prefix=/usr/local
$ make && sudo make install

3. fmt
$ git clone https://github.com/fmtlib/fmt
$ mkdir fmt/_build && cd fmt/_build
$ CXXFLAGS="$CXXFLAGS -fPIC" cmake .. -DCMAKE_INSTALL_PREFIX="/usr/local"
$ make && sudo make install


続いてはGithub上でFacebook社が公開するLibrary群です。

1. folly
$ git clone https://github.com/facebook/folly
$ mkdir folly/_build && cd folly/_build
$ export LDFLAGS="-ljemalloc $LDFLAGS"
$ CXXFLAGS="$CXXFLAGS -fPIC" cmake .. -DCMAKE_INSTALL_PREFIX=/opt/mcrouter \
> -DCMAKE_INCLUDE_PATH="/usr/local/include" -DCMAKE_LIBRARY_PATH="/usr/local/lib:/usr/local/lib64" \
> -DFOLLY_CPP_ATOMIC_BUILTIN=1 -DFOLLY_HAVE_MEMRCHR=1 -DFOLLY_HAVE_RECVMMSG=1 \
> -DFOLLY_HAVE_CLOCK_GETTIME=1 -DFOLLY_HAVE_WEAK_SYMBOLS=1
$ make && sudo make install

2. fizz
$ git clone https://github.com/facebookincubator/fizz
$ mkdir fizz/_build && cd fizz/_build
$ cmake ../fizz -DCMAKE_INSTALL_PREFIX=/opt/mcrouter -DBUILD_TESTS=OFF \
> -DCMAKE_INCLUDE_PATH="/opt/mcrouter/include:/usr/local/include" \
> -DCMAKE_LIBRARY_PATH="/opt/mcrouter/lib:/usr/local/lib:/usr/local/lib64"
$ make && sudo make install

3. wangle
$ git clone https://github.com/facebook/wangle
$ mkdir wangle/_build && cd wangle/_build
$ cmake ../wangle -DCMAKE_INSTALL_PREFIX=/opt/mcrouter -DBUILD_TESTS=OFF \
> -DCMAKE_INCLUDE_PATH="/opt/mcrouter/include:/usr/local/include" \
> -DCMAKE_LIBRARY_PATH="/opt/mcrouter/lib:/usr/local/lib:/usr/local/lib64"
$ make && sudo make install

4. rsocket-cpp
$ git clone https://github.com/rsocket/rsocket-cpp
$ mkdir rsocket-cpp/_build && cd rsocket-cpp/_build
$ CXXFLAGS="$CXXFLAGS -fPIC" cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local -DBUILD_BENCHMARKS=OFF \
> -DBUILD_EXAMPLES=OFF -DBUILD_TESTS=OFF -DCMAKE_INCLUDE_PATH="/opt/mcrouter/include:/usr/local/include" \
> -DCMAKE_LIBRARY_PATH="/opt/mcrouter/lib:/usr/local/lib:/usr/local/lib64" -DCMAKE_PREFIX_PATH="/opt/mcrouter"
$ make && sudo make install

5. fbthrift
$ git clone https://github.com/facebook/fbthrift
$ mkdir fbthrift/_build && cd fbthrift/_build
$ CXXFLAGS="$CXXFLAGS -fPIC" cmake .. -DCMAKE_INSTALL_PREFIX=/opt/mcrouter \
> -DCMAKE_INCLUDE_PATH="/opt/mcrouter/include:/usr/local/include" \
> -DCMAKE_LIBRARY_PATH="/opt/mcrouter/lib:/usr/local/lib:/usr/local/lib64"
$ make && sudo make install


各LibraryのPREFIXは、mcrouterのRecipeの内容に沿わせました。

これでmcrouterインストールに必要なすべての準備ができました。
検証で利用した仮想マシンのスペックにも問題がありますが、ここまでの準備で多くの時間がかかりました。

インストール

前項でも書きましたが、ようやく準備が全てでき、mcrouterをインストールします。

$ git clone https://github.com/facebook/mcrouter
$ cd mcrouter/mcrouter
$ autoreconf --install
$ LD_LIBRARY_PATH="/opt/mcrouter/lib:/usr/local/lib:/usr/local/lib64:$LD_LIBRARY_PATH" \
> LD_RUN_PATH="/opt/mcrouter/lib:/usr/local/lib:/usr/local/lib64:$LD_RUN_PATH" \
> LDFLAGS="-L/opt/mcrouter/lib -L/usr/local/lib -L/usr/local/lib64 $LDFLAGS" \
> CPPFLAGS="-I/opt/mcrouter/include -I/usr/local/include $CPPFLAGS" \
> FBTHRIFT_BIN="/opt/mcrouter/bin/" ./configure --prefix=/opt/mcrouter --with-boost=yes
$ make && sudo make install

最後に

インストールの中で様々な試行錯誤を繰り返してきました。
エラーが起きるたびに、文献やソースコード、ubuntu16.04, ubuntu18.04の構成の調査など多くの時間を割くことに。
今思うことは、安易に手持ちのCentOS 7環境に執着せず、ubuntuベースの仮想マシンかDockerイメージから検証環境の構築を着手していればと。。。

次回では、改善に向けた構成の検討について書ければと考えております。この構成検討については、Dockerイメージを用いて行う予定です。

注釈

本記事で導入しましたmcrouterや各種Libraryは、以下の時点のバージョンとなります。最新のバージョンでは、必要となるライブラリのバージョンに変更や、追加の依存ライブラリがあるかもしれません。
folly, fizz, wangle, fbthrift : v2019.11.11.00
mcrouter: v0.9.0

参考

https://github.com/facebook/mcrouter
https://github.com/facebook/fbthrift/blob/master/build/fbcode_builder/CMake/FBPythonBinary.cmake
https://www.softwarecollections.org/en/scls/rhscl/devtoolset-4/
https://github.com/facebook/folly/issues/1121
https://github.com/facebook/mcrouter/tree/master/mcrouter/scripts/recipes