No Comments

Installation steps for pgBouncer on PowerLinux

Ashnik Team
Singapore, 8 Nov 2013

by , , No Comments

8-Nov-2013

Our team has been excited ever since IBM and Enterprise DB announced availability of Postgres Plus Advanced Server on PowerLinux.

Our team recently started engaging with IBM to evaluate the scalability of PPAS on PowerLinux and to determine how to fine-tune such setups.

(It’s a work-in-progress and I am not sure how much I can share here. But if you are thinking of migrating your IT infrastructure to a much more cost effective stack of Power PC running RHEL and using EnterpriseDB PPAS/PostgreSQL as database please contact me or write to success@ashnik.com).

Though I really welcome this new announcement from EnterpriseDB, one thing which disappointed me was non-availability of pgBouncer in the rpm installers provided by EnterpriseDB for PPAS on PowerLinux.

I have always preferred pgBouncer as a connection pooling tool over pgpool. It’s light weight and quite easy to configure. In the past I had done some benchmarking study to see how PPAS scales with and without connection pooling. I had seen some significant gain and hence decided to install pgBouncer before I could to proceed with the performance measurement of PPAS on PowerLinux.

I faced a few issues but could finally install it and get it running. So I decided to share my experience of the same (which can hopefully help someone, as more and more people try to move away from costly hardware and proprietary database to PPAS on PowerLinux).

First thing that one should do is, make sure you have IBM Advanced ToolChain installed on your PowerLinux box.

As per my understanding, the compiler which is part IBM Advanced ToolChain is supposed to be optimized for Power PC. So it’s preferred for code compilation instead of using gcc compiler shipped with Red Hat.

Generally it will be installed in /opt/atXX

So I set my path to include Advanced Toolchain:

[root@pflex75 pgbouncer]# export PATH=/opt/at7.0/bin:$PATH

I just wanted to be sure about my version of gcc compiler

[root@pflex75 pgbouncer]# which gcc

/opt/at7.0/bin/gcc

[root@pflex75 pgbouncer]# gcc –version

gcc (GCC) 4.8.2 20130819 (Advance-Toolchain-at7.0) [ibm/gcc-4_8-branch, revision: 201854 merged from gcc-4_8-branch, revision 200989]

Copyright (C) 2013 Free Software Foundation, Inc.

This is free software; see the source for copying conditions. There is NO

warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

I downloaded the latest version of pgbouncer (for me its 1.5.4) from pgfoundries site and extracted the content of the tar file

[root@pflex75 pgbouncer]# tar -xzvf pgbouncer-1.5.4.tar.gz

Now was the time to configure the binaries and install them as per the instruction in README file which is extracted from above tar. So I fired below commands:

[root@pflex75 pgbouncer]# cd pgbouncer-1.5.4

[root@pflex75 pgbouncer-1.5.4]# ./configure –prefix=/usr/local –with-libevent=libevent-prefix

[root@pflex75 pgbouncer-1.5.4]# make

[root@pflex75 pgbouncer-1.5.4]# make install

[root@pflex75 pgbouncer-1.5.4]# cd ..

Now I had to setup the pgBouncer and start it.

So I coped the pgbouncer.ini file to a location of my choice (/etc/pgbouncer)

[root@pflex75 pgbouncer]# mkdir -p /etc/pgbouncer

[root@pflex75 pgbouncer]# chown enterprisedb:enterprisedb -Rf /etc/pgbouncer

[root@pflex75 pgbouncer]# cp /usr/local/share/doc/pgbouncer/pgbouncer.ini /etc/pgbouncer/pgbouncer.ini

Then I created a userlist.txt in a location of my choice (once again /etc/pgbouncer):

[root@pflex75 pgbouncer]# cat /etc/pgbouncer/userlist.txt

“enterprisedb” “password”

Now I followed all the standard steps to edit the pgbouncer to add all the address and databases. Then I went ahead to set pool size etc and then set path for userlist file.

In pgbouncer.ini file, I checked the value for logfile and pidfile. I had to ensure that these locations are present and owned by proper user (the user which I will be using for running pgbouncer must have permissions to run them).

logfile = /var/log/pgbouncer/pgbouncer.log

pidfile = /var/run/pgbouncer/pgbouncer.pid

[root@pflex75 pgbouncer]# mkdir -p /var/log/pgbouncer;

[root@pflex75 pgbouncer]# touch /var/log/pgbouncer/pgbouncer.log;

[root@pflex75 pgbouncer]# chown enterprisedb:enterprisedb -Rf /var/log/pgbouncer

[root@pflex75 pgbouncer]# mkdir -p /var/run/pgbouncer/

[root@pflex75 pgbouncer]# chown enterprisedb:enterprisedb -Rf /var/run/pgbouncer

But once I tried to run pgbouncer, I got below issue

[root@pflex75 pgbouncer]# pgbouncer -d /etc/pgbouncer/pgbouncer.ini

pgbouncer: error while loading shared libraries: libevent-2.0.so.5: cannot open shared object file: No such file or directory

