簡體   English   中英

無法將 PGPool 與 Amazon RDS Postgres 一起使用

[英]Can't use PGPool with Amazon RDS Postgres

我有一個帶有多可用區的 Postgres 9.4 RDS 實例,還有一個從屬只讀副本。

到目前為止,負載平衡是在我的應用程序的業務層中進行的,但效率低下,我希望使用 PGPool,因此應用程序與單個 Postgres 連接進行交互。

事實證明,使用 PGPool 一直很痛苦。 如果我將它設置為負載均衡器,簡單的 SELECT 查詢會拋出如下錯誤:

 SQLSTATE[HY000]: General error: 7 
 message contents do not agree with length in message type "N" 
 server sent data ("D" message) 
 without prior row description ("T" message)

如果我將它設置為具有流復制的主/從模式(如Postgres 郵件列表中建議),我會得到:

psql: ERROR:  MD5 authentication is unsupported 
in replication and master-slave modes.
HINT:  check pg_hba.conf

是的,好吧,pg_hba.conf 如果不在 RDS 中,所以我無法更改它。

有沒有人讓 PGPool 在 RDS 中工作? 是否有其他工具可以充當中間件來利用 RDS 中的只讀副本?

我能夠讓它在這里工作是我的工作配置文件:

您必須使用 md5 身份驗證,並將用戶名/密碼從數據庫同步到 pool_passwd 文件。 還需要啟用 enable_pool_hba、load_balance_mode 和 master_slave_mode。

配置文件

listen_addresses = '*'
port = 9999
pcp_listen_addresses = '*'
pcp_port = 9898
pcp_socket_dir = '/tmp'
listen_backlog_multiplier = 1
backend_hostname0 = 'master-rds-database-with-multi-AZ.us-west-2.rds.amazonaws.com'
backend_port0 = 5432
backend_weight0 = 0
backend_flag0 = 'ALWAYS_MASTER'
backend_hostname1 = 'readonly-replica.us-west-2.rds.amazonaws.com'
backend_port1 = 5432
backend_weight1 = 999
backend_flag1 = 'ALWAYS_MASTER'
enable_pool_hba = on
pool_passwd = 'pool_passwd'
ssl = on
num_init_children = 1
max_pool = 2
connection_cache = off
replication_mode = off
load_balance_mode = on
master_slave_mode = on

pool_hba.conf

local   all         all                               md5
host    all         all         127.0.0.1/32          md5

pool_passwd

username:md5d51c9a7e9353746a6020f9602d452929

要更新 pool_password,您可以使用pg_md5

echo username:md5`echo -n usernamepassword | md5sum`
username:md5d51c9a7e9353746a6020f9602d452929 -

運行示例的輸出:

psql --dbname=database --host=localhost --username=username --port=9999

database=> SHOW POOL_NODES;

 node_id |                        hostname                 | port | status | lb_weight |  role   | select_cnt | load_balance_node | replication_delay
---------+-------------------------------------------------+------+--------+-----------+---------+------------+-------------------+-------------------
 0       | master-rds-database.us-west-2.rds.amazonaws.com | 8193 | up     | 0.000000  | primary | 0          | false             | 0
 1       | readonly-replica.us-west-2.rds.amazonaws.com    | 8193 | up     | 1.000000  | standby | 0          | true              | 0

database=> select now();

 node_id |                        hostname                 | port | status | lb_weight |  role   | select_cnt | load_balance_node | replication_delay
---------+-------------------------------------------------+------+--------+-----------+---------+------------+-------------------+-------------------
 0       | master-rds-database.us-west-2.rds.amazonaws.com | 8193 | up     | 0.000000  | primary | 0          | false             | 0
 1       | readonly-replica.us-west-2.rds.amazonaws.com    | 8193 | up     | 1.000000  | standby | 1          | true              | 1

database=> CREATE TABLE IF NOT EXISTS tmp_test_read_write ( data varchar(40) );
CREATE TABLE
database=> INSERT INTO tmp_test_read_write (data) VALUES (concat('',inet_server_addr()));
INSERT 0 1
database=> select data as master_ip,inet_server_addr() as replica_ip from tmp_test_read_write;
  master_ip   |  replica_ip
--------------+---------------
 172.31.37.69 | 172.31.20.121
(1 row)

您還可以從日志 id 中看到兩個數據庫:

2018-10-16 07:56:37: pid 124528: LOG:  DB node id: 0 backend pid: 21731 statement: CREATE TABLE IF NOT EXISTS tmp_test_read_write ( data varchar(40) );
2018-10-16 07:56:47: pid 124528: LOG:  DB node id: 0 backend pid: 21731 statement: INSERT INTO tmp_test_read_write (data) VALUES (concat('',inet_server_addr()));
2018-10-16 07:56:52: pid 124528: LOG:  DB node id: 1 backend pid: 24890 statement: select data as master_ip,inet_server_addr() as replica_ip from tmp_test_read_write;

注意 insert 使用了 master 的 ip_address,下一個 select 使用了只讀副本的 ip_address。

我可以在更多測試后更新,但 psql 客戶端測試看起來很有希望。

有應該與標准 Amazon RDS 實例一起使用的 Citus(pgShard)。 雖然它有捕獲。 如果您使用開源版本,則會出現單點故障。 它的協調器節點不重復。

您可以獲得它的完全 HA 無縫故障轉移版本,但您必須購買企業許可證,但它非常昂貴。 它很容易讓您每年花費 50,000 到 100,000 美元或更多。

此外,他們現在真的在推動他們的雲版本,這甚至更加昂貴。

https://www.citusdata.com/

我還聽說有人使用 HAProxy 在 Postgres 或 MySql 節點之間進行平衡。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM