1. 程式人生 > >postgres HA 主備環境搭建

postgres HA 主備環境搭建

1. postgres 主備環境搭建

1.1  HA 實現方式

      熱備份、冷備份

     冷備份:物理備份,也就是檔案複製。主機寫完一個WAL日誌檔案後,才複製到standby伺服器上去應用。

     熱備份:流複製,也就是同步複製或非同步複製。主備機實時同步。

1.2 操作步驟

主備機安裝在相同的機器上

(1)主備機PGDATA路徑

primary PGDATA路徑:
[[email protected] data]$ echo $PGDATA
/home/wln/postgres9.3/data

standby PGDATA路徑:

[[email protected]

standby]$ echo $PGDATA
/home/wln/standby

(2)修改primary 的postgresql.conf 檔案

wal_level = hot_standby   //熱備模式
max_wal_senders = 2    //primary 最多允許的併發standby資料庫
wal_keep_segments = 32  //in logfile segments, 16MB each; 0 disables。該xlog日誌會迴圈覆蓋,請將該值設定適當大些(需考慮磁碟空間、資料量增長情況)

logging_collector = on

(3)修改primary的pg_hba.conf

host replication repluser 127.0.0.1/32 trust

資料庫名必須填“replication”, 這是一個為standby連線使用了一個虛擬的資料庫名稱。使用者repluser是給standby連線使用的在主庫上建的一個超級使用者。
127.0.0.1 是standby資料庫的IP地址。

(4)建立一個數據庫超級使用者repluser,用來給standby備機連線主機使用。

[[email protected] data]$ psql -d postgres
psql (9.3beta2)
Type "help" for help.

postgres=# create user repluser superuser password 'password';
CREATE ROLE

(5)重啟primary資料庫

pg_ctl restart

(6)對主資料庫做一個基礎備份
用select pg_start_backup();命令把資料庫切換到備份狀態

[[email protected] data]$ psql -d postgres
psql (9.3beta2)
Type "help" for help.

postgres=# select pg_start_backup('/home/wln/standby');
 pg_start_backup
-----------------
 0/6000024
(1 row)

(不要退出)

(7)新開1個session2,將主機資料目錄copy到備機

