java判断postgres数据库集群的master节点

发布时间 2023-07-13 17:15:58作者: wdgde

1.引入依赖

        <!--postgresql-->
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>42.2.2</version>
        </dependency>

 

2.代码实现

    public static boolean isTelnet(String url, int timeout){
        String host=url.substring(0,url.indexOf(":"));
        int port=Integer.parseInt(url.substring(url.indexOf(":")+1));

        Socket socket = new Socket();
        boolean isConnected = false;
        try {
            // 建立连接
            socket.connect(new InetSocketAddress(host, port),timeout);
            // 通过现有方法查看连通状态
            // true为连通
            isConnected = socket.isConnected();
        } catch (IOException e) {
            // 当连不通时,直接抛异常,异常捕获即可
            System.out.println(url+" telnet不通!");
        }finally{
            try {
                socket.close();   // 关闭连接
            } catch (IOException e) {
                System.out.println("关闭连接失败!");
            }
        }
        return isConnected;
    }

    public static void isMaster() throws ClassNotFoundException, SQLException {

        String driver="org.postgresql.Driver";
        String urls="10.10.10.130:5432,10.10.10.131:5432,10.10.10.132:5432";
        String name="admin";
        String pwd="Admin@123456";
        String database= "postgres";

        int timeout=30;

        String[] urlString=urls.split(",");
        for (String url:urlString){
            //先telnet一下看通不通
            if(isTelnet(url,timeout)){
                String jdbcUrl="jdbc:postgresql://"+url+"/"+database;
                Class.forName(driver);
                Connection connection= DriverManager.getConnection(jdbcUrl,name,pwd);

                String localRole = "";
                String dbState = "";
                //关键sql
                String sql = "select local_role, db_state from pg_stat_get_stream_replications();";
                Statement statement = connection.createStatement();
                ResultSet resultSet = statement.executeQuery(sql);
                while (resultSet.next()) {
                    localRole=resultSet.getString("local_role");
                    dbState=resultSet.getString("db_state");
                }

                //判断是否master,获取master的ip
                if(localRole.equalsIgnoreCase("Primary") && dbState.equalsIgnoreCase("Normal")){
                    System.out.println("postgres数据库集群的master节点为:"+url.substring(0,url.indexOf(":")));
                }
            }
        }

    }