用Pgpool-II實現Postgresql高可用集羣

    其實整個安裝和配置過程比較簡單,官方網站有比較好的文檔,在此只是根據前幾天的實際部署整理一下。(實際執行的命令都用紅色標出) html

 

服務器: node

10.18.27.181    pgpool服務器 --------此服務器上須要安裝pgpoolpg linux

10.18.27.183    data node 1  --------此服務器上安裝pg sql

10.18.27.184    data node 2  --------此服務器上安裝pg 數據庫

10.18.27.185    data node 3  --------此服務器上安裝pg 服務器

10.18.27.186    data node 4  --------此服務器上安裝pg 網絡

10.18.27.193    data node 1 Slave --------此服務器上安裝pg ide

10.18.27.194    data node 2 Slave --------此服務器上安裝pg 工具

10.18.27.195    data node 3 Slave --------此服務器上安裝pg post

10.18.27.196    data node 4 Slave --------此服務器上安裝pg

 

>>>>>>>>>>>>>>>>>>>>1.安裝Pgpool-II10.18.27.181<<<<<<<<<<<<<<<<<<<<<<

安裝 pgpool-II 很是簡單。在你解壓源碼 tar 包的目錄中,執行如下命令。

$ ./configure

$ make

$ make install

 

配置文件

cp /usr/local/etc/pgpool.conf.sample /usr/local/etc/pgpool.conf

 

pgpool-II 默認只接受到 9999 端口的本地鏈接。若是你但願從其餘主機接受鏈接,請設置 listen_addresses  '*'.

listen_addresses = 'localhost'

port = 9999

 

pgpool-II 有一個用於管理功能的接口,用於經過網絡獲取數據庫節點信息、關閉 pgpool-II 等。此功能咱們並無使用。配置也比較單,鏈接端口9898

它的配置文件經過如下方式取得

cp /usr/local/etc/pcp.conf.sample /usr/local/etc/pcp.conf

>>>>>>>>>>>>>>>>>>>>1.安裝Pgpool-II10.18.27.181<<<<<<<<<<<<<<<<<<<<<<

 

 

 

>>>>>>>>>>>>>>>>>>>>2.安裝PG(全部服務器)<<<<<<<<<<<<<<<<<<<<<<

PG安裝方法也很簡單,一樣可能每一個人的安裝方法稍有不一樣。個人安裝方法以下,在此只把命令粘貼上來,很少作解釋了

惟一的不一樣就是我把全部的配置文件都單獨放在/usr/local/pgsql/etc下了,我認爲這樣更方便管理(我的習慣而已)

 

cd /root/postgresql-9.0.4

./configure --with-wal-segsize=32 --with-wal-blocksize=16

gmake

gmake install

adduser postgres

mkdir -p /usr/local/pgsql/data

mkdir -p /usr/local/pgsql/etc

mkdir -p /usr/local/pgsql/archivedir

chown postgres /usr/local/pgsql/data

chown postgres /usr/local/pgsql/etc

chown postgres /usr/local/pgsql/archivedir

su - postgres

/usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data -E utf8

