November 16, 2015

Building MaxScale from source on CentOS 7

Building MaxScale from source on CentOS 7We’ve gotten a few questions on detailed installation tutorials for specific systems. So I decided to write one for CentOS 7 which is a pretty common OS. For this I’m using a fresh installation of CentOS 7 on a virtual machine.

Installing needed packages

The first things we need to get are tools required for getting MaxScale and building it. The Development Tools group in Yum has most of the required tools we need to build MaxScale. We also need a few other packages to build MaxScale.

The list of required packages for each distribution can be found from the documentation: Building-MaxScale-from-Source-Code

Installing packages:

yum groupinstall "Development Tools"
yum install gcc gcc-c++ ncurses-devel bison glibc-devel cmake libgcc perl make libtool
yum install openssl-devel libaio libaio-devel librabbitmq-devel libcurl-devel pcre-devel

The list of packages was copy-pasted from the RHEL/CentOS section in the Building From Source document.

Installing the MariaDB server

Usually it is recommended to install the required MariaDB packages on the system and let CMake figure where the needed headers and files are. Sometimes this is not an option and the packages are installed into a non-standard location. Instead of doing it the easy way, let’s extract the package into the /root/ folder!

We start by downloading the latest version of MariaDB Server. Pick the tarball to get everything as a nice, bundled package. CentOS 7 seems to lack wget on a fresh install so let’s install that:

yum install wget

And now for the packages:

cd /root/
wget --content-disposition https://downloads.mariadb.org/f/mariadb-10.0.22/bintar-linux-glibc_214-x86_64/mariadb-10.0.22-linux-glibc_214-x86_64.tar.gz/from/http%3A/mirror.netinch.com/pub/mariadb/?serve

After we have downloaded the package, extract it into to current folder, /root/.

tar -axf mariadb-10.0.22-linux-glibc_214-x86_64.tar.gz

Now we have the contents of the package extracted into /root/mariadb-10.0.22-linux-x86_64/. It should look something like this:

[root@localhost mariadb-10.0.22-linux-x86_64]# ls
bin             CREDITS  EXCEPTIONS-CLIENT  lib         README   sql-bench
COPYING         data     include            man         scripts  support-files
COPYING.LESSER  docs     INSTALL-BINARY     mysql-test  share

Now that we have the server “installed”, we can go ahead and build MaxScale.

Building MaxScale

Finally, we’re ready to clone the MaxScale repo:

cd /root/
git clone https://github.com/mariadb-corporation/MaxScale.git
mkdir build
cd build

This creates a MaxScale folder in /root/, a build directory where MaxScale will be build and changes the current directory to the newly created build directory.

Next step is to invoke CMake. This is probably the most complicated phase of installing MaxScale because we need to define custom locations for some of the build parameters. For a complete list of configurable build parameters, we have the cmake -LAH command.

If we try CMake according to the guide:

cmake ../MaxScale

We get:

...

-- Looking for include file time.h - found
-- Looking for include file unistd.h
-- Looking for include file unistd.h - found
CMake Error at cmake/macros.cmake:157 (message):
  Fatal Error: MySQL headers were not found.
Call Stack (most recent call first):
  CMakeLists.txt:33 (check_dirs)

-- Configuring incomplete, errors occurred!

Not good. We can remove the CMakeCache.txt to “reset” the build. We could also wipe the build directory clean, this is one of the many benefits of building “out-of-source”.

rm CMakeCache.txt

This is expected since we do not have the required packages installed in the default location. We need to tell CMake to look for the files at /root/mariadb-10.0.22-linux-x86_64/. We tell CMake where the headers are with -DMYSQL_DIR=/root/mariadb-10.0.22-linux-x86_64/include/, the embedded server with -DEMBEDDED_LIB=/root/mariadb-10.0.22-linux-x86_64/lib/libmysqld.a and finally, the errmsg.sys file with -DERRMSG=/root/mariadb-10.0.22-linux-x86_64/share/english/errmsg.sys.

We would also like to install MaxScale into /usr/ like normal packages do. We can do that by adding -DCMAKE_INSTALL_PREFIX=/usr to the CMake call.

Putting it all together:

cmake ../MaxScale -DCMAKE_INSTALL_PREFIX=/usr \
      -DMYSQL_DIR=/root/mariadb-10.0.22-linux-x86_64/include \
      -DEMBEDDED_LIB=/root/mariadb-10.0.22-linux-x86_64/lib/libmysqld.a \
      -DERRMSG=/root/mariadb-10.0.22-linux-x86_64/share/english/errmsg.sys