To resolve (I followed below steps, but may be one can just resolve it by setting LD_LIBRARY):

First thing I did was removing the existing installation:

[root@pflex75 pgbouncer]# rm /usr/local/bin/pgbouncer

[root@pflex75 pgbouncer]# rm /usr/local/share/man/man5/pgbouncer.5

[root@pflex75 pgbouncer]# rm /usr/local/share/man/man1/pgbouncer.1

[root@pflex75 pgbouncer]# rm -rf /usr/local/share/doc/pgbouncer

Then I removed the installer I had extracted and then extracted it afresh:

[root@pflex75 pgbouncer-1.5.4]# cd .. ; rm -rf pgbouncer-1.5.4

[root@pflex75 pgbouncer]# tar -xzvf pgbouncer-1.5.4.tar.gz

I made sure you have latest libevent was installed:

[root@pflex75 pgbouncer]# yum info libevent

Loaded plugins: product-id, refresh-packagekit, security, subscription-manager

This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.

Installed Packages

Name : libevent

Arch : ppc64

Version : 1.4.13

Release : 4.el6

Size : 335 k

Repo : installed

From repo : anaconda-RedHatEnterpriseLinux-201301301505.ppc64

Summary : Abstract asynchronous event notification library

URL : http://monkey.org/~provos/libevent/

License : BSD

Description : The libevent API provides a mechanism to execute a callback function

: when a specific event occurs on a file descriptor or after a timeout

: has been reached. libevent is meant to replace the asynchronous event

: loop found in event driven network servers. An application just needs

: to call event_dispatch() and can then add or remove events dynamically

: without having to change the event loop.

Available Packages

Name : libevent

Arch : ppc

Version : 1.4.13

Release : 4.el6

Size : 66 k

Repo : local

Summary : Abstract asynchronous event notification library

URL : http://monkey.org/~provos/libevent/

License : BSD

Description : The libevent API provides a mechanism to execute a callback function

: when a specific event occurs on a file descriptor or after a timeout

: has been reached. libevent is meant to replace the asynchronous event

: loop found in event driven network servers. An application just needs

: to call event_dispatch() and can then add or remove events dynamically

: without having to change the event loop.

Then I set the value for LD_LIBRARY_PATH parameter to look at /usr/lib64 (for power64 system it will have the libevent)

[root@pflex75 pgbouncer-1.5.4]# export LD_LIBRARY_PATH=/usr/lib64:$LD_LIBRARY_PATH

I created an appropriate Softlink for Libevent (I believe this step was not needed)

[root@pflex75 pgbouncer-1.5.4]# ln ln -s /usr/lib64/libevent-1.4.so.2 /usr/local/lib

[root@pflex75 pgbouncer-1.5.4]# ./configure –prefix=/usr/local –with-libevent=/usr/lib64

[root@pflex75 pgbouncer-1.5.4]# make

[root@pflex75 pgbouncer-1.5.4]# make install

[root@pflex75 ~]# pgbouncer –help

Usage: pgbouncer [OPTION]… config.ini

-d, –daemon Run in background (as a daemon)

-R, –restart Do a online restart

-q, –quiet Run quietly

-v, –verbose Increase verbosity

-u, –user= Assume identity of

-V, –version Show version

-h, –help Show this help screen and exit

Now switch user to enterprisedb (or any user which you wish to use for running pgbouncer)

[root@pflex75 ~]# su – enterprisedb

-bash-4.1$ pgbouncer -d /etc/pgbouncer/pgbouncer.ini

pgbouncer: error while loading shared libraries: libevent-2.0.so.5: cannot open shared object file: No such file or directory

Ahhhha!!! Isn’t that the same error I just resolved? So I added below line in .bash_profile:

export LD_LIBRARY_PATH=/usr/lib64:$LD_LIBRARY_PATH

Now apply the same for current shell environment

-bash-4.1$ export LD_LIBRARY_PATH=/usr/lib64:$LD_LIBRARY_PATH

Try again:

-bash-4.1$ pgbouncer -d /etc/pgbouncer/pgbouncer.ini

2013-10-25 19:31:40.325 11412 LOG File descriptor limit: 1024 (H:4096), max_clie nt_conn: 200, max fds possible: 250

-bash-4.1$ ps -ef | grep -i pgbouncer

495 14384 1 0 19:41 ? 00:00:00 pgbouncer -d /etc/pgbouncer/pgbouncer.ini

Wow!!! Issue resolved!!! :-)

A few more steps which won’t harm (just to ensure permissions)

-bash-4.1$ chown enterprisedb:enterprisedb -Rf /usr/local/share/man/man1/pgbouncer.1

-bash-4.1$ chown enterprisedb:enterprisedb -Rf /usr/local/share/man/man5/pgbouncer.5

-bash-4.1$ chown enterprisedb:enterprisedb -Rf /usr/local/share/doc/pgbouncer

0
0


More from  Ashnik Team :
8-Nov-2013