Node中获取 ip 地址和端口号

该博客主要围绕在Node中获取IP地址和端口号展开,虽未给出具体内容,但核心聚焦于这一信息技术操作。

在这里插入图片描述

<think>我们正在讨论的是PostgreSQL数据库。用户的问题是如何查询集群的IP地址端口号。注意,PostgreSQL集群(通常称为数据库集群)是指由单个PostgreSQL服务器实例管理的一组数据库。在PostgreSQL中,一个集群通常运行在一个主机上,监听一个或多个IP地址端口。 根据引用[1],我们知道PostgreSQL默认监听5432端口,但可以通过配置修改。同时,引用[2]提到Kong集群节点使用IP地址(而不是主机名)进行通信,这提示我们在PostgreSQL集群中,我们通常也是通过IP端口来配置连接。 在PostgreSQL中,集群的IP地址端口配置在`postgresql.conf`文件中,并且可以通过SQL查询当前活动的连接信息,但直接查询集群的IP端口并没有一个系统视图直接提供。不过,我们可以通过以下方法获取: 1. 查询当前数据库实例监听的地址端口: PostgreSQL提供了`pg_settings`系统视图,我们可以从中获取`listen_addresses``port`配置参数。 2. 通过操作系统工具查看:例如,在Linux上,我们可以使用`netstat`或`ss`命令查看PostgreSQL进程监听的地址端口。 但是,用户要求用SQL查询。因此,我们只能查询到配置的监听地址端口,而不是实际绑定的所有地址(因为`listen_addresses`可能设置为`*`,表示监听所有地址)。另外,端口是确定的。 步骤: 1. 查询监听的IP地址(注意:这里返回的是配置的地址,可能是一个列表,也可能是一个通配符): ```sql SELECT setting AS listen_addresses FROM pg_settings WHERE name = 'listen_addresses'; ``` 如果返回`*`,表示监听所有可用IP地址。 2. 查询监听的端口: ```sql SELECT setting AS port FROM pg_settings WHERE name = 'port'; ``` 3. 如果要知道具体的连接信息(比如当前客户端连接过来的地址端口),可以使用: ```sql SELECT inet_server_addr() AS server_ip, inet_server_port() AS server_port; ``` 但是这个函数返回的是当前连接所使用服务器端的IP端口(对于当前会话)。注意,如果服务器有多个IP,那么每个连接可能显示不同的IP。 4. 另外,我们也可以通过`pg_stat_activity`视图查看所有活动连接的服务器端地址端口(注意:每个连接可能绑定到不同的地址,但通常一个实例监听一个端口,所以端口是一样的): ```sql SELECT DISTINCT inet_server_addr() AS server_ip, inet_server_port() AS server_port FROM pg_stat_activity; ``` 但是,这个查询可能不会返回所有监听的IP,因为可能没有连接使用某些IP。 然而,如果用户想要知道的是集群中其他节点的IP端口(在流复制或高可用集群中),那就不一样了。在那种情况下,我们需要查询复制相关的配置视图。例如,在流复制中,从节点需要知道主节点的IP端口。但这是配置在恢复配置文件(recovery.conf)或主节点的配置中的,不能通过SQL直接查询。不过,如果是逻辑复制,则可以通过查询订阅来获取。 根据问题,用户可能只是想知道当前PostgreSQL实例(集群)监听的IP端口,所以我们主要提供上述12的查询。 另外,如果用户配置了多个端口(通过不同的实例运行在同一台机器上),那么每个实例都有自己的配置,查询会返回各自配置的端口。 总结步骤: 1. 查询当前实例监听的IP地址(配置值): ```sql SELECT setting AS listen_addresses FROM pg_settings WHERE name = 'listen_addresses'; ``` 2. 查询当前实例监听的端口: ```sql SELECT setting AS port FROM pg_settings WHERE name = 'port'; ``` 3. 如果用户想查看当前会话所连接的服务器IP端口,可以使用: ```sql SELECT inet_server_addr() AS server_ip, inet_server_port() AS server_port; ``` 4. 如果想查看所有活动连接中使用的服务器IP端口(通常端口都一样,IP可能有多个): ```sql SELECT DISTINCT inet_server_addr() AS server_ip, inet_server_port() AS server_port FROM pg_stat_activity; ``` 注意:`inet_server_addr()``inet_server_port()`函数返回的是当前会话的服务器地址端口。在`pg_stat_activity`中,我们可以对每个会话调用,但要注意,这些函数在`pg_stat_activity`的上下文中执行时,会返回该条活动连接对应的服务器地址端口。 但是,在`pg_stat_activity`中并没有直接存储服务器IP端口的列,所以我们需要使用函数来获取。不过,我们可以这样查询: ```sql SELECT DISTINCT inet_server_addr() AS server_ip, inet_server_port() AS server_port FROM pg_stat_activity WHERE inet_server_addr() IS NOT NULL; ``` 但是,请注意,`pg_stat_activity`中的每一行代表一个连接,而`inet_server_addr()`函数在同一个会话中调用总是返回相同的值(即当前连接的服务器地址)。所以,如果我们想获取所有活动连接中出现的服务器地址(可能多个,如果服务器有多个IP),那么我们可以用这个查询。但通常,一个实例的端口是固定的,所以端口应该都是一样的。 另外,如果服务器配置了多个IP,并且有连接通过不同的IP连进来,那么`inet_server_addr()`就会返回不同的IP。但是,注意,这个函数返回的是该连接所绑定的服务器地址,而不是客户端地址。 但是,用户的问题可能是:如何知道这个集群(实例)在哪些IP端口上监听?这个信息在配置文件中,通过查询`pg_settings`我们只能得到配置的值(比如`listen_addresses`可能是`'*'`或具体的IP列表,端口是一个数字)。所以,我们无法通过SQL获得实际的绑定到哪些具体IP(当配置为`'*'`时),这时可能需要结合操作系统命令。 因此,我们给出两种方法:通过SQL查询配置,以及通过操作系统命令查看实际监听的地址端口。 由于用户要求用SQL,所以我们提供配置查询。另外,我们也可以给出一个通过系统视图`pg_stat_activity`来推断的方法:因为如果有连接,那么连接中使用的服务器地址端口就是实例监听的地址端口。但是,如果没有连接,就查不到。 所以,我们建议: 1. 查询配置(推荐): - 监听地址:`SELECT setting FROM pg_settings WHERE name='listen_addresses';` - 端口:`SELECT setting FROM pg_settings WHERE name='port';` 2. 查询当前活动连接使用的服务器地址端口(需要存在连接): ```sql SELECT DISTINCT inet_server_addr() AS server_ip, inet_server_port() AS server_port FROM pg_stat_activity WHERE inet_server_addr() IS NOT NULL; ``` 3. 另外,如果用户有权限,可以查询复制槽(如果是复制集群)或者逻辑复制订阅,但这不是通用的。 最后,注意:在PostgreSQL中,一个集群(实例)通常只监听一个端口,但是可以监听多个IP地址(由`listen_addresses`指定,可以是多个IP,用逗号分隔,也可以是`'*'`表示所有IP)。所以,端口只有一个,而IP地址可能有多个。 因此,我们给出如下回答: 在PostgreSQL中,查询集群(即当前数据库实例)监听的IP地址端口号的方法如下: ### 1. 查询配置的监听地址端口 PostgreSQL 在 `postgresql.conf` 文件中配置了 `listen_addresses` `port` 参数。通过以下 SQL 查询: ```sql -- 查询监听地址(可能返回多个地址或通配符) SELECT setting AS listen_addresses FROM pg_settings WHERE name = 'listen_addresses'; -- 查询监听端口 SELECT setting AS port FROM pg_settings WHERE name = 'port'; ``` 注意:`listen_addresses` 常用值: - `localhost` 或 `127.0.0.1`:仅本地连接 - `*` 或 `0.0.0.0`:监听所有网络接口 - 逗号分隔的 IP 地址列表:如 `192.168.1.100,10.0.0.1` ### 2. 通过活动连接反推监听信息(需要存在连接) 若已有客户端连接,可通过活动会话查询实际使用的服务器地址端口: ```sql SELECT DISTINCT inet_server_addr() AS server_ip, inet_server_port() AS server_port FROM pg_stat_activity WHERE inet_server_addr() IS NOT NULL; ``` 此方法返回当前活动的连接所使用的服务器 IP 端口(通常端口固定,IP 可能有多个)[^1]。 ### 3. 操作系统命令辅助 在数据库服务器上执行以下命令查看实际监听端口: ```bash # Linux sudo netstat -tulnp | grep postgres # 或使用 ss 命令 sudo ss -tulnp | grep postgres ``` 输出示例: ``` tcp 0 0 0.0.0.0:5432 0.0.0.0:* LISTEN 12345/postgres ``` 其中 `0.0.0.0:5432` 表示在所有 IPv4 地址上监听 5432 端口。 --- ### 注意事项 - **集群概念差异**:PostgreSQL 的“集群”指单个服务器实例管理的数据库集合,而非多节点集群(如 Oracle RAC)。多节点部署需借助流复制、逻辑复制或第三方工具(如 Patroni)实现[^2]。 - **动态生效**:修改 `listen_addresses` 需重启 PostgreSQL 服务,而 `port` 修改也必须重启生效。 §§相关问题§§ 1. 如何修改 PostgreSQL 的监听地址端口? 2. PostgreSQL 流复制中如何查看主从节点的连接信息? 3. 为什么 `pg_stat_activity` 中某些连接的 `inet_server_addr()` 返回空值? : 指定postgres侦听客户端连接的 TCP/IP 端口或本地 Unix domain socket 文件的扩展... [^2]: 除了指向同一个数据库之外,每个Kong节点都必须加入同一个集群... </think> 在 PostgreSQL 中查询集群的 IP 地址端口号,可以通过以下方法实现: --- ### 1. **查询当前数据库实例的监听地址端口** #### 方法 1:通过系统视图 `pg_settings`(推荐) ```sql -- 查询监听地址 SELECT setting AS listen_addresses FROM pg_settings WHERE name = 'listen_addresses'; -- 查询监听端口 SELECT setting AS port FROM pg_settings WHERE name = 'port'; ``` - **说明**: - `listen_addresses` 返回实例监听的 IP 地址(`*` 表示所有可用地址) - `port` 返回实例监听的端口号(默认 `5432`) - **示例输出**: ``` listen_addresses | port ------------------|------ * | 5432 ``` #### 方法 2:通过当前会话函数 ```sql SELECT inet_server_addr() AS server_ip, -- 服务器IP inet_server_port() AS server_port; -- 服务器端口 ``` - **说明**:返回**当前会话**连接的服务器 IP 端口。 --- ### 2. **查询活动连接的集群节点信息** ```sql SELECT DISTINCT inet_server_addr() AS node_ip, inet_server_port() AS node_port FROM pg_stat_activity WHERE inet_server_addr() IS NOT NULL; ``` - **说明**: - 返回所有活动连接中使用的服务器 IP 端口 - 适用于多节点集群环境(如流复制集群) - **注意**:需存在活动连接才能返回结果 --- ### 3. **操作系统级验证** 在数据库服务器执行命令查看实际监听情况: ```bash # Linux 系统 sudo ss -tulnp | grep postgres # 输出示例 tcp LISTEN 0 128 0.0.0.0:5432 0.0.0.0:* users:(("postgres",pid=123,fd=3)) ``` - **说明**:`0.0.0.0:5432` 表示在所有 IPv4 地址监听 5432 端口 --- ### 关键注意事项 1. **集群概念差异**: - PostgreSQL 集群指**单个服务器实例管理的数据库集合**(通过 `initdb` 创建) - 多节点高可用集群需通过流复制或工具(如 Patroni)实现 2. **动态生效要求**: - 修改 `listen_addresses` 或 `port` 需重启 PostgreSQL 生效 - 示例配置(`postgresql.conf`): ```ini listen_addresses = '*' # 监听所有 IP port = 5433 # 自定义端口 ``` 3. **连接问题排查**: - 若返回 `0.0.0.0`,表示允许所有 IP 连接 - 若返回 `127.0.0.1`,仅允许本地连接 --- ### 查询逻辑复制节点信息(扩展) 如果是流复制集群,查询主从节点信息: ```sql -- 主节点查询复制连接 SELECT client_addr AS replica_ip, client_port AS replica_port FROM pg_stat_replication; -- 从节点查询主节点信息 SELECT conninfo FROM pg_stat_wal_receiver; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值