其實整個安裝和配置過程比較簡單,官方網站有比較好的文檔,在此只是根據前幾天的實際部署整理一下。(實際執行的命令都用紅色標出) html
服務器: node
10.18.27.181 pgpool服務器 --------此服務器上須要安裝pgpool和pg 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-II(10.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-II(10.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.配置pgpoolII(10.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」數據庫中安裝 dblink。dblink 是包含在 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_paolo的FUNCTION:
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.配置pgpoolII(10.18.27.181)<<<<<<<<<<<<<<<<<<<<<<
>>>>>>>>>>>>>>>>> 4.配置各數據節點的Streaming Replication<<<<<<<<<<<<<<<<<
這個配置其實就是pg 9以上版本的普通配置,網上有一些文章是介紹這個的。
各數據節點的Streaming Replication與pgpool-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