我有一个带有多AZ的Postgres 9.4RDS实例,还有一个奴隶,只读副本。
到目前为止,负载平衡是在我的应用程序的业务层进行的,但是效率很低,我希望使用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)如果我将其设置为以流复制(以建议在邮政邮件列表中的形式)在主/从模式下工作,则会得到:
psql: ERROR: MD5 authentication is unsupported
in replication and master-slave modes.
HINT: check pg_hba.conf是的,好吧,pg_hba.conf,如果在RDS的话,我不能改变它。
有没有人让PGPool在RDS工作?还有其他工具可以作为中间件来利用RDS中读取副本的优势吗?
发布于 2017-03-24 21:48:51
有一个pgShard应该可以与标准的Amazon实例一起工作。不过它也有渔获物。如果使用开源版本,您将有一个单一的失败点。它的协调节点是不重复的。
你可以得到一个完全HA无缝失效版本的它,但你必须购买企业许可证,但它是疯狂的昂贵。它很容易使你每年花费50,000到100,000美元或更多。
而且,他们现在真的在推出他们的云版本,而这一版本的成本甚至更高。
我还听说有人使用HAProxy在Postgres或MySql节点之间进行平衡。
发布于 2018-10-16 08:08:47
我能够让它工作--这里是我的工作配置文件:
您必须使用md5身份验证,并将用户名/密码从数据库同步到pool_passwd文件。还需要enable_pool_hba、load_balance_mode和master_slave_mode on。
pgpool.conf
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 = onpool_hba.conf
local all all md5
host all all 127.0.0.1/32 md5pool_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;请注意主副本的插入使用了ip_address,下一个选择使用了只读副本的ip_address。
我可以在更多的测试之后更新,但是psql客户端测试看起来很有希望。
https://stackoverflow.com/questions/40424206
复制相似问题