src/sql/session/ObSQLSessionMgr实现思路.md
ObSQLSessionMgr是Observer中用来管理Session的模块,其功能主要分为两块:ObSQLSessionInfo内存的管理和sessid的管理。
ObSQLSessionMgr负责并发情况下ObSQLSessionInfo的创建、获取和销毁。
ObSQLSessionMgr负责为每一个连接分配session id,并保证sessid的全局唯一;其次,在observer同obproxy共同部署时,ObSQLSessionMgr需要满足ObProxy Saved Login的需求。
对于client、ObProxy、ObServer之间有一个约定:如果在client连接ObProxy以后,在连接不断开的情况下,ObProxy与ObServer的所有连接均采用相同的sessid。例如:在ObProxy客户端部署的情况下,ObProxy第一次连接ObServer_1,ObServer_1为其分配sessid_1;此后ObProxy在连接其他ObServer时,均采用sessid_1进行登录。
为了实现 saved_login的,observer采用了switch_sessid的机制;在处理connect请求时,Observer如果发现是proxy的请求,则将当前分配的sessid转换为proxy请求包里面的sessid;该sessid就作为当前连接的唯一标识。
ObSQLSessionMgr采用ObConcurrentHashMapDoNotUseWithHazardValue<Key, Value *> 并发数据结构来管理ObSQLSessionInfo的创建、查询和销毁。ObSQLSessionMgr主要提供create_session/get_session/rever_session/free_session接口。
对于session id有如下三个基本概念:sessid, sessid_seq, session_key.
sessid是session的唯一标识符,为了兼容mysql采用uint32_t表示;同时为了满足sessid的集群全局唯一,32位采用如下方式进行划分:
observer采用16位递增id表示当前server分配的sessid_seq。分配策略如下:
为了解决ObServer在接收客户端断连接请求后,未能及时释放sessid的问题,引入了session_key的概念;