Thursday, September 2, 2010

以 PostgreSQL + PgPool 設定複寫機制 @ Ubuntu

PgPool是一套在PostgreSQL Server與PostgreSQL Client中的middleware,由於PostgreSQL本身並沒有HA的相關功能,所以要靠其他的方案來解決,在PostgreSQL docChapter 25. High Availability, Load Balancing, and Replication裡有介紹各種方案,從其中有持續在開發,符合需求且較為全面性的方案裡研究了一陣子後,決定使用PgPool來作為PostgreSQL的Replication/Load Balance解決方案,據聞yahoo似乎也有使用pgpool,看來應該是不會太差的。

PgPool的介紹可以看其官方頁面,我做的是在兩台Ubuntu 10.04 上,安裝PostgreSQL 8.4,然後使用pgpool作Replication/Load Balance,其他的Parallel Query等功能請自行研究。

兩台電腦分別稱為Ubuntu A、Ubuntu B,IP分別是192.168.220.128與129.168.220.129,下面開始介紹我安裝與設定的步驟。




先在Ubuntu A、Ubuntu B兩台上都安裝PostgreSQL。


$ sudo aptitude update
先更新系統
Fetched 582kB in 25s (22.4kB/s)
Reading package lists... Done

$ sudo aptitude install postgresql
安裝PostgreSQL,load head後會問你要不要安裝,按y繼續...後面有些安裝時也差不多,就不重複說了

The following NEW packages will be installed:
libpq5{a} postgresql postgresql-8.4{a} postgresql-client-8.4{a}
postgresql-client-common{a} postgresql-common{a}
The following packages will be REMOVED:
linux-headers-2.6.32-21{u} linux-headers-2.6.32-21-generic{u}
0 packages upgraded, 6 newly installed, 2 to remove and 1 not upgraded.
Need to get 4,917kB of archives. After unpacking 66.2MB will be freed.
Do you want to continue? [Y/n/?]

$ sudo aptitude install pgadmin3
安裝pgsql管理介面

$ sudo vi /etc/postgresql/8.4/main/postgresql.conf
修改設定檔內容,將#listen_addresses = 'localhost' 改成listen_addresses = '*'

$ sudo vi /etc/postgresql/8.4/main/pg_hba.conf
修改信任IP來源,為了方便測試,先加入下面這行,測試完成後再依安全性修改
host all all 0.0.0.0/0 trust

$ sudo -i -u postgres
切換至postgres帳號

$ psql
進入postgresql

=# ALTER USER postgres WITH PASSWORD '密碼';
設定postgres的密碼

=# \q
跳出postgresql

$ sudo /etc/init.d/postgresql-8.4 restart
重新啟動PGSQL


然後在Ubuntu A上安裝PgPool。


$ sudo apt-get install libpq-dev
安裝pgpool所需lib,不然在make的時候會有下面的錯誤

configure: error: libpq is not installed or libpq is old

$ wget http://pgfoundry.org/frs/download.php/2664/pgpool-II-2.3.3.tar.gz
下載pgpool-ii,我是抓2.3.3版,現在也有3.0 beta版可用

$ tar -zxvf pgpool-II-2.3.3.tar.gz
解壓縮pgpool-ii

$ cd pgpool-II-2.3.3/
進入pgpool-ii目錄

$ sudo ./configure
產生設定檔

$ sudo make
產生安裝檔

$ sudo make install
安裝pgpool

$ sudo cp /usr/local/etc/pgpool.conf.sample /usr/local/etc/pgpool.conf
複製設定檔範例

$ sudo vi /usr/local/etc/pgpool.conf
修改設定檔內容,這邊依所需功能來做修改,所以我改了下面這些
將listen_addresses = 'localhost' 改成 listen_addresses = '*'
replication_mode = false 改成 replication_mode = true

socket_dir = '/tmp' 改成 socket_dir = '/var/run/postgresql'
pcp_socket_dir = '/tmp' 改成 /pcp_socket_dir = '/var/run/postgresql'
backend_socket_dir = '/tmp' 改成 backend_socket_dir = '/var/run/postgresql'

下面這段也做修改

backend_hostname0 = '192.168.220.128'
backend_port0 = 5432
backend_weight0 = 1
backend_data_directory0 = '/data'
backend_hostname1 = '192.168.220.129'
backend_port1 = 5432
backend_weight1 = 1
backend_data_directory1 = '/data1'

$ sudo cp /usr/local/etc/pcp.conf.sample /usr/local/etc/pcp.conf
複製設定檔範例

$ pg_md5 postgres的密碼
取得密碼的md5

$ sudo vi /usr/local/etc/pcp.conf
加入一行

postgres:密碼md5
若要新增pgpool使用的帳號就在這邊加

$ sudo -i -u root
切換至root

$ mkdir -p /var/run/pgpool
建立一個資料夾,pgpool執行時會在這邊產生pgpool.pid

$ pgpool -n -d > /tmp/pgpool.log 2>&1 &
啟動pgpool,我將log檔存至/tmp/pgpool.log,可以去開來看log

$ ps aux | grep pgpool
查看是否有啟動,有的話會看到有很多pgpool的程序


然後就測試PgPool的Replication功能了

$ sudo -i -u postgres
切換到postgres帳號

$ createdb DB1 -U postgres -p 9999
以postgres帳號透過pgpool建立名為DB1的DB

$ echo "\\l" | psql
查看現有DB,若有看到DB1的話,表示在Ubuntu A這台ok了,然後換到Ubuntu B去檢查,如果也有DB1,表示複寫機制成功運作。


複寫的設定暫時說到這邊,後續的DB使用上請自行變化。





下面是一些其他的指令,也許有機會用到

$ /usr/lib/postgresql/8.4/bin/initdb /var/lib/pgsql/data1
DB初始化,ubuntu好像用不到

$ sudo chown -R postgres /var/run/pgpool
將指定目錄/var/run/pgpool給予帳號postgres讀寫權限

postgresql在Ubuntu預設會裝到這下面/usr/lib/postgresql/

2 comments:

  1. This comment has been removed by the author.

    ReplyDelete
  2. 我在pgpool在make的時候出現error
    需要再安裝 flex byacc bison三個套件
    (# apt-get install flex byacc bison)

    ReplyDelete