[[email protected] ~]$ cp -r postgres9.3/data/* standby/
[[email protected] ~]$ cd standby/

[[email protected] standby]$ ll
總計 104
-rw------- 1 wln wln   205 07-06 04:13 backup_label
drwx------ 5 wln wln  4096 07-06 04:13 base
drwx------ 2 wln wln  4096 07-06 04:13 global
drwx------ 2 wln wln  4096 07-06 04:13 pg_clog
-rw------- 1 wln wln  4461 07-06 04:13 pg_hba.conf
-rw------- 1 wln wln  1636 07-06 04:13 pg_ident.conf
drwx------ 2 wln wln  4096 07-06 04:13 pg_log
drwx------ 4 wln wln  4096 07-06 04:13 pg_multixact
drwx------ 2 wln wln  4096 07-06 04:13 pg_notify
drwx------ 2 wln wln  4096 07-06 04:13 pg_serial
drwx------ 2 wln wln  4096 07-06 04:13 pg_snapshots
drwx------ 2 wln wln  4096 07-06 04:13 pg_stat
drwx------ 2 wln wln  4096 07-06 04:13 pg_stat_tmp
drwx------ 2 wln wln  4096 07-06 04:13 pg_subtrans
drwx------ 2 wln wln  4096 07-06 04:13 pg_tblspc
drwx------ 2 wln wln  4096 07-06 04:13 pg_twophase
-rw------- 1 wln wln     4 07-06 04:13 PG_VERSION
drwx------ 3 wln wln  4096 07-06 04:13 pg_xlog
-rw------- 1 wln wln 20312 07-06 04:13 postgresql.conf
-rw------- 1 wln wln    43 07-06 04:13 postmaster.opts
-rw------- 1 wln wln    83 07-06 04:13 postmaster.pid

(8)copy完成,結束主機備份狀態

postgres=# select pg_stop_backup();
NOTICE:  WAL archiving is not enabled; you must ensure that all required WAL segments are copied through other means to complete the backup
 pg_stop_backup
----------------
 0/60000DC
(1 row)

(9)在session2上操作

修改備機postgresql.conf檔案

port=5433

hot_standby=on

將share/recovery.conf.sample  複製到standby目錄下,並修改如下:

standby_mode = 'on'
primary_conninfo = 'host=127.0.0.1 port=5432 user=repluser password=password'
trigger_file = '/home/wln/standby/trigger_activestb'

刪除standby目錄下的postmaster.pid檔案,執行

[[email protected] standby]$export PGDATA=/home/wln/standby

[[email protected] standby]$ echo $PGDATA
/home/wln/standby

(10)啟動備機

在session2操作

pg_ctl start

檢查有沒有正常啟動pg_ctl status

若正常啟動,pg_log下日誌:

LOG:  database system was shut down at 2014-07-06 03:55:40 CST
LOG:  database system is ready to accept connections
LOG:  autovacuum launcher started
LOG:  database system was interrupted; last known up at 2014-07-06 04:13:09 CST
LOG:  entering standby mode
LOG:  redo starts at 0/6000024
LOG:  record with zero length at 0/60000B8
LOG:  started streaming WAL from primary at 0/6000000 on timeline 1
LOG:  consistent recovery state reached at 0/60000DC

(11)主機上執行一些操作,檢視備機有沒有同步過來

主機上:

postgres=# \d
No relations found.
postgres=# create table t1(id int);
CREATE TABLE
postgres=# insert into t1 select generate_series(1,10);
INSERT 0 10

postgres=# select pg_current_xlog_location();
 pg_current_xlog_location 
--------------------------
 0/7034470
(1 row)

postgres=# select * from pg_stat_replication ;
-[ RECORD 1 ]----+------------------------------
pid              | 10183
usesysid         | 24715
usename          | repl
application_name | walreceiver
client_addr      | 127.0.0.1
client_hostname  | 
client_port      | 41560
backend_start    | 2014-07-06 04:15:45.185796+08
state            | streaming
sent_location    | 0/7034470
write_location   | 0/7034470
flush_location   | 0/7034470
replay_location  | 0/7034470
sync_priority    | 0
sync_state       | async

備機上:

postgres=# \d
       List of relations
 Schema | Name | Type  | Owner
--------+------+-------+-------
 public | t1   | table | wln
(1 row)

postgres=# select * from t1;
 id
----
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
(10 rows)

postgres=# select pg_last_xlog_receive_location();
 pg_last_xlog_receive_location 
-------------------------------
 0/7034470
(1 row)

postgres=# select * from pg_stat_replication ;
(No rows)
postgres=# create table  t2(id int);
ERROR:  cannot execute CREATE TABLE in a read-only transaction

(12)一些引數設定

synchronous_standby_names = '*' # standby servers that provide sync rep
                                # comma-separated list of application_name
                                # from standby(s); '*' = all

(預設為‘’)

synchronous_commit = on                # synchronization level;
                                        # off, local, remote_write, or on

Commits made when synchronous_commit is set to on or remote_write will wait until the synchronous standby responds. The response may never occur if the last, or only, standby should crash.

The best solution for avoiding data loss is to ensure you don't lose your last remaining synchronous standby. This can be achieved by naming multiple potential synchronous standbys using synchronous_standby_names. The first named standby will be used as the synchronous standby. Standbys listed after this will take over the role of synchronous standby if the first one should fail.


3. 主備切換(方式1)

主備不會自動切換,需藉助第三方軟體,如heartbeat等,請自行搜尋。

(1)如何檢視是primary還是standby

方法1:檢視程序

主機 sender

[[email protected] data]$ ps -ef | grep wal
wln      10421 10416  0 07:52 ?        00:00:00 postgres: wal writer process             
wln      10691 10416  0 08:04 ?        00:00:00 postgres: wal sender process repluser 127.0.0.1(59226) streaming 0/6011BAC
wln      10702  8927  0 08:05 pts/2    00:00:00 grep wal

備機 receiver

[[email protected] data]$ ps -ef | grep wal
wln      10421 10416  0 07:52 ?        00:00:00 postgres: wal writer process             
wln      10690 10685  3 08:04 ?        00:00:03 postgres: wal receiver process   streaming 0/6011BAC
wln      10702  8927  0 08:05 pts/2    00:00:00 grep wal

方法2:

主機:

[[email protected] data]$ pg_controldata | grep Database
Database system identifier:           6032728846531166188
Database cluster state:               in production
Database block size:                  8192

 備機:

[[email protected] standby]$ pg_controldata | grep Database
Database system identifier:           6032728846531166188
Database cluster state:               in archive recovery
Database block size:                  8192

(2)備機切換為主機

將主機停掉

[[email protected] data]$ pg_ctl stop
waiting for server to shut down.... done
server stopped

在備機PGDATA對應目錄下生成recovery.conf檔案中指定的檔案trigger_file = '/home/wln/standby/trigger_activestb'  (此時備機正常執行狀態)

touch  /home/wln/standby/trigger_activestb

會看到 recovery.conf 檔案變為 recovery.done

檢視原來備機日誌:

LOG:  trigger file found: /home/wln/standby/trigger_activestb
LOG:  redo done at 0/6011C40
LOG:  last completed transaction was at log time 2014-07-06 08:05:40.152147+08
LOG:  selected new timeline ID: 2
LOG:  archive recovery complete
LOG:  database system is ready to accept connections
LOG:  autovacuum launcher started

登入原來的備機

[[email protected] standby]$ psql -d postgres -p 5433
psql (9.3beta2)
Type "help" for help.

postgres=# show transaction_read_only;
 transaction_read_only
-----------------------
 off
(1 row)

可以看出現在原備機具有讀寫功能。即主備切換成功

postgres=# \d
       List of relations
 Schema | Name | Type  | Owner
--------+------+-------+-------
 public | t1   | table | wln
(1 row)

postgres=# create table t2(id int);
CREATE TABLE

4、主備切換(方式2)

備機中recovery.conf中設定為:

standby_mode = on

recovery_target_timeline = 'latest'

primary_conninfo = 'host=localhost port=5433 user=repluser password=password'    

#trigger_file = '/home/wln/standby/trigger_activestb'  #這個註釋掉

 備機升為主機方式為:pg_ctl promote -D standbyPath

會看到recovery.conf過幾秒後變為recovery.done 表示升級為主機成功。

其他的請參考方式1中內容。

 5. 簡單指令碼

#master
mDATA=/home/$USER/pg94/data
port=5432
wal_level=hot_standby
max_wal_senders=2
wal_keep_segments=5
logging_collector=on
log_line_prefix='%d %p %t %c %i %e '
#standby
sDATA=/home/$USER/pg94/standby
mkdir $sDATA
chmod 700 $sDATA
sport=5433
shot_standby=on

pg_ctl stop -m i
pg_ctl stop -D $sDATA -m i
rm -rf $sDATA/*

#step
sed -i /port\ =/c\port\ =\ $port                                        $mDATA/postgresql.conf
sed -i /wal_level\ =/c\wal_level\ =\ $wal_level                         $mDATA/postgresql.conf
sed -i /max_wal_senders\ =/c\max_wal_senders\ =\ $max_wal_senders       $mDATA/postgresql.conf
sed -i /wal_keep_segments\ =/c\wal_keep_segments\ =\ $wal_keep_segments $mDATA/postgresql.conf
sed -i /logging_collector\ =/c\logging_collector\ =\ $logging_collector $mDATA/postgresql.conf
sed -i /log_line_prefix\ =/c\log_line_prefix\ =\ "'$log_line_prefix'"   $mDATA/postgresql.conf
sed -i 's/#host/host/'  $mDATA/pg_hba.conf

#restart master
pg_ctl restart
psql -c "alter user $USER password '123456'"
psql -c "select pg_start_backup('label');"
#copy data
cp -r $mDATA/* $sDATA
psql -c "select pg_stop_backup();"

#modify standby port
sed -i /port\ =/c\port\ =\ $sport                       $sDATA/postgresql.conf
sed -i /hot_standby\ =/c\hot_standby\ =\ $shot_standby   $sDATA/postgresql.conf
rm -rf $sDATA/postmaster.pid
#recovery.conf
cp $PGHOME/share/recovery.conf.sample  $sDATA/recovery.conf
sed -i /standby_mode/c\standby_mode=on $sDATA/recovery.conf
sed -i /primary_conninfo\ =/c\primary_conninfo="'host=127.0.0.1 port=5432 user=$USER password=123456'"   $sDATA/recovery.conf
sed -i /trigger_file/c\trigger_file="'$sDATA/trigger'" $sDATA/recovery.conf


pg_ctl start -D $sDATA



參考

相關推薦

postgres HA 環境搭建

1. postgres 主備環境搭建 1.1  HA 實現方式       熱備份、冷備份      冷備份:物理備份,也就是檔案複製。主機寫完一個WAL日誌檔案後,才複製到standby伺服器上去應用。      熱備份:流複製,也就是同步複製或非同步複製。主備機實時同步

Linux下PostgreSQL環境搭建和切換

1. 概念 資料庫熱備:資料庫熱備是指為主資料庫的建立、維護和監控一個或多個備用資料庫,它們時刻處於開機狀態,同主機保持同步。當主機失靈時,可以隨時啟用熱備資料庫來代替,以保護資料不受故障、災難、錯誤和崩潰的影響。 流複製(streaming replication):PostgreSQL提

mysql環境搭建

#主機配置: service mysqld stop #配置my.cnf: vim /etc/my.cnf log-bin=mysql-bin-master #啟用二進位制日誌 server-id = 1 #本機資料庫ID 標示 binlog-do-db=sdg

HA路由模式的原理

gfw 重新 進行 負載 不響應 相同 過程 響應 同時 HA是High Availability縮寫,即高可用性 ,可防止網絡中由於單個防火墻的設備故障或網絡故障導致網絡中斷,保證網絡服務的連續性和安全強度。目前,ha功能已經是防火墻內一個重要組成部分。

飛塔防火墻HA模式配置步驟

飛塔防火墻 ha 主備模式配置 fortinetHA主備A-P模式配置方法一、HA網絡拓撲結構註意:進行HA 的配置, 硬件和軟件版本需滿足如下要求:① 防火墻硬件型號相同;② 同型號硬件需要為相同的硬件版本,內存容量,CPU 型號,硬盤容量等相同;③ 相同的軟件版本版本;④ 設備的所有接口不能工作在 DHC

keepalive基礎知識及模型搭建

其中 devel ring ice inux 文件中 實現 unit emd lvs模型屬於單點故障,對real server的健康狀態檢查可以通過寫腳本實現,keepalived可以實現高可用:keepalive:vrrp協議在Linux主機上以守護進程方式的實現; 能夠

HBase HA完全分散式環境搭建

一 叢集部署架構介紹 Master節點一主一備,跟HadoopNameNode 保持一致,即HBase Master也把主從節點放在NameNode主從同一臺機器 RegionServer放在每一個對

igh-ethercat環境搭建記錄

個人遇到的問題及解決辦法:1.本次的工作之前基本上都沒接觸過——編譯核心、安裝模組、ethercat主站等,所以一開始是在vmware中搭建環境的,選用的是ubuntu14.04.5-LTS發行版,在安裝kernel-package(提示要安裝1700多兆的依賴)後總會遇到不

mysql複製搭建

這裡我使用單臺伺服器上的兩個mysql例項進行搭建,主要用到了mysql自帶的mysqld_multi 一、複製原理 開始搭建前有個mysql複製原理的基礎知識需要補充: mysql進行主備複製使用到了三個執行緒: 1.主庫上的轉儲存執行緒:     會將mysql se

測試hadoop2.x HA切換遇到的問題和解決辦法 [

手動kill 主namenode後,備用namenode沒有主動從standby切換到active!!!解決辦法:在備用namenode上檢視 Hadoop-grid-zkfc-server102.log日誌,發現異常如下2016-10-16 00:09:32,465 WAR

PostgreSQL使用pg_basebackup搭建流複製環境

今天用pg_basebackup搭建了主備流複製環境,操作流程很簡單,可線上操作,相當方便。 環境均為CentOS6.6 + postgresql9.4,我用已安裝的庫做測試,埠不一致,不影響環境搭建,但要注意某些相關配置: 主:192.168.3.201 port:543

openstack controller ha測試環境搭建記錄(十四)——配置cinder(存儲節點)

nbsp 設置 ntp reason script snap rate 文件 esc 先簡述cinder存儲節點的配置: 1、IP地址是10.0.0.41; 2、主機名被設置為block1; 3、所有節點的hosts文件已添加相應條目; 4、已經配置了ntp時間同

openstack controller ha測試環境搭建記錄(十一)——配置neutron(網絡節點)

efault delete none _for set ext ranges tar edr 在網絡節點配置內核參數:vi /etc/sysctl.confnet.ipv4.ip_forward=1net.ipv4.conf.all.rp_filter=0net.ipv4.

Hadoop HA + HBase環境搭建(二)————HBase環境搭建

property hadoop zookeeper conf ado 文件 ice mes root HBase配置(只需要做一處修改)   修改HBase的 hbase-site.xml 配置文件種的一項  <property>

mysql+mycat搭建穩定高可用集群,負載均衡,復制,讀寫分離

root用戶 架構 .bat 出現 內存 ace 權威指南 上層 復制 主要思路 測試環境 實現mysql主備復制 配置A主mysql 配置B備mysql 驗證同步配置結果 驗證是否同步 關閉B備mysql的同步,驗證讀寫分離

雲效(阿裏雲)流水線 + nginx + uWsgi + flask + python3 基礎環境搭建 --

3.6 分享圖片 fff urn art conf con write sqlite 一、開發環境搭建 1、安裝python3 yum -y groupinstall "Development tools" yum -y install zlib-devel

圖文:Linux-DNS服務器搭建(高可用)

重啟 slave 配置文件 服務器 image http img -a 建立 DNS主服務器(master):192.168.127.147從服務器(slave):192.168.127.1481、首先在master和slave上安裝DNS包: 2、編輯master上的D

Linux實戰第九篇:基於Centos6.9+7.4DNS服務器搭建實戰

服務器搭建 word uda notes centos6 fcc bfc data 閱讀 個人筆記分享(在線閱讀): http://note.youdao.com/noteshare?id=7898fa39596740bfcc9ca42ad643f045&sub=28A00

centos7 搭建雙網卡bond1(模式)實例

sum 模式 address ethernet mas link back 14. ip配置 前景須知: 在redhat6 中網卡叫bond,在redhat7及centos7中改名team,此處只記錄centos7中雙網卡主備搭建過程。 應用情景:實現網絡的高可用,防止一條

Hadoop的HA環境搭建

resource 執行 事務隔離級別 hdf dfa def rop proxy 不可重復讀 一、集群的規劃 Zookeeper集群:192.168.176.131 (bigdata112)192.168.176.132 (bigdata113)192.168.176.13