如何从OceanBase数据库服务器端获取连接租户的应用服务器列表?

想要通过连接租户的应用服务器区分应用系统,方便处置会话。

SYS 租户的 __all_virtual_processlist 有 user_client_ip

gv$sql_audit也是可以得

详细说明见
https://www.oceanbase.com/docs/community-observer-cn-10000000000450847

另外可以
通过 SHOW PROXYSESSION 语句可以查看 ODP 上所有租户连接的全部 Client Session 的内部状态。
https://www.oceanbase.com/docs/community-observer-cn-10000000000097169

不是从ODP上看,是想从observer上查看,例如某台observer服务器挂了,想知道影响到了哪些应用服务器(且这些应用服务器是通过F5访问ODP的)。

这个问题的答案有点复杂。需要了解一下 ODP的连接原理、OB的高可用原理。

  1. 如果是想对连接租户的应用服务器分类管理,可以从链路设计上就做规划。比如说新建多个 ODP(或叫obproxy)。这些 ODP可以分布在不同的应用服务器(可以是虚拟机)IP不同,或者是同一个IP但是端口不同(默认是2883),然后约定不同的obproxy给不同的应用使用应用类别多且规模很大的时候适合这个。这样出问题的时候能排查和控制(故障降级)比较容易。 如果使用了F5,可以为这些不同的obproxy 配置不同的F5前端VIP 进一步区分,也是一个分类管理的方法。在每个obproxy上可以查看对应的应用服务器IP。当然,在一个具体的observer上也可以查看有哪些obproxy有连接过来。
  2. 如果只想用一个 ODP,那区分不同应用服务器的方法就是上面说的在ODP里查看。这里查看的是应用到ODP的连接,是应用主动发起的连接,也叫ODP的前端连接。在ODP里可以处置不同应用的会话连接。
  3. 在一个具体的observer上可以看ODP转发过来的应用连接,由于应用数据在OB集群里有三副本,这只表示这个observer上有或曾经有数据主副本存在。 如果是想知道这个observer故障后哪些应用服务器会受影响,看这个连接是判断不了。因为如果正在访问的数据的主副本不在这个observer上,或者应用的数据主副本在这个observer上但并不是正在访问(读写)的,这个observer故障了也不会给应用带来影响。应用跟ODP的连接还是存活的(除非是后端连接正在执行事务中断了,此时ODP也会断开相应的前端连接),只不过是ODP跟后端observer节点少了一个老的无效后端连接,而新增或复用到另外一个observer的后端连接(应用主副本在这个observer上)。这个故障切换很快,几秒到十几秒。
  4. 如果目的是想事后追查observer到底影响了哪些应用(定故障)。根据故障时间和故障observer ip、租户信息查看 gv$sql_audit 里执行报错的sql 是一个可行的简单方法(ret_code<0)。可以拿到绝大部分受影响的应用信息。其他更严谨的方法就是查看故障observer的日志、ODP的日志以及应用服务器的日志。这个会比较吃力。
1 个赞

你这要求是事后追查了,SHOW PROXYSESSION,show processliat,F5这些都是实时的啊。可能就gv$sql_audit时候能查,但是这个目前只有内存态,根据内存设置存储,时间久了也会被淘汰。

1 个赞

感谢,受益匪浅。