postgres主從流復制
postgres在9.0之后引入了主從的流復制機制,所謂流復制,就是從庫通過tcp流從主庫中同步相應的數據。postgres的主從看過一個視頻,大概效率為3w多事務qps。
postgres的主從主稱之為primary,從稱為stand_by。主從配置需要注意的一個是主從的postgres的版本,環境,等最好都需要一致,否則可能產生奇奇怪怪的問題。
postgres的主配置
主是10.12.12.10這台機器
首先需要配置一個賬號進行主從同步。
修改pg_hba.conf,增加replica用戶,進行同步。
host    replication     replica     10.12.12.12/32                 md5
 
        這樣,就設置了replica這個用戶可以從10.12.12.12 對應的網段進行流復制請求。
給postgres設置密碼,登錄和備份權限。
postgres# CREATE ROLE replica login replication encrypted password 'replica'
 
        修改postgresql.conf,注意設置下下面幾個地方:
wal_level = hot_standby  # 這個是設置主為wal的主機
max_wal_senders = 32 # 這個設置了可以最多有幾個流復制連接,差不多有幾個從,就設置幾個
wal_keep_segments = 256 # 設置流復制保留的最多的xlog數目
wal_sender_timeout = 60s # 設置流復制主機發送數據的超時時間
max_connections = 100 # 這個設置要注意下,從庫的max_connections必須要大於主庫的
 
        重啟主
pg_ctl restart
postgres的從配置
從是10.12.12.12這台機器
創建的目錄為 /data/pgsql/data2
pg_basebackup -F p --progress -D /data/pgsql/data2 -h 10.12.12.10 -p 5432 -U replica --password
 
         
         
        這里使用了pg_basebackup這個命令,/data/pgsql/data2這個目錄是空的
成功之后,就可以看到這個目錄中現有的文件都是一樣的了。
進入到/data/pgsql/data2目錄,復制recovery.conf,這個文件可以從pg的安裝目錄的share文件夾中獲取,比如
cp /usr/local/postgres94/share/recovery.conf.sample /data/pgsql/data2/recovery.conf
 
        修改recovery.conf,只要修改幾個地方就行了
standby_mode = on  # 這個說明這台機器為從庫
primary_conninfo = 'host=10.12.12.10 port=5432 user=replica password=replica'  # 這個說明這台機器對應主庫的信息
recovery_target_timeline = 'latest' # 這個說明這個流復制同步到最新的數據
 
        postgresql.conf中也有幾個地方要進行修改
max_connections = 1000 # 一般查多於寫的應用從庫的最大連接數要比較大
hot_standby = on  # 說明這台機器不僅僅是用於數據歸檔,也用於數據查詢
max_standby_streaming_delay = 30s # 數據流備份的最大延遲時間
wal_receiver_status_interval = 1s  # 多久向主報告一次從的狀態,當然從每次數據復制都會向主報告狀態,這里只是設置最長的間隔時間
hot_standby_feedback = on # 如果有錯誤的數據復制,是否向主進行反饋
 
        好了,現在啟動從庫
確認主庫和從庫都配置好了
查看進程,主庫所在的機器中會看到sender進程
8467 postgres  20   0  255m 2396 1492 S  0.0  0.1   0:00.66 postgres: wal sender process replica 
 
        從庫所在的機器中會看到receiver進程
8466 postgres  20   0  298m 1968 1096 S  0.0  0.1   0:06.88 postgres: wal receiver process   streaming 3/CF118C18
 
        查看復制狀態
主庫中執行:
postgres=# select * from pg_stat_replication;
-[ RECORD 1 ]----+------------------------------
pid              | 8467       # sender的進程
usesysid         | 44673      # 復制的用戶id
usename          | replica    # 復制的用戶用戶名
application_name | walreceiver  
client_addr      | 10.12.12.12 # 復制的客戶端地址
client_hostname  |
client_port      | 55804  # 復制的客戶端端口
backend_start    | 2015-05-12 07:31:16.972157+08  # 這個主從搭建的時間
backend_xmin     |
state            | streaming  # 同步狀態 startup: 連接中、catchup: 同步中、streaming: 同步
sent_location    | 3/CF123560 # Master傳送WAL的位置
write_location   | 3/CF123560 # Slave接收WAL的位置
flush_location   | 3/CF123560 # Slave同步到磁盤的WAL位置
replay_location  | 3/CF123560 # Slave同步到數據庫的WAL位置
sync_priority    | 0  #同步Replication的優先度
                      0: 異步、1~?: 同步(數字越小優先度越高)
sync_state       | async  # 有三個值,async: 異步、sync: 同步、potential: 雖然現在是異步模式,但是有可能升級到同步模式
 
        同步復制
看到上面的sync_state的狀態有同步和異步的區別。
我們之前的概念都是異步備份,就是一個事務完成了之后,直接返回程序,然后紀錄日志,由復制進程重放日志進行數據復制。同步備份的概念,就是一個事務只有當完成了數據復制之后,才返回到程序中。當然同步的性能一定會比異步的性能差一個量級。