mv /usr/local/pgsql/data/*.conf /usr/local/pgsql/etc

exit (su - root)

cp /root/postgresql-9.0.4/contrib/start-scripts/linux /etc/init.d/postgresd

vi /etc/init.d/postgresd  修改以下部分,-c config_file指定postgresql.conf的位置:

===============================================================

  start)

        echo -n "Starting PostgreSQL: "

        test x"$OOM_ADJ" != x && echo "$OOM_ADJ" > /proc/self/oom_adj

        su - $PGUSER -c "$DAEMON -D '$PGDATA' -c config_file=/usr/local/pgsql/etc/postgresql.conf &" >>$PGLOG 2>&1

        echo "ok"

        ;;

  restart)

        echo -n "Restarting PostgreSQL: "

        su - $PGUSER -c "$PGCTL stop -D '$PGDATA' -s -m fast -w"

        test x"$OOM_ADJ" != x && echo "$OOM_ADJ" > /proc/self/oom_adj

        su - $PGUSER -c "$DAEMON -D '$PGDATA' -c config_file=/usr/local/pgsql/etc/postgresql.conf &" >>$PGLOG 2>&1

        echo "ok"

        ;;

 

chmod 755 /etc/init.d/postgresd

 

vi /usr/local/pgsql/etc/postgresql.conf  修改以下部分:

===============================================================

#------------------------------------------------------------------------------

# FILE LOCATIONS

#------------------------------------------------------------------------------

 

# The default values of these variables are driven from the -D command-line

# option or PGDATA environment variable, represented here as ConfigDir.

 

#data_directory = 'ConfigDir'           # use data in another directory

                                        # (change requires restart)

hba_file = '/usr/local/pgsql/etc/pg_hba.conf'     # host-based authentication file

                                        # (change requires restart)

ident_file = '/usr/local/pgsql/etc/pg_ident.conf' # ident configuration file

                                        # (change requires restart)

 

# If external_pid_file is not explicitly set, no extra PID file is written.

#external_pid_file = '(none)'           # write an extra PID file

                                        # (change requires restart)

                                       

                                       

                                       

 

log_line_prefix = '%m %r %e %c'

log_lock_waits = on

log_statement = 'all'

 

listen_addresses = '*'

===============================================================

 

/etc/init.d/postgresd start

>>>>>>>>>>>>>>>>>>>>2.安裝PG(全部服務器)<<<<<<<<<<<<<<<<<<<<<<

 

 

 

>>>>>>>>>>>>>>>>>>>>3.配置pgpoolII10.18.27.181<<<<<<<<<<<<<<<<<<<<<<

1)基本配置

首先,配置數據節點信息

vi /usr/local/etc/pgpool.conf

listen_addresses = '*'

 

backend_hostname0 = '10.18.27.183'

backend_port0 = 5432

backend_weight0 = 1

backend_hostname1 = '10.18.27.184'

backend_port1 = 5432

backend_weight1 = 1

backend_hostname2 = '10.18.27.185'

backend_port2 = 5432

backend_weight2 = 1

backend_hostname3 = '10.18.27.186'

backend_port3 = 5432

backend_weight3 = 1

===============================================================

(2) 配置並行查詢以數據分佈

要啓用並行查詢功能,請設置 pgpool.conf 文件中的parallel_mode  true 。僅僅設置 paralle_mode  true 不會自動啓動並行查詢。pgpool-II 須要系統數據庫和用於分發數據到數據庫節點的規則。並且,系統數據庫使用的 dblink 須要鏈接到 pgpool-II

咱們將設置 parallel_mode  load_balance_mode  true

注意:你能夠同時擁有分區表和複製表。可是一個表不能同時被分區和複製。由於分區表和複製表的結構不一樣。

這裏我多說一句,開始我並不理解這是什麼意思,雖着一步一步的配置,我才搞明白。其實就是說,在並行查詢模式下,DB裏的表要麼是採用分區形式存儲在各個節點,要麼是複製的形式存儲在各個節點。也就是說,若是表table1數據量很大,那麼咱們定義分發規則,把表table1的數據按照規則分紅4份,存儲在4個節點上;若是表table2只有不多的數據,咱們不想也不須要把數據分割,那麼就配置成複製形式,這樣的話表table2是以完整的形式存儲在4個節點上,每一個節點都是完整的數據哦! 但一個表若是分區了,就不能再複製了。

被配置成分區的表,每次select * from table1查詢時,是把這個select語句分別在各個節點上執行,而後把數據結合起來返回給客戶端;被配置成複製模式的表,在執行select * from table2時,不管replicate_select=on仍是replicate_select=off,他都會只返回一份正確的數據,並非把全部數據節點上的數據合併返回給客戶端,這就是二者的區別。不知道我說的明白否。你們之後配置成功之後,各類方式都試驗一下就知道了,看看日誌裏的內容就全都明白了。(前面安裝pg的步驟裏,我已經把日誌配置成能夠記錄常規內容了)。

 

那麼若是我就是要建立一個既不是分區配置,又不是複製配置的普通的表,會是什麼樣的結果呢? 根據我配置的環境,我測試了一下。這樣的表仍然可建立成功,能夠正常插入數據。

做成後在每一個數據節點都有這個表,每一個數據節點也都有一份完整的數據。但當其它正確配置的表和這個錶鏈接時(好比在多表查詢的時候),就會出現各類各樣的狀況了。根據popool.conf裏面其它一些參數配置的不一樣,會有不一樣的結果,有時還會報錯。

 

因此一句話,此模式下,一個表只能被複制或被分發。

 

很少說的,具體配置以下:

vi /usr/local/etc/pgpool.conf

parallel_mode = true

replication_mode = false

load_balance_mode = true

##配置系統數據庫

# - System DB info -

 

system_db_hostname  = '10.18.27.181'

                                   # (change requires restart)

system_db_port = 5432

                                   # (change requires restart)

system_db_dbname = 'pgpool'

                                   # (change requires restart)

system_db_schema = 'pgpool_catalog'

                                   # (change requires restart)

system_db_user = 'pgpool'

                                   # (change requires restart)

system_db_password = ''

                                   # (change requires restart)

======================================================================

 

如今,咱們必須創建一個叫作「pgpool」的用戶,並創建一個屬主爲「pgpool」的名爲「pgpool」的數據庫。

$ createuser -p 5432 pgpool

$ createdb -p 5432 -O pgpool pgpool

 

咱們必須在「pgpool」數據庫中安裝 dblinkdblink 是包含在 PostgreSQL 源碼包 contrib 目錄中包含的一個工具。

cd postgresql-9.0.4/contrib/dblink

make

make install

su – postgres

psql -f /usr/local/pgsql/share/contrib/dblink.sql pgpool

 

定義 dist_def (也就是定義表分區規則)

在數據庫「pgpool」中定義一個「dist_def」表,用於保存分區規則。在 pgpool-II 安裝後,你會獲得一個 system_db.sql,它是一個可用於生成系統數據庫的psql 腳本。dist_def 表被創建到 pgpool_catalog 這個 schema 中。

psql -f /usr/local/share/system_db.sql -p 5432 -U pgpool pgpool

 

「dist_def的定義以下,且表名不能被改變。

CREATE TABLE pgpool_catalog.dist_def (

    dbname text, -- database name

    schema_name text, -- schema name

    table_name text, -- table name

    col_name text NOT NULL CHECK (col_name = ANY (col_list)), -- distribution key-column

    col_list text[] NOT NULL, -- list of column names

    type_list text[] NOT NULL, -- list of column types

    dist_def_func text NOT NULL, -- distribution function name

    PRIMARY KEY (dbname, schema_name, table_name)

);

 

如今我有一個表,須要進行數據分發

create table paolo(id1 integer,id2 integer);

 

那麼咱們先要在pgpool_catalog.dist_def表裏插入以下的記錄。pgpool數據庫執行以下SQL

insert into pgpool_catalog.dist_def values('testdb','public','paolo','id1',ARRAY['id1','id2'],ARRAY['integer','integer'],'pgpool_catalog.dist_def_paolo');

 

緊接着建立上面SQL裏指定的名稱爲pgpool_catalog.dist_def_paoloFUNCTION

CREATE OR REPLACE FUNCTION pgpool_catalog.dist_def_paolo(anyelement)

RETURNS integer AS $$

    SELECT CASE WHEN $1 > 0 AND $1 <= 10 THEN 0

        WHEN $1 > 10 AND $1 <= 20 THEN 1

        WHEN $1 > 20 AND $1 <= 30 THEN 2

        ELSE 3

    END;

$$ LANGUAGE sql;

這樣就能夠了。

 

此時我若是插入幾條數據,就會按照FUNCTION裏定義的規則把數據分發到0-3這四個數據節點裏。咱們能夠到每一個數據節點鏈接DB,並進行查詢以檢驗數據分發是否生效。

 

接下來,咱們在前面重點說過,一個表只能被複制或被分發。那麼咱們來配置須要複製的表。

pgpool_catalog.replicate_def表是同pgpool_catalog.dist_def一塊兒建立的。咱們只須要在這個表裏插入要被複制的表的信息就能夠了,這個比較簡單。

CREATE TABLE pgpool_catalog.replicate_def (

    dbname text, -- database name

    schema_name text, -- schema name

    table_name text, -- table name

    col_list text[] NOT NULL, -- list of column names

    type_list text[] NOT NULL, -- list of column types

    PRIMARY KEY (dbname, schema_name, table_name)

);

 

假設建立表

create table cdtbl0000(codevalue integer, codename varchar(20));

 

那麼在pgpool_catalog.replicate_def添加以下記錄:

into pgpool_catalog.replicate_def values('testdb','public','cdtbl0000',ARRAY['codevalue','codename'],ARRAY['integer','varchar(20)']);

 

以上關於Pgpool-II實現Postgresql數據發佈式存儲的配置。這樣就算是完成了,要是咱們還想知道什麼具體他的運行狀況,就得本身搭建好環境後,把本身的疑問都在這套系統裏試驗一遍,就基本都明白了。

>>>>>>>>>>>>>>>>>>>>3.配置pgpoolII10.18.27.181<<<<<<<<<<<<<<<<<<<<<<

 

 

>>>>>>>>>>>>>>>>> 4.配置各數據節點的Streaming Replication<<<<<<<<<<<<<<<<<

這個配置其實就是pg 9以上版本的普通配置,網上有一些文章是介紹這個的。

各數據節點的Streaming Replicationpgpool-II的數據分區沒有什麼實質關係,我這樣配置只是應客戶的要求,用來實現單個節點故障的狀況下,能夠切換到這個數據節點對應的slave上,以保證集羣系統正常運行。

我之前寫過關於Streaming Replication配置的文章,照作就能夠配置成功。

http://wenku.baidu.com/view/f422ee3443323968011c92df.html

http://blog.chinaunix.net/uid-20368611-id-3048109.html

>>>>>>>>>>>>>>>>> 4.配置各數據節點的Streaming Replication<<<<<<<<<<<<<<<<<

用戶手冊

http://pgpool.projects.pgfoundry.org/pgpool-II/doc/pgpool-zh_cn.html 

相關文章
相關標籤/搜索