This time we’re OK:

-- Using MySQL headers found at: /root/mariadb-10.0.22-linux-x86_64/include/mysql
-- Using custom errmsg.sys found at: /root/mariadb-10.0.22-linux-x86_64/share/english/errmsg.sys
-- Found OpenSSL: /usr/lib64/libssl.so;/usr/lib64/libcrypto.so (found version "1.0.1e") 
-- Valgrind not found.
-- Dynamic MySQL client library not found.
-- Static MySQL client library not found.
-- Found mysql_version.h: /root/mariadb-10.0.22-linux-x86_64/include/mysql/mysql_version.h
-- MySQL version: 10.0.22
-- MySQL provider: MariaDB
-- Looking for pcre_stack_guard in /root/mariadb-10.0.22-linux-x86_64/lib/libmysqld.a
-- Looking for pcre_stack_guard in /root/mariadb-10.0.22-linux-x86_64/lib/libmysqld.a - found
-- Using embedded library: /root/mariadb-10.0.22-linux-x86_64/lib/libmysqld.a
-- Pandoc not found.
-- Could not find libtcmalloc, using system default malloc instead.
-- Could not find libjemalloc, using system default malloc instead.
-- Found Git: /usr/bin/git (found version "1.8.3.1") 
-- Found CURL: /usr/lib64/libcurl.so (found version "7.29.0") 
-- Found git 1.8.3.1
-- Commit ID: 7bfda81b098bfd0db3c306495725d1910294d2e8
-- C Compiler supports: -Werror=format-security
-- C Compiler supports: -Wno-unused-but-set-variable
-- Could not find editline library. MaxAdmin will be built without it.
-- Installing maxscale.conf to: /etc/ld.so.conf.d
-- Installing startup scripts to: /etc/init.d
-- Installing systemd service files to: /usr/lib/systemd/system
-- Found Doxygen: /usr/bin/doxygen (found version "1.8.5") 
-- Configuring done
-- Generating done
-- Build files have been written to: /root/build

We can see that the right headers and the embedded library was found and that the right errmsg.sys file is being used. Now the only thing left to do is to build and install MaxScale:

make
make install

This will install MaxScale into /usr/ and the required system files to their right places.

NOTE: we need to run the post-installation script postinst once we’ve done a manual installation of MaxScale. This will create the required folders and copy scripts to their right locations.

./postinst

Starting MaxScale

Now that we have done all we need, we can try out our installation of MaxScale, let’s create a minimalistic maxscale.cnf to do that. Copy-pasting the following into/etc/maxscale.cnf will give us what we need.

[maxscale]
threads=4

[my_monitor]
type=monitor
module=mysqlmon
servers=local_server
user=myuser
passwd=mypwd

[local_server]
type=server
address=127.0.0.1
port=3306
protocol=MySQLBackend

[simple_service]
type=service
router=readconnroute
servers=local_server
user=myuser
passwd=mypwd

[simple_listener]
type=listener
service=simple_service
protocol=MySQLClient
port=4000

# This service allows us to use maxadmin
[cli]
type=service
router=cli

# The port for this should always be 6603
[cli_listener]
type=listener
service=cli
protocol=maxscaled
port=6603

Once we’ve copied that we can start MaxScale:

systemctl start maxscale

To confirm that MaxScale is running, we can use the maxadmin client to check the status of the servers.

[root@localhost build]# maxadmin -pmariadb list servers
Servers.
-------------------+-----------------+-------+-------------+--------------------
Server             | Address         | Port  | Connections | Status              
-------------------+-----------------+-------+-------------+--------------------
local_server       | 127.0.0.1       |  3306 |           0 | Down
-------------------+-----------------+-------+-------------+--------------------

Since there’s no server running on 127.0.0.1:3306 it’ll show as Down.

And that’s it! We have MaxScale built from source using a custom location for the MariaDB server binaries. Now you can start adding more to the configuration or read some of the tutorials found in the knowledgebase.

About Markus Mäkelä

Markus Mäkelä is a Software Engineer working on MariaDB MaxScale. He graduated from Metropolia University of Applied Sciences in Helsinki, Finland.

Read all posts by Markus Mäkelä