Postgresql流複製+pgpool實現高可用

來源:互聯網
上載者:User

標籤:

pgpool概述

pgpool-II 是一個位於 PostgreSQL 伺服器和 PostgreSQL 資料庫用戶端之間的中介軟體,它提供以下功能:串連池、複製、負載平衡、限制超過限度的串連以及並行查詢。文檔在此。

四種模式

O 意味著“可用”, X 意味著“不可用
(1) 並行查詢模式需要同時開啟複製和負載平衡,但是複製和負載平衡無法用於並行查詢模式中的分布式表。
(
2) 線上恢複可以和流複製同時使用。
(*3) 用戶端僅僅是通過 pgpool-II 串連到 PostgreSQL伺服器。這種模式僅僅用於限制到伺服器的串連數,或者在多台機器上啟用故障恢複。

pgpool在不同模式下,提供不同的功能,本文將選擇在主備模式下,實現故障恢複,即自動failover的功能。

體繫結構

設定檔介紹

pgpool有四個主要的設定檔,分別是

  • pcp.conf 用於管理查、看節點資訊,如加入新節點。該檔案主要是儲存使用者名稱及md5形式的密碼。
  • pgpool.conf 用於設定pgpool的模式,主次資料庫的相關資訊等。
  • pool_hba.conf 用於認證使用者登入方式,如用戶端IP限制等,類似於postgresql的pg_hba.conf檔案。
  • pool_passwd 用於儲存相應用戶端登入帳號名及md5密碼。
拓撲結構

安裝postgresql流複製設定

參考

pgpool安裝設定安裝
sudo apt-get insatll pgpool2
設定pcp.conf
/usr/sbin/pg_md5 password

將得到md5加上使用者名稱以以下方式寫入檔案/etc/pgpool2/pcp.conf中,
pgpool:5f4dcc3b5aa765d61d8327deb882cf99

設定pgpool.conf

確保相關配置項設定如下:

listen_addresses = ‘*‘backend_hostname0 = ‘10.10.10.104‘ #主機ipbackend_port0 = 5432backend_weight0 = 1 #loadbalance不開啟,無效backend_data_directory0 = ‘/var/lib/postgresql/9.5/main‘backend_flag0 = ‘ALLOW_TO_FAILOVER‘backend_hostname1 = ‘10.10.10.102‘ #備機ipbackend_port1 = 5432backend_weight1 = 1backend_data_directory1 = ‘/var/lib/postgresql/9.5/main‘backend_flag1 = ‘ALLOW_TO_FAILOVER‘enable_pool_hba = on pool_passwd = ‘pool_passwd‘master_slave_mode = onmaster_slave_sub_mode = ‘stream‘sr_check_user = ‘replication‘ #流複製帳號sr_check_password = ‘password‘failover_command = ‘/var/lib/postgresql/failover.sh %h %H /var/lib/postgresql/state/recovery_trigger‘ #主機失敗後,touch檔案使得備機從唯讀狀態變成可讀寫狀態
設定pool_hba.conf

設定可以參考postgresql的hba設定,如

# IPv4 local connections:host    all               all           127.0.0.1/32    md5host    all               all           0.0.0.0/0       md5host    replication     replication     0.0.0.0/0       md5
設定pool_passwd

前提:對應的postgresql執行個體中,已經建立相應的帳號。設定pool_passwd的目的是允許該資料庫帳號能夠通過pgpool登入資料庫。
方法一:設定與資料庫帳號同名的系統帳號,然後直接調用pg_md5,該命令會自動產生好pool_passwd檔案。例如我有系統帳號cloud,密碼為cloud

/usr/sbin/pg_md5 -m -u cloud cloud

方法二: 直接存取資料庫,將結果以以下方式放入檔案/etc/pgpool2/pool_passwd中

cloud:md5313e20fe4ca8bf6751ffd3c5b963a9ad

查詢資料庫:

select usename,passwd from pg_shadow;
failover.sh

當主機宕機後,pgpool會將連結轉至standby,所以需要將standby從唯讀狀態修改為可讀寫狀態,即建立一個trigger檔案或者調用promote命令。

#! /bin/sh# Failover command for streaming replication.# This script assumes that DB node 0 is primary, and 1 is standby.# # If standby goes down, do nothing. If primary goes down, create a# trigger file so that standby takes over primary node.## Arguments: $1: failed node id. $2: new master hostname. $3: path to# trigger file.failed_node=$1new_master=$2trigger_file=$3# Do nothing if standby goes down.if [ $failed_node = 1 ]; thenexit 0;fi# Create the trigger file./usr/bin/ssh -T $new_master /bin/touch $trigger_fileexit 0;
配置主機間的互信

主要用途是使得pgpool所在主機能登入postgresql所在主機,建立trigger檔案。
參考命令:

ssh-keygenssh-copy-id [email protected]
測試連接
psql -h10.10.10.105 -p9999 -Ucloudcloud=> show pool_nodes; node_id |   hostname   | port | status | lb_weight |  role   ---------+--------------+------+--------+-----------+--------- 0       | 10.10.10.102 | 5432 | 2      | 0.500000  | primary 1       | 10.10.10.104 | 5432 | 2      | 0.500000  | standby(2 rows)
類比主機宕機

關閉主機的服務。再次串連查看。

server closed the connection unexpectedlyThis probably means the server terminated abnormallybefore or while processing the request.The connection to the server was lost. Attempting reset: Succeeded.cloud=> show pool_nodes; node_id |   hostname   | port | status | lb_weight |  role   ---------+--------------+------+--------+-----------+--------- 0       | 10.10.10.102 | 5432 | 3      | 0.500000  | standby 1       | 10.10.10.104 | 5432 | 2      | 0.500000  | primary(2 rows)

可以發現standby已經升級為主,原來的主機status變成了3。status對應的意義為:

Status 由數字 [0 - 3]來表示。
0 - 該狀態僅僅用於初始化,PCP從不顯示它。
1 - 節點已啟動,還沒有串連。
2 - 節點已啟動,串連被緩衝。
3 - 節點已關閉。
修複及重新加入

原來的主機經過修複,重新提供服務後,可以重新作為新主機的standby加入pgpool。步驟如下:

  • 更新ppgpool.conf, host0改為新主機,host1改為原來新standby。pgpool需要重啟才會生效該選項的修改,所以這裡的修改只是防止pgpool重啟而導致指向錯誤的主機,實際修複不需要重啟pgpool。
  • 重建立立standby,即流複製。
  • 使用pcp命令將修複的standby加入pgpool。
/usr/sbin/pcp_attach_node 10 localhost 9898 pgpool cloud 0psql -h10.10.10.105 -p9999 -Ucloudcloud=> show pool_nodes; node_id |   hostname   | port | status | lb_weight |  role   ---------+--------------+------+--------+-----------+--------- 0       | 10.10.10.102 | 5432 | 2      | 0.500000  | standby 1       | 10.10.10.104 | 5432 | 2      | 0.500000  | primary(2 rows)

這樣在不停機的情況下,完成了修複工作。

 

Postgresql流複製+pgpool實現高可用

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.