• pg_bouncer在使用中的坑勿踩


    目录

    简介

    环境信息

    问题配置

    问题配置

    启动pgbouncer

    链接逻辑图

     测试存在问题

    pgadmin4

    Idea

    JAVA调用

    ​编辑

    dbeaver

    建议:


    简介

            前面文章说过关于pg_bouncer的安装讲解,这里讲一下在使用中的坑,在进行配置的时候需要注意。

    环境信息

    问题配置

    ip伪库名实库名用户配置
    主:10.0.0.103readywritepostgrespostgrespostgresql-15.3+pgbouncer
    从:10.0.0.102readyonlypostgrespostgrespostgresql-15.3

            当伪库名和实库名不一致的时候会在pgadmin4工具等对数据库读写,会出现not fund database的问题。目前dbeaver使用比较多,如果使用的是dbeaver并不会出现问题。可能对于问题发现不够及时。

    问题配置

    在pgouncer的配置如下:

    1. [databases]
    2. readyonly = host=10.0.0.102 port=25432 dbname=postgres
    3. readywrite = host=10.0.0.103 port=5432 dbname=postgres
    4. [pgbouncer]
    5. listen_addr=*
    6. auth_type=md5
    7. auth_file=/home/postgres/pgbouncer/share/doc/pgbouncer/userlist.txt
    8. logfile=/home/postgres/pgbouncer/pgbouncer1.log
    9. pidfile=/home/postgres/pgbouncer/pgbouncer1.pid
    10. unix_socket_dir = /tmp
    11. max_client_conn=1000
    12. default_pool_size=50
    13. ignore_startup_parameters = extra_float_digits

    在[databases]项目下配置格式为

    <伪库名><数据库地址><端口><实际库名>·······<用户名:使用默认用户postgres>

    增加

    [pgbouncer]
    ignore_startup_parameters = extra_float_digits

    避免出现:[08P01] FATAL: unsupported startup parameter: extra_float_digits.  的情况

    根据以上配置

    启动pgbouncer

    使用命令ps -ef |grep pgbouncer   可以看到启动命令进程

    链接逻辑图

    当请求端口发送链接请求来的时候并不会直接连到数据库中去而是链接到pgbuncer中去,有pgbouncer再发送链接请求到对应的数据库中

     测试存在问题

    pgadmin4

    使用pgadmin4 可以链接但是却无法使用

    导致报错

    connection to server at "10.0.0.103", port 6432 failed: FATAL: no such database: postgres 

    Idea

    测试链接成功,但是仍然会提示错误信息,但是仍然是可读可写的

    JAVA调用

    使用Java代码依然是可读可写

    1. package com.database;
    2. import java.sql.Connection;
    3. import java.sql.DriverManager;
    4. import java.sql.PreparedStatement;
    5. import java.sql.ResultSet;
    6. import java.sql.SQLException;
    7. public class pgtext {
    8. public static void main(String[] args) {
    9. String url = "jdbc:postgresql://10.0.0.103:6432/readywrite?serverTimezone=Asia/Shanghai&useTimezone=true";
    10. try {
    11. // 建立数据库连接
    12. Connection connection = DriverManager.getConnection(url, "postgres", "postgres");
    13. // 创建表 t1
    14. String createTableSql = "CREATE TABLE t1 (id SERIAL PRIMARY KEY, data VARCHAR(255))";
    15. PreparedStatement createTableStatement = connection.prepareStatement(createTableSql);
    16. createTableStatement.executeUpdate();
    17. createTableStatement.close();
    18. // 插入数据
    19. String insertDataSql = "INSERT INTO t1 (data) VALUES (?)";
    20. PreparedStatement insertDataStatement = connection.prepareStatement(insertDataSql);
    21. insertDataStatement.setString(1, "Hello, World!");
    22. insertDataStatement.executeUpdate();
    23. insertDataStatement.close();
    24. // 查询并打印数据
    25. String selectDataSql = "SELECT data FROM t1";
    26. PreparedStatement selectDataStatement = connection.prepareStatement(selectDataSql);
    27. ResultSet resultSet = selectDataStatement.executeQuery();
    28. while (resultSet.next()) {
    29. System.out.println(resultSet.getString("data"));
    30. }
    31. resultSet.close();
    32. selectDataStatement.close();
    33. // 关闭连接
    34. connection.close();
    35. } catch (SQLException e) {
    36. e.printStackTrace();
    37. }
    38. }
    39. }

    dbeaver

    使用dbeaver链接均可实现读写功能,

    总结:本文只是测试java的调用,pgadmin4的链接,idea和dbeaver的链接。

    在idea中使用会提示[08P01] FATAL: no such database: postgres.

    在pgadmin4中,测试可以通过,但是却无法使用的情况

    java调用中读写均正常。

    建议:

            在使用pgbouncer实现读写分离管理的情况可以配置不同的用户名  使用对读写库和只读的区别链接,尽可能保持<伪库名>和<实际库名>保持一致。

  • 相关阅读:
    容器管理中关于CGroup的那些事
    浮点数二分查找的实现
    笔试题之使用select实现TCP小型并发服务器
    js 实现删除数组指定元素
    机器学习/人工智能的笔试面试题目——SVM算法相关问题总结
    线程安全与实现方法
    【安卓学习之常见问题】gradle依赖冲突
    对boot项目拆分成cloud项目的笔记
    SpringBoot SpringBoot 开发实用篇 6 监控 6.7 自定义端点
    Mybatis 设计
  • 原文地址:https://blog.csdn.net/weixin_73350116/article/details/134370394