標籤:
一、 簡介:
PG在9.*版本後熱備提供了新的一個功能,那就是Stream Replication的讀寫分離,是PG高可用性的一個典型應用。這個功能在oracle中叫active dataguard,在PostgreSQL中稱為hot standby。
二、系統內容
系統平台:CentOS 6.2 PostgreSQL版本:9.5.0 master : 183.60.192.238 slave : 183.60.192.229 三
、搭建步驟 資料庫搭建參考地址http://www.cnblogs.com/lottu/p/5149191.html 註:slave庫可不需要init資料庫;
- 建立流複製使用者repuser
CREATE USER repuser replication LOGIN CONNECTION LIMIT 3 ENCRYPTED PASSWORD ‘li0924‘;# replication 做流複製的時候用到的一個使用者屬性,一般單獨設定。# LOGIN 使用者登入的屬性;CREATE USER預設內建;所以LOGIN關鍵字可以略去。
2. 在master資料庫的/data/pgdata/postgresql.conf檔案中設定如下配置項:
wal_level = hot_standbymax_wal_senders = 1wal_keep_segments = 32# max_wal_senders 是slave庫的節點數,有多少個slave庫就設多少,# wal_keep_segments 預設值是16,是PG_XLOG下的記錄檔數相關參數
3.在主要資料庫中的/var/lib/pgsql/data/pg_hba.conf中添加如下配置:
host replication repuser 183.60.192.229/16 md5# 第二項必須填 replication;
4.重新啟動主要資料庫,讓配置生效:
pg_stop;pg_start
5.採用熱備份的方式;把master資料庫的PGDATA目錄下面的檔案傳到slave庫中.同時把建立的資料檔案夾也傳過去;
這個步驟就是一個資料庫複製的工作。
1.在slave資料庫的/data/pgdata/postgresql.conf檔案中設定如下配置項:
hot_standby = on
2.在PGDATA目錄下;也就這裡的/data/pgdata;建立檔案recovery.conf
standby_mode = ‘on‘primary_conninfo = ‘host=183.60.192.238 port=5432 user=repuser password=li0924‘trigger_file = ‘/data/pgdata/trigger_standby‘
3.刪除原先從master庫上過來的/data/pgdata/postmaster.pid檔案,
rm /data/pgdata/postmaster.pid
4.根據master庫中的環境變數檔案;修改slave庫的postgres使用者的環境變數 然後啟動備庫:
pg_start
四、
驗證工作
master庫
[[email protected]_210 ~]$ ps -ef | grep postgreroot 2021 556 0 15:18 pts/1 00:00:00 su - postgrespostgres 2022 2021 0 15:18 pts/1 00:00:00 -bashpostgres 2239 1 0 15:24 pts/1 00:00:00 /opt/pgsql95/bin/postgrespostgres 2249 2239 0 15:24 ? 00:00:00 postgres: checkpointer process postgres 2250 2239 0 15:24 ? 00:00:00 postgres: writer process postgres 2251 2239 0 15:24 ? 00:00:00 postgres: wal writer process postgres 2252 2239 0 15:24 ? 00:00:00 postgres: autovacuum launcher process postgres 2253 2239 0 15:24 ? 00:00:00 postgres: archiver process last was 00000006000000000000001E.00000028.backuppostgres 2254 2239 0 15:24 ? 00:00:00 postgres: stats collector process postgres 3235 2239 0 15:54 ? 00:00:00 postgres: wal sender process repuser 183.60.192.229(40399) streaming 0/1F000D80
slave庫
[[email protected]_222 pgdata]$ ps -ef | grep postgrespostgres 6856 1 0 15:54 pts/0 00:00:00 /opt/pgsql/bin/postgrespostgres 6863 6856 0 15:54 ? 00:00:00 postgres: startup process recovering 00000006000000000000001Fpostgres 6864 6856 0 15:54 ? 00:00:00 postgres: checkpointer process postgres 6865 6856 0 15:54 ? 00:00:00 postgres: writer process postgres 6866 6856 0 15:54 ? 00:00:00 postgres: wal receiver process streaming 0/1F000CA0postgres 6867 6856 0 15:54 ? 00:00:00 postgres: stats collector process root 6922 30527 0 16:08 pts/0 00:00:00 su - postgrespostgres 6923 6922 0 16:08 pts/0 00:00:00 -bashpostgres 6974 6923 0 16:49 pts/0 00:00:00 ps -efpostgres 6975 6923 0 16:49 pts/0 00:00:00 grep postgres
在master庫操作
[[email protected]_210 ~]$ psql mydb repuserpsql (9.5.0)Type "help" for help.mydb=> \d List of relations Schema | Name | Type | Owner --------+-------+---------------+---------- public | dept | table | lottu public | emp | foreign table | postgres public | test | table | lottu public | trade | table | lottu(4 rows) mydb=> create table t_lottu (id int primary key,name varchar(20));CREATE TABLEmydb=> \d List of relations Schema | Name | Type | Owner --------+---------+---------------+---------- public | dept | table | lottu public | emp | foreign table | postgres public | t_lottu | table | repuser public | test | table | lottu public | trade | table | lottu(5 rows) mydb=> insert into t_lottu values (1001,‘lottu‘);INSERT 0 1mydb=> insert into t_lottu values (1002,‘vincent‘);INSERT 0 1mydb=> insert into t_lottu values (1003,‘rax‘);INSERT 0 1mydb=> select * from t_lottu; id | name ------+--------- 1001 | lottu 1002 | vincent 1003 | rax(3 rows)
登入slave庫查看資料
[[email protected]_222 pgdata]$ psql mydb repuserpsql (9.5.0)Type "help" for help. mydb=> select * from t_lottu; id | name ------+--------- 1001 | lottu 1002 | vincent 1003 | rax(3 rows) mydb=> delete from t_lottu where id = 1003;
ERROR: cannot execute DELETE in a read-only transaction
參考部落格 --http://my.oschina.net/Kenyon/blog/54967
PostgreSQL Hot Standby的搭建