0

OB运维 | 连接 kill 中的 session_id

 6 months ago
source link: https://blog.51cto.com/u_15077536/9981943
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

作者:姚嵩


通过 obproxy 连接 OB 后,发现:

kill 命令使⽤ show processlist 中的 ID 能执⾏成功,

使⽤ information_schema.processlist

或者 oceanbase.__all_virtual_processlist 中的ID进⾏kill是失败的。

于是就进⾏了各种连接测试,解惑两个问题:

  1. kill中session_id的来源;
  2. 是否可以⼀次性⼲掉⼀个租户的所有连接;

测试说明:

session_id 是 kill 语句的参数,session_id和下⽂中的ID是同⼀对象;

视图information_schema.processlist的数据来源于表oceanbase.__all_virtual_processlist 。

登陆命令说明(以本⼈测试的环境为例):

登陆observer:

mysql -uroot@sys -p -P2881 -h ${oberver_ip} -c -A oceanbase

登陆obproxy:

mysql -uroot@sys#yjn_test -p -P2883 -h ${obproxy_ip} -c -A oceanbase

登陆某个observer的节点:

确认observer上

show processlist

表information_schema.processlist

表oceanbase.__all_virtual_processlist

获取的ID是否相同?

执⾏语句:

show processlist ;
select * from information_schema.processlist ;
select id,user,host,db,command,time,state,info from oceanbase.__all_virtual_processlist ;

3个语句获得的ID是相同的,可以通过上⾯3种⽅式获取session_id ;

登陆某个obproxy节点:

确认obproxy上

show processlist

表information_schema.processlist

表oceanbase.__all_virtual_processlist

获取的ID是否相同?

执⾏语句:

show processlist ;
select * from information_schema.processlist ;
select id,user,host,db,command,time,state,info from oceanbase.__all_virtual_processlist ;

information_schema.processlist 和 oceanbase.__all_virtual_processlist 中的ID⼀致;

show processlist 中的记录和上⾯2表的ID不⼀致,执⾏kill语句的时候,采⽤的是show processlist中的ID。

通过observer和通过obproxy登陆看到的 oceanbase.__all_virtual_processlist 的数据是⼀致的;

登陆集群内不同observer的节点:

确认⽤户登陆⼀个observer是否能看到登陆其他observer的session信息?

通过不同observer登陆查看session信息(super权限⽤户登陆):

OB运维 | 连接 kill 中的 session_id_数据
OB运维 | 连接 kill 中的 session_id_session_id_02

在⼀个observer上可以看到其他observer的登陆信息;

登陆不同的obproxy(他们连接相同的OB):

确认⽤户登陆⼀个obproxy是否能看到登陆其他obproxy的session信息?

执⾏语句:

show processlist ;

通过不同obproxy登陆查看session信息:

OB运维 | 连接 kill 中的 session_id_客户端_03
OB运维 | 连接 kill 中的 session_id_session_id_04

在⼀个obproxy上通过show processlist语句不能看到其他obproxy的session信息;

测试总结:

1.视图 information_schema.processlist 的数据来源于 表oceanbase.__all_virtual_processlist;

命令 “show create table information_schema.processlist \G” 可以确认。

2.表oceanbase.__all_virtual_processlist 中记录的是所有到OB的连接信息;

客户可能直连observer,也可能是通过obproxy连接OB,所有连接信息都会记录到表中;

3.show processlist查看的是客户端连接到软件的信息,所以当通过obproxy连接OB时,show processlist展示的是连接到obproxy的信息,⽽不是连接到OB的信息;

当直连obsever时,show processlist展示的是连接OB的信息;

4.obproxy相当于observer的客户端,所以连接不同的obproxy,执⾏show processlist看到的连接信息是不同的,它们是相互独⽴的;

kill中session_id的来源?

OB中的kill命令是为了⼲掉⼀个session或者⼲掉这个session对应的SQL语句。

为了这个⽬的,可以⼲掉前侧连接(指来源于客户端的连接),或者⼲掉后侧连接(连接到后侧的连接)。

通过 show processlist 查看前侧连接,即查看客户端到软件(例如: obproxy)的连接ID;

也可以直连observer,通过oceanbase.__all_virtual_processlist查看后侧连接。

在执⾏kill命令时,可以通过任意⽅式连接OB,并通过show processlist获取连接ID;

也可以通过直连后侧的observer,通过oceanbase.__all_virtual_processlist表获取连接ID;

是否可以⼀次性⼲掉⼀个租户的所有连接;

因为前侧连接通过show processlist只能查看当前客户端到软件的连接信息,查不到其他前侧的连接信息。例如:客户通过多个obproxy连接OB,如果我们连接其中⼀个obproxy执⾏show processlist获取的连接是不全的。

我们可以直连observer,并执⾏以下SQL,得到⼲掉租户 tenant_ys 的所有连接的命令:

select concat('kill ',id,';') from oceanbase.__all_virtual_processlist where tenant='tenant_ys' ;

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK